summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG1306
-rw-r--r--LICENSE340
-rw-r--r--README37
-rw-r--r--README.fr37
-rw-r--r--bin/gcstar358
-rwxr-xr-xinstall788
-rw-r--r--lib/gcstar/GCBackend/GCBackendXmlCommon.pm305
-rw-r--r--lib/gcstar/GCBackend/GCBackendXmlParser.pm491
-rw-r--r--lib/gcstar/GCBookmarks.pm729
-rw-r--r--lib/gcstar/GCBorrowings.pm662
-rw-r--r--lib/gcstar/GCCommandLine.pm395
-rw-r--r--lib/gcstar/GCData.pm970
-rw-r--r--lib/gcstar/GCDialogs.pm1519
-rw-r--r--lib/gcstar/GCDisplay.pm1146
-rw-r--r--lib/gcstar/GCExport.pm118
-rw-r--r--lib/gcstar/GCExport/GCExportBase.pm362
-rw-r--r--lib/gcstar/GCExport/GCExportCSV.pm198
-rw-r--r--lib/gcstar/GCExport/GCExportExternal.pm182
-rw-r--r--lib/gcstar/GCExport/GCExportHTML.pm592
-rw-r--r--lib/gcstar/GCExport/GCExportLatex.pm204
-rw-r--r--lib/gcstar/GCExport/GCExportPDB.pm295
-rw-r--r--lib/gcstar/GCExport/GCExportSQL.pm172
-rw-r--r--lib/gcstar/GCExport/GCExportTarGz.pm174
-rw-r--r--lib/gcstar/GCExport/GCExportTellico.pm512
-rw-r--r--lib/gcstar/GCExport/GCExportXML.pm287
-rw-r--r--lib/gcstar/GCExportImport.pm526
-rw-r--r--lib/gcstar/GCExtract.pm150
-rw-r--r--lib/gcstar/GCExtract/GCExtractFilms.pm476
-rw-r--r--lib/gcstar/GCExtract/GCExtractMusics.pm370
-rw-r--r--lib/gcstar/GCGenres.pm404
-rw-r--r--lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm4023
-rw-r--r--lib/gcstar/GCGraphicComponents/GCDoubleLists.pm564
-rw-r--r--lib/gcstar/GCImport.pm139
-rw-r--r--lib/gcstar/GCImport/GCImportAMC.pm234
-rw-r--r--lib/gcstar/GCImport/GCImportAlexandria.pm205
-rw-r--r--lib/gcstar/GCImport/GCImportBase.pm217
-rw-r--r--lib/gcstar/GCImport/GCImportCSV.pm313
-rw-r--r--lib/gcstar/GCImport/GCImportDVDProfiler.pm192
-rw-r--r--lib/gcstar/GCImport/GCImportFolder.pm510
-rw-r--r--lib/gcstar/GCImport/GCImportGCfilms.pm190
-rw-r--r--lib/gcstar/GCImport/GCImportGCstar.pm106
-rw-r--r--lib/gcstar/GCImport/GCImportList.pm202
-rw-r--r--lib/gcstar/GCImport/GCImportMyMovies.pm211
-rw-r--r--lib/gcstar/GCImport/GCImportScanner.pm394
-rw-r--r--lib/gcstar/GCImport/GCImportTarGz.pm152
-rw-r--r--lib/gcstar/GCImport/GCImportTellico.pm496
-rw-r--r--lib/gcstar/GCItemsLists/GCImageListComponents.pm848
-rw-r--r--lib/gcstar/GCItemsLists/GCImageLists.pm2028
-rw-r--r--lib/gcstar/GCItemsLists/GCListOptions.pm496
-rw-r--r--lib/gcstar/GCItemsLists/GCTextLists.pm2101
-rw-r--r--lib/gcstar/GCLang.pm274
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm52
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm76
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm53
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm49
-rw-r--r--lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm53
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm51
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm55
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm49
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportList.pm54
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm49
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCfilms.pm104
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCgames.pm92
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCmusics.pm78
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/AR/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/AR/GCstar.pm692
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm43
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/BG/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/BG/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm43
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm45
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCgames.pm83
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/CA/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/CA/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCbooks.pm73
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCcoins.pm107
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCfilms.pm96
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCgames.pm85
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCmusics.pm71
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/CS/GCModels/GCwines.pm68
-rw-r--r--lib/gcstar/GCLang/CS/GCstar.pm672
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm50
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm53
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm87
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCbooks.pm71
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCcoins.pm108
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCcomics.pm74
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCfilms.pm94
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCminicars.pm179
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCmusics.pm69
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm56
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm82
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/DE/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/DE/GCstar.pm686
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm67
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm45
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/EL/GCModels/GCwines.pm84
-rw-r--r--lib/gcstar/GCLang/EL/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm71
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm51
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm89
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCbooks.pm73
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCcoins.pm107
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCcomics.pm76
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCfilms.pm96
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCgames.pm85
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm44
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCmusics.pm71
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCstamps.pm192
-rw-r--r--lib/gcstar/GCLang/EN/GCModels/GCwines.pm68
-rw-r--r--lib/gcstar/GCLang/EN/GCstar.pm715
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm65
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm69
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm103
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCbooks.pm88
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCcoins.pm126
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCcomics.pm90
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCfilms.pm112
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCgames.pm99
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm59
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCminicars.pm195
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCmusics.pm85
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm70
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCstamps.pm206
-rw-r--r--lib/gcstar/GCLang/ES/GCModels/GCwines.pm82
-rw-r--r--lib/gcstar/GCLang/ES/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm60
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm60
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm94
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCbooks.pm78
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCcoins.pm112
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCcomics.pm81
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCfilms.pm101
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCgames.pm92
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm50
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCminicars.pm190
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCmusics.pm76
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm60
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCstamps.pm198
-rw-r--r--lib/gcstar/GCLang/FR/GCModels/GCwines.pm72
-rw-r--r--lib/gcstar/GCLang/FR/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/GCLangUtils.pm56
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/GL/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/GL/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/HU/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/HU/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCbooks.pm69
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCgames.pm81
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCmusics.pm67
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/ID/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/ID/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm47
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm71
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm47
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm44
-rw-r--r--lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm48
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm46
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm49
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm44
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportList.pm49
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm44
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm48
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm52
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCbooks.pm77
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCcoins.pm110
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCfilms.pm99
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCgames.pm89
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCmusics.pm75
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/IT/GCModels/GCwines.pm73
-rw-r--r--lib/gcstar/GCLang/IT/GCstar.pm678
-rw-r--r--lib/gcstar/GCLang/IT/README.txt9
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/NL/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/NL/GCstar.pm671
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm51
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm55
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm89
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCbooks.pm73
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCcoins.pm107
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCfilms.pm96
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCgames.pm85
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCmusics.pm72
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm86
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/PL/GCModels/GCwines.pm87
-rw-r--r--lib/gcstar/GCLang/PL/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCfilms.pm92
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/PT/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/PT/GCstar.pm673
-rw-r--r--lib/gcstar/GCLang/README42
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCcoins.pm101
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/RO/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/RO/GCstar.pm672
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCcoins.pm101
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCfilms.pm92
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/RU/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/RU/GCstar.pm672
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/SR/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/SR/GCstar.pm669
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm45
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm49
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/SV/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/SV/GCstar.pm670
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCbooks.pm68
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCcoins.pm101
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCfilms.pm91
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCgames.pm80
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/TR/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/TR/GCstar.pm677
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm68
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCbooks.pm69
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCcoins.pm102
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCfilms.pm92
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCgames.pm81
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm42
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCmusics.pm66
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm52
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCstamps.pm189
-rw-r--r--lib/gcstar/GCLang/UK/GCModels/GCwines.pm63
-rw-r--r--lib/gcstar/GCLang/UK/GCstar.pm674
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm70
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm44
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm192
-rw-r--r--lib/gcstar/GCLang/ZH/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/ZH/GCstar.pm654
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm40
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm38
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm64
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm38
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm40
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm37
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm41
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm39
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm42
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm70
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm37
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm42
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm50
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm37
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm46
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm50
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm86
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm70
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm104
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm73
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm93
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm82
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm44
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm182
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm68
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm55
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm108
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm84
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm192
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm65
-rw-r--r--lib/gcstar/GCLang/ZH_CN/GCstar.pm653
-rw-r--r--lib/gcstar/GCMail.pm474
-rw-r--r--lib/gcstar/GCMainWindow.pm4124
-rw-r--r--lib/gcstar/GCMenu.pm1840
-rw-r--r--lib/gcstar/GCModel.pm2896
-rw-r--r--lib/gcstar/GCModels/GCTVepisodes.gcm390
-rw-r--r--lib/gcstar/GCModels/GCTVseries.gcm417
-rw-r--r--lib/gcstar/GCModels/GCboardgames.gcm478
-rw-r--r--lib/gcstar/GCModels/GCbooks.gcm278
-rw-r--r--lib/gcstar/GCModels/GCcoins.gcm275
-rw-r--r--lib/gcstar/GCModels/GCcomics.gcm353
-rw-r--r--lib/gcstar/GCModels/GCfilms.gcm604
-rw-r--r--lib/gcstar/GCModels/GCgames.gcm492
-rw-r--r--lib/gcstar/GCModels/GCminicars.gcm892
-rw-r--r--lib/gcstar/GCModels/GCmusics.gcm250
-rw-r--r--lib/gcstar/GCModels/GCperiodicals.gcm105
-rw-r--r--lib/gcstar/GCModels/GCsmartcards.gcm379
-rw-r--r--lib/gcstar/GCModels/GCsoftware.gcm438
-rw-r--r--lib/gcstar/GCModels/GCstamps.gcm702
-rw-r--r--lib/gcstar/GCModels/GCwines.gcm356
-rw-r--r--lib/gcstar/GCOptions.pm1670
-rw-r--r--lib/gcstar/GCPanel.pm1540
-rw-r--r--lib/gcstar/GCPlugins.pm1783
-rw-r--r--lib/gcstar/GCPlugins/GCPluginsBase.pm396
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm67
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm360
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm60
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm53
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm340
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm466
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm60
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm418
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm278
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm58
-rw-r--r--lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm462
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm59
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm59
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm391
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm352
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm57
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm477
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm374
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm295
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBol.pm485
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm479
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm420
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm430
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm238
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCFnac.pm462
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm390
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm370
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm464
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm376
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm334
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm418
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCMareno.pm365
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm333
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm389
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm447
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm462
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm303
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm331
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm65
-rw-r--r--lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm61
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm398
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm546
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm49
-rw-r--r--lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm503
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm267
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm431
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm403
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm435
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm281
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm291
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm304
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm264
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm279
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm236
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm266
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm295
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm340
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm351
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm271
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm284
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm699
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm241
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm427
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm374
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm269
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm343
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm255
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm334
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm334
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm252
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm369
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCIbs.pm409
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCImdb.pm439
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm386
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm316
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm382
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm272
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm429
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm246
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm222
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm304
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm305
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCOnet.pm327
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm343
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm355
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm337
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm56
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm59
-rw-r--r--lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm70
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAlapage.pm262
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazon.pm115
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm115
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm114
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm118
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm120
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm115
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm291
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm490
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm447
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm425
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCLudus.pm367
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm541
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCNextGame.pm480
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm316
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm314
-rw-r--r--lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm87
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm333
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm238
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm309
-rw-r--r--lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm62
-rw-r--r--lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm132
-rw-r--r--lib/gcstar/GCSplash.pm241
-rw-r--r--lib/gcstar/GCStats.pm464
-rw-r--r--lib/gcstar/GCStyle.pm67
-rw-r--r--lib/gcstar/GCUpdater.pm174
-rw-r--r--lib/gcstar/GCUtils.pm640
-rw-r--r--lib/gcstar/GCWidgets.pm429
-rw-r--r--man/gcstar.192
-rw-r--r--packages/GCstar_Packaging_Policy.txt33
-rw-r--r--packages/debian/changelog5
-rw-r--r--packages/debian/compat1
-rw-r--r--packages/debian/control25
-rw-r--r--packages/debian/copyright26
-rw-r--r--packages/debian/dirs1
-rw-r--r--packages/debian/docs3
-rw-r--r--packages/debian/gcstar.install2
-rw-r--r--packages/debian/gcstar_logo.xpm291
-rw-r--r--packages/debian/lintian/gcstar2
-rw-r--r--packages/debian/menu1
-rw-r--r--packages/debian/patches/00list5
-rw-r--r--packages/debian/patches/01-set_usr_lib.dpatch26
-rw-r--r--packages/debian/patches/02gzip-manpage.dpatch19
-rw-r--r--packages/debian/patches/03_change_default_browser.dpatch19
-rw-r--r--packages/debian/patches/04-install-set_usr_lib.dpatch21
-rw-r--r--packages/debian/patches/07_fix_manpath.dpatch19
-rw-r--r--packages/debian/postinst8
-rw-r--r--packages/debian/postrm8
-rw-r--r--packages/debian/rules112
-rw-r--r--packages/fedora/gcstar.spec111
-rw-r--r--packages/rpm/gcstar.spec41
-rw-r--r--packages/win32/createExe.bat1
-rw-r--r--packages/win32/gcs_lang.nsh65
-rw-r--r--packages/win32/gcstar.bat3
-rw-r--r--packages/win32/gcstar.nsi362
-rw-r--r--packages/win32/img/banner_left.bmpbin0 -> 154542 bytes
-rw-r--r--packages/win32/img/banner_top.bmpbin0 -> 34256 bytes
-rw-r--r--packages/win32/img/checks.bmpbin0 -> 2614 bytes
-rw-r--r--packages/win32/img/icon_install.icobin0 -> 16958 bytes
-rw-r--r--packages/win32/img/icon_uninstall.icobin0 -> 16958 bytes
-rw-r--r--packages/win32/img/uninstall_top.bmpbin0 -> 34256 bytes
-rw-r--r--packages/win32/img/website.icobin0 -> 9662 bytes
-rw-r--r--packages/win32/langs/gcs_Bulgarian.nsh70
-rw-r--r--packages/win32/langs/gcs_Czech.nsh70
-rw-r--r--packages/win32/langs/gcs_English.nsh70
-rw-r--r--packages/win32/langs/gcs_French.nsh68
-rw-r--r--packages/win32/langs/gcs_German.nsh70
-rw-r--r--packages/win32/langs/gcs_Italian.nsh70
-rw-r--r--packages/win32/langs/gcs_Polish.nsh70
-rw-r--r--packages/win32/langs/gcs_Romanian.nsh70
-rw-r--r--packages/win32/langs/gcs_Russian.nsh70
-rw-r--r--packages/win32/langs/gcs_SerbianLatin.nsh70
-rw-r--r--packages/win32/langs/gcs_Spanish.nsh70
-rw-r--r--packages/win32/langs/gcs_Turkish.nsh70
-rw-r--r--packages/win32/update.bat4
-rw-r--r--share/applications/gcstar-thumbnailer260
-rw-r--r--share/applications/gcstar.desktop18
-rw-r--r--share/applications/gcstar.xml7
-rw-r--r--share/gcstar/LICENSE340
-rw-r--r--share/gcstar/fonts/AUTHORS8
-rw-r--r--share/gcstar/fonts/COPYING340
-rw-r--r--share/gcstar/fonts/ChangeLog176
-rw-r--r--share/gcstar/fonts/LiberationSans-Regular.ttfbin0 -> 140600 bytes
-rw-r--r--share/gcstar/fonts/License.txt19
-rw-r--r--share/gcstar/fonts/README90
-rw-r--r--share/gcstar/genres/EN.genres12
-rw-r--r--share/gcstar/genres/ES.genres12
-rw-r--r--share/gcstar/genres/FR.genres4
-rw-r--r--share/gcstar/helpers/xdg-open469
-rw-r--r--share/gcstar/html_models/GCboardgames/piwi275
-rw-r--r--share/gcstar/html_models/GCboardgames/piwi.pngbin0 -> 50926 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/FloFred73
-rw-r--r--share/gcstar/html_models/GCbooks/FloFred.pngbin0 -> 69747 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosDark67
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosDark.pngbin0 -> 26138 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosLight66
-rw-r--r--share/gcstar/html_models/GCbooks/NellistosLight.pngbin0 -> 30503 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/Shelf12
-rw-r--r--share/gcstar/html_models/GCbooks/Shelf.pngbin0 -> 62375 bytes
-rw-r--r--share/gcstar/html_models/GCbooks/Simple10
-rw-r--r--share/gcstar/html_models/GCbooks/Simple.pngbin0 -> 29817 bytes
-rw-r--r--share/gcstar/html_models/GCcoins/Simple11
-rw-r--r--share/gcstar/html_models/GCcoins/Simple.pngbin0 -> 20252 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Flat109
-rw-r--r--share/gcstar/html_models/GCfilms/Flat.pngbin0 -> 77945 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Shelf284
-rw-r--r--share/gcstar/html_models/GCfilms/Shelf.pngbin0 -> 86073 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Simple100
-rw-r--r--share/gcstar/html_models/GCfilms/Simple.pngbin0 -> 28419 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Tabs245
-rw-r--r--share/gcstar/html_models/GCfilms/Tabs.pngbin0 -> 51681 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Tian276
-rw-r--r--share/gcstar/html_models/GCfilms/Tian-Mario276
-rw-r--r--share/gcstar/html_models/GCfilms/Tian-Mario-Kim281
-rw-r--r--share/gcstar/html_models/GCfilms/Tian-Mario.pngbin0 -> 30879 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/Tian.pngbin0 -> 43774 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/float120
-rw-r--r--share/gcstar/html_models/GCfilms/float.pngbin0 -> 67698 bytes
-rw-r--r--share/gcstar/html_models/GCfilms/rootII_design118
-rw-r--r--share/gcstar/html_models/GCfilms/rootII_design.pngbin0 -> 49787 bytes
-rw-r--r--share/gcstar/html_models/GCgames/Flat111
-rw-r--r--share/gcstar/html_models/GCgames/Flat.pngbin0 -> 91347 bytes
-rw-r--r--share/gcstar/html_models/GCgames/Simple10
-rw-r--r--share/gcstar/html_models/GCgames/Simple.pngbin0 -> 28909 bytes
-rw-r--r--share/gcstar/html_models/GCgames/Tabs284
-rw-r--r--share/gcstar/html_models/GCgames/Tabs.pngbin0 -> 46938 bytes
-rw-r--r--share/gcstar/html_models/GCminicars/Tian-Jim279
-rw-r--r--share/gcstar/html_models/GCminicars/Tian-Jim.pngbin0 -> 39085 bytes
-rw-r--r--share/gcstar/html_models/GCmusics/Shelf298
-rw-r--r--share/gcstar/html_models/GCmusics/Shelf.pngbin0 -> 62357 bytes
-rw-r--r--share/gcstar/html_models/GCmusics/Simple10
-rw-r--r--share/gcstar/html_models/GCmusics/Simple.pngbin0 -> 24463 bytes
-rw-r--r--share/gcstar/html_models/GCstar/Shelf282
-rw-r--r--share/gcstar/html_models/GCstar/Shelf.pngbin0 -> 86073 bytes
-rw-r--r--share/gcstar/html_models/GCstar/Simple96
-rw-r--r--share/gcstar/html_models/GCstar/Simple.pngbin0 -> 28419 bytes
-rw-r--r--share/gcstar/icons/GCstar.icobin0 -> 25214 bytes
-rw-r--r--share/gcstar/icons/gcstar_128x128.pngbin0 -> 13072 bytes
-rw-r--r--share/gcstar/icons/gcstar_16x16.pngbin0 -> 838 bytes
-rw-r--r--share/gcstar/icons/gcstar_192x192.pngbin0 -> 21943 bytes
-rw-r--r--share/gcstar/icons/gcstar_22x22.pngbin0 -> 1266 bytes
-rw-r--r--share/gcstar/icons/gcstar_24x24.pngbin0 -> 1419 bytes
-rw-r--r--share/gcstar/icons/gcstar_256x256.pngbin0 -> 32260 bytes
-rw-r--r--share/gcstar/icons/gcstar_32x32.pngbin0 -> 2018 bytes
-rw-r--r--share/gcstar/icons/gcstar_36x36.pngbin0 -> 2398 bytes
-rw-r--r--share/gcstar/icons/gcstar_48x48.pngbin0 -> 3528 bytes
-rw-r--r--share/gcstar/icons/gcstar_64x64.pngbin0 -> 5092 bytes
-rw-r--r--share/gcstar/icons/gcstar_72x72.pngbin0 -> 6158 bytes
-rw-r--r--share/gcstar/icons/gcstar_96x96.pngbin0 -> 9134 bytes
-rw-r--r--share/gcstar/icons/gcstar_scalable.svg354
-rw-r--r--share/gcstar/icons/icon_install.icobin0 -> 16958 bytes
-rw-r--r--share/gcstar/icons/star.pngbin0 -> 982 bytes
-rw-r--r--share/gcstar/icons/star_hover.pngbin0 -> 1515 bytes
-rw-r--r--share/gcstar/icons/stardark.pngbin0 -> 1056 bytes
-rw-r--r--share/gcstar/icons/stardark_hover.pngbin0 -> 1553 bytes
-rw-r--r--share/gcstar/icons/web.icobin0 -> 9662 bytes
-rw-r--r--share/gcstar/list_bg/Box/group.pngbin0 -> 14419 bytes
-rw-r--r--share/gcstar/list_bg/Box/list_bg.pngbin0 -> 34117 bytes
-rw-r--r--share/gcstar/list_bg/Box/style2
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/list_bg.pngbin0 -> 103747 bytes
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/list_fg.pngbin0 -> 18630 bytes
-rw-r--r--share/gcstar/list_bg/Brick_and_Glass/style3
-rw-r--r--share/gcstar/list_bg/Dark_Glass/group.pngbin0 -> 269 bytes
-rw-r--r--share/gcstar/list_bg/Dark_Glass/list_bg.pngbin0 -> 8186 bytes
-rw-r--r--share/gcstar/list_bg/Dark_Glass/list_fg.pngbin0 -> 10759 bytes
-rw-r--r--share/gcstar/list_bg/Dark_Glass/style4
-rw-r--r--share/gcstar/list_bg/Glass/group.pngbin0 -> 1161 bytes
-rw-r--r--share/gcstar/list_bg/Glass/list_bg.pngbin0 -> 1862 bytes
-rw-r--r--share/gcstar/list_bg/Glass/list_fg.pngbin0 -> 3170 bytes
-rw-r--r--share/gcstar/list_bg/Glass/style3
-rw-r--r--share/gcstar/list_bg/Green_Glass/group.pngbin0 -> 3279 bytes
-rw-r--r--share/gcstar/list_bg/Green_Glass/list_bg.pngbin0 -> 887 bytes
-rw-r--r--share/gcstar/list_bg/Green_Glass/list_fg.pngbin0 -> 2456 bytes
-rw-r--r--share/gcstar/list_bg/Green_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/list_bg.pngbin0 -> 69106 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/list_fg.pngbin0 -> 13544 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/list_bg.pngbin0 -> 65944 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Green_Wood/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.pngbin0 -> 57581 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.pngbin0 -> 15128 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.pngbin0 -> 52404 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Grey_Wood/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.pngbin0 -> 69863 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.pngbin0 -> 13837 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.pngbin0 -> 66207 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Purple_Wood/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/list_bg.pngbin0 -> 72062 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/list_fg.pngbin0 -> 14708 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Glass/style3
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/list_bg.pngbin0 -> 66125 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Luxury_Red_Wood/style3
-rw-r--r--share/gcstar/list_bg/Marble/group.pngbin0 -> 18033 bytes
-rw-r--r--share/gcstar/list_bg/Marble/list_bg.pngbin0 -> 38610 bytes
-rw-r--r--share/gcstar/list_bg/Marble/style2
-rw-r--r--share/gcstar/list_bg/Wood/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Wood/list_bg.pngbin0 -> 48015 bytes
-rw-r--r--share/gcstar/list_bg/Wood/list_fg.pngbin0 -> 48914 bytes
-rw-r--r--share/gcstar/list_bg/Wood/style3
-rw-r--r--share/gcstar/list_bg/Wood2/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Wood2/list_bg.pngbin0 -> 49505 bytes
-rw-r--r--share/gcstar/list_bg/Wood2/list_fg.pngbin0 -> 50584 bytes
-rw-r--r--share/gcstar/list_bg/Wood2/style3
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/group.pngbin0 -> 13799 bytes
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/list_bg.pngbin0 -> 53072 bytes
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/list_fg.pngbin0 -> 9708 bytes
-rw-r--r--share/gcstar/list_bg/Wood_and_Glass/style3
-rw-r--r--share/gcstar/logos/Peri.pngbin0 -> 11580 bytes
-rw-r--r--share/gcstar/logos/Peri_main_logo.pngbin0 -> 18759 bytes
-rw-r--r--share/gcstar/logos/Peri_main_logo.svg3436
-rw-r--r--share/gcstar/logos/about.pngbin0 -> 13470 bytes
-rw-r--r--share/gcstar/logos/bg_no.pngbin0 -> 7541 bytes
-rw-r--r--share/gcstar/logos/book_no.pngbin0 -> 7141 bytes
-rw-r--r--share/gcstar/logos/button.pngbin0 -> 3528 bytes
-rw-r--r--share/gcstar/logos/cd_no.pngbin0 -> 5234 bytes
-rw-r--r--share/gcstar/logos/film_no.pngbin0 -> 9744 bytes
-rw-r--r--share/gcstar/logos/find.pngbin0 -> 1258 bytes
-rw-r--r--share/gcstar/logos/install.pngbin0 -> 4087 bytes
-rw-r--r--share/gcstar/logos/no.pngbin0 -> 10747 bytes
-rw-r--r--share/gcstar/logos/no_minicars.pngbin0 -> 34678 bytes
-rw-r--r--share/gcstar/logos/no_smartcards.pngbin0 -> 30332 bytes
-rw-r--r--share/gcstar/logos/no_stamp.pngbin0 -> 14581 bytes
-rw-r--r--share/gcstar/logos/periscope_main_logo.svg1230
-rw-r--r--share/gcstar/logos/splash.pngbin0 -> 7061 bytes
-rw-r--r--share/gcstar/overlays/canevas-timbre.pngbin0 -> 28427 bytes
-rw-r--r--share/gcstar/overlays/cd.pngbin0 -> 12950 bytes
-rw-r--r--share/gcstar/overlays/dvd.pngbin0 -> 9206 bytes
-rw-r--r--share/gcstar/overlays/favourite_large.pngbin0 -> 2209 bytes
-rw-r--r--share/gcstar/overlays/favourite_med.pngbin0 -> 1480 bytes
-rw-r--r--share/gcstar/overlays/favourite_small.pngbin0 -> 1156 bytes
-rw-r--r--share/gcstar/overlays/favourite_verysmall.pngbin0 -> 868 bytes
-rw-r--r--share/gcstar/overlays/favourite_xlarge.pngbin0 -> 3713 bytes
-rw-r--r--share/gcstar/overlays/film.pngbin0 -> 34689 bytes
-rw-r--r--share/gcstar/overlays/flip.pngbin0 -> 1734 bytes
-rw-r--r--share/gcstar/overlays/flip2.pngbin0 -> 1745 bytes
-rw-r--r--share/gcstar/overlays/lend_large.pngbin0 -> 1743 bytes
-rw-r--r--share/gcstar/overlays/lend_med.pngbin0 -> 1250 bytes
-rw-r--r--share/gcstar/overlays/lend_small.pngbin0 -> 1003 bytes
-rw-r--r--share/gcstar/overlays/lend_verysmall.pngbin0 -> 744 bytes
-rw-r--r--share/gcstar/overlays/lend_xlarge.pngbin0 -> 2956 bytes
-rw-r--r--share/gcstar/overlays/minicars.pngbin0 -> 1554 bytes
-rw-r--r--share/gcstar/overlays/subtle.pngbin0 -> 8322 bytes
-rw-r--r--share/gcstar/panels/Classic29
-rw-r--r--share/gcstar/panels/Dark29
-rw-r--r--share/gcstar/panels/WebSite29
-rw-r--r--share/gcstar/schemas/gcm.xsd291
-rw-r--r--share/gcstar/style/GCstar/gtkrc277
-rw-r--r--share/gcstar/style/GCstar/icons/about/16x16.pngbin0 -> 903 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/about/64x64.pngbin0 -> 5254 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/add/16x16.pngbin0 -> 700 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/add/24x24.pngbin0 -> 1404 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/add/32x32.pngbin0 -> 1782 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/cancel/24x24.pngbin0 -> 1469 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/cancel/32x32.pngbin0 -> 2582 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/clear/24x24.pngbin0 -> 1644 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/clear/32x32.pngbin0 -> 2509 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/convert/16x16.pngbin0 -> 750 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/convert/24x24.pngbin0 -> 1547 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/convert/32x32.pngbin0 -> 2330 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/delete/16x16.pngbin0 -> 946 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/delete/24x24.pngbin0 -> 1855 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/delete/32x32.pngbin0 -> 2815 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/directory/32x32.pngbin0 -> 2052 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/dnd/16x16.pngbin0 -> 818 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/error/64x64.pngbin0 -> 4918 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/execute/16x16.pngbin0 -> 936 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/execute/24x24.pngbin0 -> 1772 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/execute/32x32.pngbin0 -> 2729 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/find/16x16.pngbin0 -> 871 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/find/24x24.pngbin0 -> 1700 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/find/32x32.pngbin0 -> 2489 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-back/16x16.pngbin0 -> 387 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-back/24x24.pngbin0 -> 572 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-down/16x16.pngbin0 -> 402 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-down/24x24.pngbin0 -> 616 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-forward/16x16.pngbin0 -> 380 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-forward/24x24.pngbin0 -> 593 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-up/16x16.pngbin0 -> 308 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/go-up/24x24.pngbin0 -> 571 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/help/16x16.pngbin0 -> 923 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/help/32x32.pngbin0 -> 2326 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/help/64x64.pngbin0 -> 5393 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/home/32x32.pngbin0 -> 2771 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/jump-to/24x24.pngbin0 -> 1850 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/jump-to/32x32.pngbin0 -> 2835 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-next/24x24.pngbin0 -> 1195 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-next/32x32.pngbin0 -> 1751 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-play/16x16.pngbin0 -> 704 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-play/24x24.pngbin0 -> 1050 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/media-play/32x32.pngbin0 -> 1401 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/network/32x32.pngbin0 -> 2631 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/new/16x16.pngbin0 -> 475 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/new/24x24.pngbin0 -> 775 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/new/32x32.pngbin0 -> 999 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/ok/24x24.pngbin0 -> 1589 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/ok/32x32.pngbin0 -> 2365 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/open/16x16.pngbin0 -> 562 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/open/24x24.pngbin0 -> 1546 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/open/32x32.pngbin0 -> 2311 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/preferences/16x16.pngbin0 -> 3535 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/preferences/24x24.pngbin0 -> 1553 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/preferences/32x32.pngbin0 -> 2764 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/properties/24x24.pngbin0 -> 1893 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/properties/32x32.pngbin0 -> 3048 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/quit/16x16.pngbin0 -> 1039 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/quit/32x32.pngbin0 -> 3118 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/refresh/16x16.pngbin0 -> 983 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/refresh/24x24.pngbin0 -> 1760 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/refresh/32x32.pngbin0 -> 2846 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/remove/24x24.pngbin0 -> 480 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/remove/32x32.pngbin0 -> 625 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/revert-to-saved/16x16.pngbin0 -> 736 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/revert-to-saved/24x24.pngbin0 -> 1473 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/revert-to-saved/32x32.pngbin0 -> 2247 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save-as/16x16.pngbin0 -> 674 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save-as/24x24.pngbin0 -> 1410 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save-as/32x32.pngbin0 -> 1957 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save/16x16.pngbin0 -> 515 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save/24x24.pngbin0 -> 1166 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/save/32x32.pngbin0 -> 1512 bytes
-rw-r--r--share/gcstar/style/GCstar/icons/select-color/32x32.pngbin0 -> 1904 bytes
-rw-r--r--share/gcstar/style/GCstar/lend.pngbin0 -> 2910 bytes
-rw-r--r--share/gcstar/style/Gtk/gtkrc1
-rw-r--r--share/gcstar/style/Gtk/lend.pngbin0 -> 2910 bytes
-rw-r--r--share/gcstar/style/kde/active.pngbin0 -> 676 bytes
-rw-r--r--share/gcstar/style/kde/active2.pngbin0 -> 176 bytes
-rw-r--r--share/gcstar/style/kde/add.pngbin0 -> 1165 bytes
-rw-r--r--share/gcstar/style/kde/arrowdown.pngbin0 -> 234 bytes
-rw-r--r--share/gcstar/style/kde/arrowleft.pngbin0 -> 203 bytes
-rw-r--r--share/gcstar/style/kde/arrowright.pngbin0 -> 204 bytes
-rw-r--r--share/gcstar/style/kde/arrowup.pngbin0 -> 235 bytes
-rw-r--r--share/gcstar/style/kde/bghonrizontalscroll.pngbin0 -> 212 bytes
-rw-r--r--share/gcstar/style/kde/bgverticalscroll.pngbin0 -> 209 bytes
-rw-r--r--share/gcstar/style/kde/box.pngbin0 -> 4412 bytes
-rw-r--r--share/gcstar/style/kde/box2.pngbin0 -> 935 bytes
-rw-r--r--share/gcstar/style/kde/box3.pngbin0 -> 893 bytes
-rw-r--r--share/gcstar/style/kde/cancel.pngbin0 -> 1468 bytes
-rw-r--r--share/gcstar/style/kde/cdrom.pngbin0 -> 5400 bytes
-rw-r--r--share/gcstar/style/kde/checked.pngbin0 -> 638 bytes
-rw-r--r--share/gcstar/style/kde/clear.pngbin0 -> 929 bytes
-rw-r--r--share/gcstar/style/kde/delete.pngbin0 -> 1591 bytes
-rw-r--r--share/gcstar/style/kde/display.pngbin0 -> 4134 bytes
-rw-r--r--share/gcstar/style/kde/exec.pngbin0 -> 6440 bytes
-rw-r--r--share/gcstar/style/kde/export.pngbin0 -> 2683 bytes
-rw-r--r--share/gcstar/style/kde/find.pngbin0 -> 7340 bytes
-rw-r--r--share/gcstar/style/kde/gtkrc746
-rw-r--r--share/gcstar/style/kde/gtkrcold253
-rw-r--r--share/gcstar/style/kde/harddisk.pngbin0 -> 1902 bytes
-rw-r--r--share/gcstar/style/kde/help.pngbin0 -> 1587 bytes
-rw-r--r--share/gcstar/style/kde/home.pngbin0 -> 5039 bytes
-rw-r--r--share/gcstar/style/kde/horizontal.pngbin0 -> 388 bytes
-rw-r--r--share/gcstar/style/kde/horizontal_hover.pngbin0 -> 420 bytes
-rw-r--r--share/gcstar/style/kde/import.pngbin0 -> 5185 bytes
-rw-r--r--share/gcstar/style/kde/internet.pngbin0 -> 7129 bytes
-rw-r--r--share/gcstar/style/kde/khelpcenter.pngbin0 -> 4107 bytes
-rw-r--r--share/gcstar/style/kde/lend.pngbin0 -> 1841 bytes
-rw-r--r--share/gcstar/style/kde/new.pngbin0 -> 902 bytes
-rw-r--r--share/gcstar/style/kde/ok.pngbin0 -> 1393 bytes
-rw-r--r--share/gcstar/style/kde/open.pngbin0 -> 2232 bytes
-rw-r--r--share/gcstar/style/kde/paths.pngbin0 -> 1944 bytes
-rw-r--r--share/gcstar/style/kde/preferences.pngbin0 -> 5104 bytes
-rw-r--r--share/gcstar/style/kde/properties.pngbin0 -> 4711 bytes
-rw-r--r--share/gcstar/style/kde/quit.pngbin0 -> 2238 bytes
-rw-r--r--share/gcstar/style/kde/radiochecked.pngbin0 -> 512 bytes
-rw-r--r--share/gcstar/style/kde/radiounchecked.pngbin0 -> 476 bytes
-rw-r--r--share/gcstar/style/kde/refresh.pngbin0 -> 1545 bytes
-rw-r--r--share/gcstar/style/kde/remove.pngbin0 -> 267 bytes
-rw-r--r--share/gcstar/style/kde/save.pngbin0 -> 1348 bytes
-rw-r--r--share/gcstar/style/kde/saveas.pngbin0 -> 2069 bytes
-rw-r--r--share/gcstar/style/kde/sortdown.pngbin0 -> 1604 bytes
-rw-r--r--share/gcstar/style/kde/sortup.pngbin0 -> 1595 bytes
-rw-r--r--share/gcstar/style/kde/spindown.pngbin0 -> 173 bytes
-rw-r--r--share/gcstar/style/kde/spinup.pngbin0 -> 173 bytes
-rw-r--r--share/gcstar/style/kde/tab_corner.pngbin0 -> 177 bytes
-rw-r--r--share/gcstar/style/kde/tonight.pngbin0 -> 1509 bytes
-rw-r--r--share/gcstar/style/kde/unchecked.pngbin0 -> 639 bytes
-rw-r--r--share/gcstar/style/kde/vertical.pngbin0 -> 414 bytes
-rw-r--r--share/gcstar/style/kde/vertical_hover.pngbin0 -> 376 bytes
-rw-r--r--share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog31
-rw-r--r--share/gcstar/xml_models/GCfilms/DVDProfiler151
-rw-r--r--share/gcstar/xslt/applyXSLT.pl13
-rw-r--r--share/gcstar/xslt/createGCSValidator.xsl165
-rw-r--r--templates/GCExportTemplate.pm264
-rw-r--r--templates/GCImportTemplate.pm212
-rw-r--r--templates/GCSiteTemplate.pm271
1319 files changed, 166023 insertions, 0 deletions
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..761147d
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,1306 @@
+1.7.0
+
+ * New translations
+ - Chinese (Simplified) translation added thanks to 林雪凡.
+
+ * User interface changes
+ - All the settings for the current type of list can be changed directly
+ below the list, on the bottom left of the application. By default,
+ the settings panel is hidden, but it can be shown by dragging the
+ separator.
+ - It's now possible to define default values for the fields when adding
+ a new item to a collection.
+ - New menu to show/hide menu, tool and status bars. This also appears
+ in the context menu shown when right-clicking on an element in the
+ list. It contains an option to use fullscreen mode.
+ - Slight animations have been added in image mode.
+ - A popup is displayed in image mode to show a summary of the item.
+
+ * Bugs fixed
+ - There was a bug when saving an item which date is the current one.
+ - The list of saved searches in toolbar was not reset when displaying
+ all collection items.
+ - Ranges were not handled correctly when searching.
+ - With collections of video games, the units field was not hidden if
+ user chose to hide file size.
+ - In image mode, some items were not displayed correctly when grouping.
+ - Bug fixed in some website plugins:
+ All Amazon plugins for books
+ Allocine
+ Bedetheque
+ CSFD
+ Discogs
+ GameSpot
+ IMDb
+ jeuxvideo.com
+ MobyGames
+ Saraiva
+
+-------------------------------------------------------------------
+
+1.6.2
+
+ * New features
+ - Option added for sorting items while in image views
+ * Export/Import/Fetch/Extract changes
+ - Amazon book plugins now use the Amazon Web Service, for more reliable
+ plugin operation
+ - New plugin for batch importing with a barcode scanner. It can be used
+ with GCstar Scanner for Android or any barcode scanner acting like a
+ keyboard.
+ * Default collections changes
+ - Film collection: Country field is now a list box, allowing multiple countries
+ * New plugins to fetch information from websites
+ - Books:
+ Douban (ZH) provided by BW.
+ - Movies:
+ Douban (ZH) provided by BW.
+ - Music:
+ Douban (ZH) provided by BW.
+ * Bugs fixed
+ - Set focus to the title field automatically after adding an item
+ - Correctly handle foreign characters in external filenames under Windows
+ - Correctly sort numeric fields used for grouping in image lists
+ - It was not possible to delete a unique item in image mode
+ - Fixed bug with image caching
+ - HTTP return code 302 managed correctly
+ - Removed use of Switch.pm as it is deprecated
+ - Bug fixed in some website plugins:
+ Alapage
+ Allocine
+ Bedetheque
+ Bol
+ Comic Book DB
+ CSFD.cz
+ IMDb
+ jeuxvideo.com
+ jeuxvideo.fr
+ Moby Games
+ The Movie DB
+
+-------------------------------------------------------------------
+
+1.6.1
+
+ * New features
+ - CSV plugin now allows you to select which field to use to search for
+ internet results
+ - Graphs generated from statistics are smoothed, to eliminate sharp lines
+ * Default collections changes
+ - New default collections:
+ TV shows (series) collection model. Useful for tracking dvd
+ collections of tv shows.
+ Computer Software collection, written by Qoolman
+ - Video games collection:
+ New fields: Region, Serial Number.
+ * New plugins to fetch information from websites
+ - TV shows (series):
+ Thetvdb
+ Themoviedb
+ * Bugs fixed
+ - Unable to remove more than 9 items from a collection at a time
+ - Crash when trying to create a cached image from a missing picture, or when
+ image does not exist
+ - Some characters were incorrectly encoded in read only views
+ - Add option in collection read only views for fields to "collapse" and hide
+ when they have no content
+ - Fixed problem at startup when some items were hidden in the toolbar.
+ - The "View modules" menu was not working anymore.
+ - Add play toolbar button for tv episodes collections.
+ - Item window was not properly re-constructed after changing collections.
+ - Dependency on Sort::Naturally removed.
+ - Date::Calc module was not shown as an optional dependency while it is
+ needed for statistics.
+
+-------------------------------------------------------------------
+
+1.6.0
+ * New features
+ - Generation of statistics:
+ New item in 'File' menu to create pictures based on number of items
+ having the same value for a given field (e.g. you can see how many
+ video games you have for each genre).
+ Options to select the type of graphic (bars, area, pie).
+ Histories can be created showing the evolution of the collection.
+ - Images thumbnails are now cached. This results in a dramatic speed up
+ of loading collections when hi-resolution pictures are used.
+ - Dragging and dropping a file to a collection will add it to the
+ collection if the file is:
+ A video file on a movie collection.
+ An ebook file on a book collection.
+ * New translations
+ - Chinese (Traditional) translation added thanks to 林雪凡.
+ * User interface changes
+ - Language strings are now collection dependant. This results in a
+ nicer user experience, replacing strings like "New item" with
+ "New movie", "New game", etc.
+ - New right click context menu on file chooser control, with the option
+ of choosing a folder instead of a file. Useful for dvd rips stored in
+ folders, where the folder path needs to be passed to an external
+ program.
+ - Added Update button to items, which refreshes the current item's
+ details from the web page it was originally fetched from.
+ - Fields with a history have an auto-completion feature when user
+ starts to enter text.
+ - Right click context menu works as expected when multiple items are
+ selected.
+ - The collection may be saved if something was changed without clicking
+ on an item in the list.
+ - When closing an collection without a filename, you now have the
+ option to save, cancel or discard the changes.
+ - File open dialog is no longer case sensitive when filtering
+ extensions.
+ - Video and Ebooks file chooser filters files to valid file types
+ - Lots of new skins and skin remakes thanks to Qoolman
+ - Items are now sorted using a 'natural sort' routine, for more
+ predictable sorting of mixed numeric/text titles
+ * Default collections changes
+ - New default collections:
+ Smart cards (by jimjim92).
+ - Books collections can now link to a local or online 'digital version'
+ of the book.
+ - Video games collection:
+ New fields: Exclusive, Press rating, Size and Display resolutions.
+ - Music collection
+ New fields: Press rating
+ * Export/Import/Fetch/Extract changes
+ - New plugin to export to an external disk. It just copies the
+ collection to a directory with all the pictures in a sub-directory.
+ Everything can also be compressed in one single file. Useful to copy
+ a collection for GCstar Viewer on Android.
+ http://wiki.gcstar.org/en/gcstar_viewer
+ - New plugin to export in Palm PDB format.
+ - Some plugins are now preferred by gcstar, these are for sites with
+ high quality data and with fully operational plugins. These sites are
+ now shown first in the plugins list, and are marked by a star.
+ - Default plugin choice now matches with the user's language settings.
+ - CSV Import plugin now has the option to pull information from
+ websites during import.
+ - DVDFr plugin (Movies - FR) now supports searching by EAN. That means
+ it can directly be used with a barcode scanner.
+ - Importing from Tellico handles ISBN and rank for book collections and
+ developers for game collections (patch from DanielS).
+ - HTML export handles pictures and link with generic models (e.g.
+ Shelf).
+ - Folder import is not shown when an incompatible collection is open.
+ * New plugins to fetch information from websites
+ - Movies:
+ Amazon UK (EN) and DVDEmpire (EN) provided by dingsi.
+ CartelesPeliculas (ES) provided by DoVerMan.
+ * Bugs fixed
+ - Bug fixed preventing opening of collections with custom fields in
+ some circumstances.
+ - When fields are hidden, they don't appear anymore in the expanders
+ (e.g. subtitles in movies collections).
+ - Tonight window works as expected after changing collections.
+ - Menus were not updated on Windows systems.
+ - Some urls where misinterpreted as collections when drag and dropped
+ onto main window
+ - Bug fixed in some website plugins:
+ - Massive amount of plugin fixes provided by Tenbaht, including:
+ DVDFr
+ OFDb
+ Imdb
+ Alpacine
+ BeyazPerde
+ Csfd
+ Moviemeter
+ Onet
+ Mediadis
+ * Removed plugins:
+ - dvdspot.com was shut down Oct. 2008, removed the GCfilm
+ plugin GCDVDSpot.pm
+ - movieclub.be shut down, removed GCfilm plugins
+ GCMovieClubFR.pm and GCMovieClubNL.pm
+
+-------------------------------------------------------------------
+
+1.5.0
+
+ * User interface changes
+ - When too many fields are shown in the dialog box to select which of
+ them should be displayed, scrollbars are used.
+ * Collection changes
+ - Added an optional attribute to collection fields, sorttype, which
+ overrides the sorting method for that field. Can be either 'number'
+ or 'date'.
+ * Bugs fixed
+ - Preview when fetching information was broken.
+ - Button to open the web page associated to an item was disabled when
+ locking a collection.
+ - It was not possible to modify the title to search for on websites.
+ - Some collections may not be opened if custom fields were added.
+ - The groups of fields were shown more than once in some places when
+ adding custom fields.
+ - Many bugs fixed for image mode.
+ - Cast was not fetched for every title when using imdb with an import
+ plugin
+ - Sorting by movie release date was not working with non 'yyyy-mm-dd'
+ formats
+ - On Windows systems, GCstar now stores its configuration files in the
+ users Application Data folder, rather than in the GCstar program
+ folder. This should stop GCstar needing admin rights to run. On first
+ run of the new version, GCstar should copy the configuration from the
+ old path.
+ - Exporting only visible items now works properly with "items matching
+ any of the criteria" type filters.
+ - Searching OFDB with German characters works properly
+ - No more storable warnings when searching from plugins
+ - Fix star rating widget display with small screen sizes
+ - Better sizing of image display window
+ - GCstar now correctly installs icons in the hicolor theme, and now includes
+ a scalable svg icon
+
+-------------------------------------------------------------------
+
+1.5.0 beta1
+
+ * User interface changes
+ - Items can be grouped in picture mode as in detailed mode.
+ - Pictures are resized if needed when displayed in a window.
+ - User filters can be added to toolbar.
+ - A right-click on the "Fetch information" button displays a menu
+ where the mode to use can be selected.
+ - Column used for quick searches is the one used for ordering in
+ detailed mode.
+ - File associated to an item can be a URL (http or ftp) instead of a
+ local file.
+ - Search box displays a message when no field have been selected in
+ personal model.
+
+ * Export/Import/Fetch/Extract changes
+ - User can choose for each field from which sites information should be
+ fetched and in which order (if missing from 1st, choose 2nd, etc...).
+ - FolderImport changes (by BubbleGum)
+ Can add only recent items from a folder.
+ Can update path from moved files.
+ Parse filename to retrieve infos and test for subtitle file.
+ Remove custom regular expression from filename.
+ More options when no or many results.
+
+ * Default collections changes
+ - New default collections:
+ Stamps (by Bigoud)
+ Periodicals (by yggdrasiil)
+ Mini vehicles (by jimjim92)
+ - Rank in series added to books collections
+ - Press rating added to movies collections
+
+ * New plugins to fetch information from websites:
+ - Video games:
+ Amazon (CA - EN) and NextGame (IT) provided by TPF.
+ - Movies:
+ Internet Bookshop (IT) provided by t-storm.
+ Alpacine and CartelesMetropoliGlobal (ES) provided by DoVerMan.
+ Kinopoisk (RU) provided by Nazarov Pavel.
+ - Books:
+ Saraiva (PT) provided by nirev.
+ - Comics:
+ Manga-Sanctuary (FR) provided by Biggriffon.
+
+ * Bugs fixed
+ - Collections with invalid characters are auto-repaired instead of
+ generating error message and being unusable.
+ - Prevent data corruption if a crash occurs while saving collection.
+ - Histories were lost when editing the collection model.
+ - Issues fixed with grouping when there are some spaces in lists.
+ - Default size for history of opened files is 5 instead of 1.
+ - Item window was shown after closing a picture window.
+ - Fixed problems when saving searches with numeric comparisons.
+ - Fixed issues with suffixes in plugin to import from a folder.
+ - Disable items in popup menu for pictures when collection is locked.
+ - Correctly export value in options fields when using personal models.
+ - Bug fixed when performing a search while the current item has been
+ modified.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ All Tvdb plugins (TV shows episodes)
+ Adlibris (Books - FI, SV)
+ Alapage (Books - FR)
+ Alapage (Video Games - FR)
+ Allocine (Movies - FR)
+ Bedetheque (Comics - FR)
+ Bol (Books - IT)
+ Buscape (Books - PT)
+ Cinemotions (Movies - FR)
+ DicoDuNet (Video Games - FR)
+ Discogs (Music - EN)
+ FilmWeb (Movies - PL)
+ Fnac (Books - FR)
+ GameSpot (Video Games - EN)
+ IMDb (Movies - EN)
+ ISBNdb (Books - EN)
+ JeuxVideo.com (Video games - FR)
+ MobyGames (Video games - EN)
+ nooSFere (Books - FR)
+ OFDb (Movies - DE)
+
+-------------------------------------------------------------------
+
+1.4.3
+
+ * New translations
+ - Dutch translation added thanks to kim.
+
+ * Export/Import/Fetch/Extract changes
+ - Improved performances for plugins fetching data from websites.
+ - Discogs plugin (Music - EN) supports searches using artist or label.
+
+ * Bugs fixed
+ - Fixed display problem in image mode when removing or renaming items.
+ - Shortcuts can also be defined on saved searches.
+ - Use system ACL when ckecking file permissions.
+ - The default options were not used on first startup.
+ - Problems fixed with find-as-you-type in image mode.
+ - Web searches were broken with new versions of Storable.
+ - Bug fixed in some website plugins:
+ Amazon (Books - FR)
+ Amazon (Movies - FR)
+ Discogs (Music - EN)
+ FilmAffinity (Movies - EN and ES)
+ GameSpot (Video Games - EN)
+
+-------------------------------------------------------------------
+
+1.4.2
+
+ * Export/Import/Fetch/Extract changes
+ - Fetch can be done using writer for comics collections. Supported by
+ Bedetheque plugin.
+ - More plugins use big pictures if option is checked (Thanks to adiGuba).
+ Allocine (Movies - FR)
+ Cinemotions (Movies - FR)
+ - Import identifier and media labels from movies collections created with
+ Ant Movie Catalog.
+
+ * New plugins to fetch information from websites:
+ - nooSFere (Books - FR) provided by TPF
+ - TheLegacy (Video games - DE) provided by TPF
+
+ * Bugs fixed
+ - Title when opening items in windows was not updated.
+ - Rating was lost when displayed with stars and fetched from a website.
+ - Title in the list was incorrect for some collections when modifying
+ many items together.
+ - When changing a picture, the previous one was not always selected in
+ the file manager window.
+ - Duplicating an item also duplicates the pictures that are managed by
+ GCstar.
+ - An extra dot was added on the end of borrowers email when sending a
+ message.
+ - The option to use big pictures from websites were ignored when
+ importing from a list of name or from a directory.
+ - .tar.gz import was failing for default collections with added fields.
+ - Exporting from command line didn't copy the pictures.
+ - Bug fixed in some website plugins:
+ All Tvdb plugins (TV shows episodes)
+ Allocine (Movies - FR)
+ Bedetheque (Comics - FR). Thanks to Ogddit
+ Cinemotions (Movies - FR)
+ Fnac (Books - FR)
+ JeuxVideo.com (Video games - FR)
+
+-------------------------------------------------------------------
+
+1.4.1
+
+ * New plugin to import collections from MyMovies done by Rob Maas.
+
+ * Missing translations added for Greek and Polish.
+
+ * Bugs fixed
+ - Music collections were corrupted.
+ - Export plugins had problems with pictures without suffixes.
+ - Option to fetch big pictures from websites was hidden on Windows
+ systems.
+ - A few texts were left untranslated.
+ - Bug fixed in image mode when updating an item and filtering.
+ - Bug fixed in some website plugins:
+ - Amazon (Video games - FR)
+ - Fnac (Books - FR)
+
+-------------------------------------------------------------------
+
+1.4.0
+
+ * Default models can be modified through the graphical user interface
+ to add some user-defined fields. These fields will be in separate tabs
+ (one for each group) or in expanders depending on the kind of panel used.
+ These additional fields are stored in the collection itself to let users
+ share it between different machines/systems.
+
+ * New default models to manage comic books and episodes of TV shows.
+
+ * New translations
+ - Ukrainian translation added thanks to Ailandar.
+ - Hungarian translation added thanks to Takács László Krisztián.
+ - Greek translation added thanks to Dimitri Glentadakis.
+
+ * Toolbar improvements
+ - User can choose what controls are shown and their order.
+ - Useful items from menus can also be used as buttons in toolbar.
+ - A quick search can be added to the toolbar.
+ - New controls can be added to change the list view or the information
+ layout.
+
+ * Options/preferences changes
+ - Number of columns in image mode can be automatically calculated by
+ GCstar.
+ - A language can be specified in the properties for a collection. It will
+ be used for spell checking.
+ - Tear-off menus can be disabled.
+ - Different sizes may be specified for pictures in image and detailed
+ modes.
+ - Behaviour of user specified programs has changed, now GCstar will use
+ the system default applications for any categories with an empty command.
+ This allows the user to override the application for individual formats,
+ while leaving the other applications at the default.
+ - Added the option for a user-specified image editor.
+
+ * Search improvements
+ - Users can save an advanced search or the current one to create a
+ filter.
+ - New kinds of comparison in advanced search: 'Does not contain' and
+ 'Regular expression'.
+ - An option has been added in advanced search to select if it should be
+ case-sensitive or not.
+ - Another option in advanced search is available to ignore accents and
+ other diacritics.
+ - When comparison is 'Range', there are 2 fields to enter values in
+ criteria of advanced search.
+ - An option has been added in find and replace to select if it should
+ be case-sensitive or not.
+ - Performance enhancements.
+
+ * User interface changes
+ - New default images when none is specified.
+ - User can change default picture in the collection properties.
+ - Main picture for some default collections can be flipped to see back.
+ Flipping is done by clicking on the button that appears when hovering
+ picture or by pressing F or BackSpace when it is active.
+ - Ratings are now shown graphically, with a new star-rating control.
+ - Fields selections are done through a hierarchical view.
+ - Standard confirmation is used when trying to overwrite a file.
+ - Window title conforms to GNOME HIG with collection name first.
+ - Right clicking on an image field gives the option to open with an image
+ editor. If Gnome2::VFS is present, this list will be populated with
+ all installed applications associated with images on the system.
+ - The button linking to the web page displays the plugin used to fetch
+ the information.
+
+ * Export/Import/Fetch/Extract changes
+ - Information could be extracted from audio CDs using FreeDB thanks to
+ DomiX.
+ - It's possible to add items or to create a new collection of movies or
+ music from files in a directory (Menu File > Import > Folder).
+ - A new option is available to fetch big pictures when available. For
+ the moment, it only has some effect with:
+ JeuxVideo.com (Video games - FR)
+ MobyGames (Video games - EN)
+ - The order for sorting can be specified when exporting.
+ - The HTML export resizes the pictures using specified height.
+ - New template for HTML export for board games collections created by
+ Piwi.
+ - Default templates for HTML export are available even if specific ones
+ are defined.
+ - A charset can be speficied for CSV export.
+
+ * Default collections changes
+ - A back cover added to these collections: Video Games.
+ - New field 'Region' for movies collections.
+ - New field 'Origin' for music collections.
+
+ * New plugins to fetch information from websites:
+ - Books:
+ Chapitre.com and Le-Livre (FR) provided by TPF
+ - Comics:
+ Bedetheque (FR) provided by Chessnico
+ - Movies:
+ Onet and Stopklatka (PL) provided by Marek Cendrowicz
+ - Video games:
+ Amazon (JP) provided by TPF
+
+ * Other improvements
+ - It's possible to set an item as returned from the window displaying
+ the list of borrowed items. It also displays the lending history.
+ - When opening a collection that was created with a more recent
+ version, a warning is displayed to let the user know some data could
+ be lost if it is saved.
+ - Install script registers mime-types and .desktop files, to properly
+ associate .gcs files with the system.
+ - When trying to play the file associated to an item, an error is
+ displayed if it can't be found.
+
+ * Bugs fixed
+ - Borrowers filter was empty when using read-only layout.
+ - Problem fixed when there was special characters in the mail template
+ for borrowers.
+ - Date format was not used in the read-only panel, the advanced search
+ and the history of borrowings.
+ - There was a problem when filtering a collection with grouped items.
+ - Find and Replace was broken for complex fields.
+ - After importing, the item count was not updated in detailed list.
+ - Next button when using 'Many sites' for information fetching was broken.
+ - Prevented a problem with user-defined collections if a field has been
+ removed.
+ - .tar.gz export didn't add the model when it was a personal one with a
+ name.
+ - Problem fixed when grouping field contains a number between
+ parentheses.
+ - Sorting by a number or a date was incorrect when exporting.
+ - Bug fixed with import/export plugins that have a translated name when
+ using them from command line.
+ - Bug fixed with plugin importing from a list of name when using it
+ from command line.
+ - When extracting information from a video file, nothing happened if
+ some values were not selected.
+ - With Tian and Tian-Mario templates for HTML exports, the internal
+ links were wrong.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ CulturaliaNet (Movies - ES)
+ FilmWeb (Movies - PL)
+ IMDb (Movies - EN)
+ JeuxVideo.com (Video games - FR)
+ JeuxVideo.fr (Video games - FR)
+ OFDb (Movies - DE)
+
+-------------------------------------------------------------------
+
+1.3.2
+
+ * Galician translation added thanks to Daniel Espineira.
+
+ * New plugin to fetch information from websites:
+ - Music: Discogs (EN) provided by TPF
+
+ * New template for HTML export: Float (Movies)
+
+ * Changes for fetching
+ - Rating is fetched from IMDb website (Movies - EN).
+ - Empty fields are not fetched.
+
+ * Bugs fixed
+ - There was a problem when grouping and with articles on the end.
+ - Bug occured when removing the last item of a group.
+ - Some invalid characters were added to collections.
+ - The date format was not used when exporting.
+ - Number of items in status bar was sometimes not updated.
+ - Decimal numbers were truncated in detailed list.
+ - Fields used to sort when exporting was not restored when exporting
+ again.
+ - 'Serie' was left untranslated in books collections.
+ - Correct order for Favourite and Keywords in Tags panel when
+ choosing items to display.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ BDGest (Books - FR)
+ DVDFr (Movies - FR)
+ FilmUP (Movies - IT)
+ JeuxVideo.com (Video games - FR)
+ JeuxVideo.fr (Video games - FR)
+ MusicBrainz (Music - EN)
+
+-------------------------------------------------------------------
+
+1.3.1
+
+ * New plugin to fetch information from websites:
+ - Video games:
+ Ludus (IT) provided by TPF
+ - Books:
+ ISBNdb (EN), Buscape (PT) and LiberOnWeb (IT) provided by TPF.
+
+ * Bugs fixed
+ - When modifying the cover picture from a window, it was not updated
+ in the main panel.
+ - For new books, Read field is initialized to 'not read'.
+ - Removing many items in picture mode sometimes failed.
+ - XML export plugin didn't list the default models and had problems
+ opening a specified one.
+ - Spelling checked is deactivated if required dictionary is not
+ installed instead of generating an error.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ Alapage (Video games - FR)
+ BDGest (Books - FR)
+ Gamespot (Video Games - EN)
+ JeuxVideo.com (Video games - FR)
+ JeuxVideo.fr (Video games - FR)
+ TricTrac (Boardgames - FR)
+
+--------------------------------------------------------------------
+
+1.3.0
+
+ * Multiple selections
+ - Many items may be selected in the list using Control and Shift keys.
+ They can be modified or deleted together.
+ - It is possible to select many items after searching on websites. All
+ of them will be added to current collection. Information for the
+ first one will be fetched in current item.
+
+ * Collections of board games added thanks to Zombiepig.
+
+ * Improvements for image mode
+ - It is possible to add an overlay picture in image mode to make them
+ look better.
+ - New skin has been added to image mode when using a background
+ picture: Glass and DarkGlass. They add some reflection under the
+ pictures.
+ - Improved look for borrowed items.
+ - A color could be used for selection, even with a background picture.
+
+ * New or changed fields
+ - For movies collections, the list of actors is now a real list. A
+ role can be attached to each actor.
+ - Some tags could be assigned to items. It is also possible to mark
+ some of them as favorites.
+
+ * Options/preferences changes
+ - A spelling checker is available for long text fields. It could be
+ activated or deactivated in the Features tab of preferences.
+ - User may change the accelerators associated to items in menus. The
+ menu should be highlighted, and then the keys to use should be
+ pressed.
+ - Users may choose the format to display dates. This format follows
+ the same rules as the one for strftime(3).
+ - A new option let users select what should be done when text in
+ expanders is too long.
+ - It's possible to define a cookie jar that will be used by the
+ fetch plugins who need it.
+ - A new skin has been added to read-only panels: Dark.
+ - In detailed mode, another field could be used to sort items grouped
+ in a parent item.
+ - Small reorganization in preferences window
+
+ * Advanced search improvements
+ - The fields for entering values are changed according to the expected
+ data. As an example, fields will have their histories when one
+ exists.
+ - Users could select to search in all of the fields for given text.
+
+ * New plugin to fetch information from websites:
+ - Board games:
+ Board Game Geek (EN) provided by Zombiepig
+ Reservoir Jeux and Tric Trac (FR) provided by Florent
+ - Movies:
+ NasheKino and Animator (RU) provided by zserghei
+
+ * CSV import
+ - Some fields could be ignored.
+ - A charset could be specified.
+
+ * Command line
+ - A new command line option --list-plugins is available to list all
+ the plugins of a given collection type.
+ - When using a wrong name for a plugin in command line, an explicit
+ error is displayed.
+ - Better management of pictures.
+
+ * Bugs fixed
+ - Default shortcut to add a new item has been changed from Ctrl-A to
+ Ctrl-T. Then Ctrl-A is available again for selecting all text.
+ - The tooltip in results for web searches is hidden when clicking on
+ it.
+ - When canceling creation of a new collection, current one was closed.
+ - Drag and drop of a picture works also when the path contains some
+ spaces.
+ - Picture selection is done by opening the previously used directory
+ if there is no picture.
+ - Some plugins for website did not set a suffix for fetched pictures.
+ - Bugs fixed with sort when exporting.
+ - After import, the number of items in status bar was not changed when
+ needed.
+ - Bug fixed when importing from a list of items if a plugin returned
+ no picture.
+ - Bug fixed in some website plugins:
+ All Amazon plugins
+ Biblioteka Narodowa (Books - PL)
+ Allmovie (Movies - EN)
+ Beyaz Perde (Movies - TR)
+ Alapage (Video Games - FR)
+ Gamespot (Video Games - EN)
+
+--------------------------------------------------------------------
+
+1.2.2
+
+ * Bug fixed in some plugins:
+ IMDb (Movies - EN)
+ MusicBrainz (Music - EN)
+
+ * Bugs fixed with extraction of information from playlist for
+ music collections.
+
+ * Bug fixed when filtering soon after startup a collection
+ displayed in picture mode.
+
+ * In picture mode, if modification on an item changed its
+ place in the list, it was not selected after clicking on
+ it.
+
+ * When updating GCstar, the extract plugins are also updated
+ if required.
+
+--------------------------------------------------------------------
+
+1.2.1
+
+ * New plugin to fetch information from Allmovie (EN) provided
+ by Zombiepig.
+
+ * 2 extra spaces were added on the end of long text fields
+ when saving.
+
+ * Size of the fields list in the settings for user-defined
+ collections could be changed.
+
+ * In preferences, toolbar size could be set to system setting
+ instead of a specific value.
+
+ * Labels for Tonight and Play buttons were always shown, even
+ if the user choose to display only icons in toolbars (this is
+ a system setting, not a GCstar's one).
+
+ * A bug prevented a user from creating a new kind of collection
+ on startup.
+
+--------------------------------------------------------------------
+
+1.2.0
+
+ * Bug fixed when fetching information for an item while in
+ image mode.
+
+ * If a fetch was canceled and a different one was launched,
+ the previous results were used again.
+
+ * When changing the main picture of an item, it was loaded
+ two times.
+
+ * Bug fixed in some plugins because of websites changes:
+ Allocine (Movies - FR)
+ CSFD.cz (Movies - CS)
+ IMDb (Movies - EN)
+
+ * Some missing translations have been added to
+ DE, ES and SV versions.
+
+--------------------------------------------------------------------
+
+1.2.0.beta3
+
+ * Correct number of displayed items is used in status
+ bar when filtering in image mode.
+
+ * An error is displayed when trying to export from
+ command line to HTML with a non existing model.
+
+ * The query field in the window where the user may
+ select the plugin to use was sometimes not initialized.
+
+ * It's now possible to perform a quick search also in image
+ mode. Quick search begins when the user enters some characters
+ while the list is active.
+
+ * These keys are managed in picture mode: Page Up, Page Down,
+ Home and End.
+
+ * When a critical error occurs, user may report a bug
+ semi-automatically.
+
+ * The progress bars in splash screen and in status area
+ of main window are more accurate.
+
+ * Search dialog was not centered on first opening. The same
+ applied to the window used to create a new collection type.
+
+ * Bug fixed in some plugins because of websites changes:
+ Alapage (Books - FR)
+ Cinemotions (Movies - FR)
+ Dicshop (Movies - SV)
+ Merlin (Books - PL)
+
+ * Some missing translations have been added to
+ FR, SV, PL and CA versions.
+
+--------------------------------------------------------------------
+
+1.2.0.beta2
+
+ * When the picture was hidden in one of the default
+ collections, all the fields next to it were also
+ hidden.
+
+ * When using some searches of filters, if nothing was
+ displayed, the panel displayed the warning message
+ instead of the "View All" button.
+
+ * Escape XML entities in long text fields for saved
+ collections.
+
+ * Fixed a bug when there is no active collection and
+ another one could not be opened.
+
+ * Fixed a potential problem when using command line actions
+ if no explicit model has been specified.
+
+ * HTML export on command line has a default template
+
+--------------------------------------------------------------------
+
+1.2.0.beta1
+
+ * Swedish translation added thanks to Ramon Radnoci.
+
+ * Indonesian translation added thanks to Nugrahadi.
+
+ * Brazilian Protuguese translation added thanks to Daniel Valença.
+
+ * Wine collections added thanks to Yves Martin.
+
+ * New plugin to fetch information from websites:
+ Movies:
+ DVDSpot (EN)
+ provided by Marc Deslauriers
+ CSFD.cz (CS)
+ provided by Pajdus
+ Beyaz Perde (TR)
+ provided by Zuencap
+ MovieMeter (NL)
+ provided by MaTiZ
+ Port.hu (HU)
+ provided by an anonymous contributor
+ Books:
+ BDGest (FR)
+ provided by Rataflo
+ National Library, Merlin, NUKat and Mareno (PL)
+ provided by WG
+ Bokkilden (NO)
+ provided by Tian
+ Fnac and Mediabooks (PT), Bol and InternetBookShop (IT),
+ provided by TPF
+ Video Games:
+ DicoDuNet (FR)
+ provided by TPF
+
+ * New plugin to export to Latex format created by Zserghei.
+
+ * When creating a new collection or at first startup, user can
+ import an existing collection with some of the available
+ plugins.
+
+ * When grouping items, a new option is available to add the
+ number of items in a category.
+
+ * An option has been added for grouping of orphaned
+ items or not. Items whitout a master, when grouping is
+ activated, are together on the end of the list by
+ default. But they could be mixed with masters for
+ ordering.
+
+ * In detailed view, the order of the columns could be
+ changed using drag and drop on their headers.
+
+ * It's possible to select a field for sorting when
+ exporting (if applicable).
+
+ * Only the required pictures are copied during export.
+
+ * New field in movies collections to store a numeric
+ identifier. The unique identifier displayed next to
+ the title is now read-only.
+
+ * Added a field to collections of video games: Executable.
+ This field could contain the path to a program that
+ could be launched directly from a Play button in
+ GCstar's toolbar.
+
+ * When changing field to use for fetching, the value from
+ panel is used.
+
+ * Delete key removes current item in multiple lists.
+
+ * When opening window to perform searches, the first
+ field has focus.
+
+ * Removed dot from picture format when exporting to
+ Tellico (Patch from Robby Stephenson).
+
+ * Use proxy for updates (Patch from Javier Donaire).
+
+ * Bug fixed in some plugins because of websites changes:
+ All Amazon plugins
+ IMDb (Movies - EN)
+ Allocine (Movies - FR)
+ FilmUP (Movies - IT)
+ Alapage, JeuxVideo.com (Games - FR)
+ Gamespot (Games - EN)
+ Adlibris (Books - FI, SV)
+ Casadelibro (Books - ES)
+
+ * Bug fixed when performing an update (gcstar -u) if
+ a new directory should be created.
+
+ * Bug fixed with plugin to import a collection
+ generated from Ant Movie Catalog that contains
+ some semicolons.
+
+ * Bug fixed in read only mode when data contains some
+ HTML tags.
+
+ * Bug fixed with the title of the window when using
+ "Tonight" feature.
+
+ * When opening a collection of a type different than the
+ current one, if a filter was present, nothing was
+ displayed.
+
+ * Updated bug report URL in man page and when using
+ -h or --help on command line.
+
+ * Reduced time for startup and to load a collection
+
+--------------------------------------------------------------------
+
+1.1.1
+
+ * Bug fixed when items are grouped and the grouping field is
+ changed.
+
+ * FilmWeb plugin was not working anymore because of website
+ changes.
+
+ * Better layout for Paths tab in preferences.
+
+--------------------------------------------------------------------
+
+1.1.0
+
+ * Instead of specifying many external applications (for web
+ pages, video and audio files), you may use the settings
+ defined by the system. It works for any Unix (including
+ GNU/Linux) using XFCE, Gnome or KDE) and also for MacOS X and
+ for Microsoft Windows.
+
+ * Numismatic collections added thanks to szdavid.
+ They could be imported and exported from/to Tellico.
+
+ * Catala translation added thanks to Ponç J. Llaneras.
+
+ * Arabic translation added thanks to Muhammad Bashir Al-Noimi.
+
+ * New plugins to get information from websites. All of them
+ are made by TPF.
+ Books: Adlibris (FI, SV), Casadelibro (ES), Fnac (FR)
+ Video games: Alapage (FR), Amazon (US, DE, FR, UK)
+
+ * The directory used to store pictures could be specific to a
+ collection. It's defined in the collection properties
+ (File menu > Properties)
+
+ * Path of directory used to store pictures could contain some
+ special text.
+ - %WORKING_DIR% or . will be replaced with collection directory
+ (use only on beginning of path)
+ - %FILE_BASE% will be replaced by collection file name
+ without suffix (.gcs)
+ Default value (that could be restored) is now:
+ ./%FILE_BASE%_pictures/
+
+ * A new type of field is available for user-defined
+ collections: "Dependant on other fields". It will be generated
+ thanks to other fields. The Default value should then contain the
+ format were %Name of other field% will be replaced with the
+ value of the field.
+
+ * New fields for default collections: Add date. Its default
+ value when adding a new item is the current date.
+
+ * If the Fetch button is clicked with right button of the mouse,
+ the plugin to use will be asked to the user, even if one is
+ specified in preferences.
+
+ * When a value is truncated in web search results, a tooltip
+ popup containing the whole text is displayed when the mouse
+ pointer is over it.
+
+ * Some options not useful for most users are hidden until the
+ expert mode is activated
+
+ * In dialog for date selection, double-clicking on a date
+ validate it.
+
+ * When importing from GCfilms, it's possible to reuse unique
+ identifiers instead of generating them.
+
+ * Image was not updated in images list when downloading
+ information.
+
+ * Bug fixed when dropping a picture dragged from a web page.
+
+ * Number of items was not updated when an item was removed.
+
+ * Windows installation program doesn't install dependencies.
+ More information here:
+ http://wiki.gcstar.org/en/install_windows
+
+--------------------------------------------------------------------
+
+Task and bugs number refer to items on Gna! project page:
+https://gna.org/projects/gcstar/
+
+1.0.0
+
+ * Management of music collection.
+
+ * Extraction of video information from a file has been
+ re-added (it has been removed when creating GCstar
+ from GCfilms).
+ (bug #7157)
+
+ * Plugin for music collection using MusicBrainz website.
+
+ * Import and export music collections from and to Tellico.
+
+ * Information about an album could be extracted from a
+ playlist.
+
+ * New plugin for video games using MobyGames (EN) made by TPF.
+
+ * New plugin for books using Alapage (FR) made by TPF.
+
+ * New plugin for movies using MovieCovers.com (FR) made by
+ Patrick Fratczak.
+
+ * It's possible to search using EAN or UPC code (barcode)
+ instead of ISBN for books using one of the plugins for Amazon.
+
+ * In file properties dialog, there are also the full file
+ path, the file size and the number of items in the collection.
+
+ * Lists used for some data (such as genre for movies or codes
+ for video games) could be reordered using drag and drop.
+
+ * Widths of columns in detailed mode are saved when leaving the
+ application or opening another file.
+ (bug #7666)
+
+ * In list of plugins for web searches, the fields that could
+ be used for searches are displayed.
+
+ * New item in Help menu to display all the available plugins
+ for web searches.
+
+ * Templates provided for HTML export of music collections.
+
+ * New template for HTML export of book collections: FloFred
+ provided by Florent.
+
+ * --verbose option added to installation program.
+
+ * All Amazon plugins changed because of website changes.
+
+ * Patch from tiwek to get original titles from FilmWeb.
+
+ * Added in search dialog some information about the kind of
+ comparison that will be performed.
+
+ * When specifying a grouping field from toolbar, the master
+ is always auto-generated.
+ (bug #7500)
+
+ * Fixed bug with CVS import for collections that are not movies
+ collections.
+
+ * Fixed bug with character encoding in XML files.
+ (bug #7584)
+
+ * Fixed bug with installation program that prevented an upgrade
+ without manual removal of previous files.
+ (bug #7481)
+
+ * Fixed bugs with external programs that contains spaces in
+ their paths on Win32 systems.
+
+--------------------------------------------------------------------
+
+0.5.0
+
+ * Bookmarks management (Menu "My Collections").
+ It could be used to organize your collections and have
+ a quicker access to them from GCstar.
+
+ * New "Advanced" search where the user could define the filter
+ to use.
+
+ * Internet search could be made according to many fields. It
+ concerns for the moment only books collections where search
+ could be made using ISBN.
+ (bug #6898)
+
+ * Results of web search could be previewed.
+
+ * New import plugin to merge 2 GCstar collections.
+ (sr #1293)
+
+ * New plugins for video games using JeuxVideo.com (FR) website
+ provided by TPF.
+
+ * New plugins for books using Amazon.de (DE) website
+ provided by Frenkx.
+
+ * New plugins for books using Amazon.uk (EN) website.
+
+ * German translation updated by Frenkx.
+
+ * New item in "Help" menu to report a bug.
+
+ * ISBN field could contain an 'X' character.
+
+ * Bugs fixed with import plugins when inserting items in current
+ collection.
+
+ * Export plugin for .tar.gz also stores collection information
+ (description, owner,...)
+
+ * HTML template "Shelf" has a new feature. Information within a
+ group could be hidden or shown.
+
+ * Bug has been fixed for Windows installation program
+ (bug #7122)
+
+--------------------------------------------------------------------
+
+0.4.1
+
+ * Mail programs could be defined. They will be used to
+ send e-mails instead of Sendmail or direct SMTP server.
+ Default configuration provided for Sylpheed-Claws,
+ Thunderbird and Evolution.
+
+ * Search could be performed according to original
+ title for movies collections.
+ (sr #1246)
+
+ * Bug fixed with old HTTP::Headers versions.
+ (sr #1245)
+
+ * Bug fixed for Windows users with launch of external
+ programs.
+ (bug #6762)
+
+--------------------------------------------------------------------
+
+0.4
+
+ * Added books collection management.
+
+ * 2 plugins for books: Amazon.com (EN) and Amazon.fr (FR).
+
+ * Import book collections from Tellico and Alexandria.
+ Export book collections to Tellico.
+
+ * If grouping is done using a value that is a list, it will
+ be splitted. So an item will appear many times, for each
+ value.
+
+ * New command line options to execute some tasks automatically.
+ More information here:
+ http://www.gcstar.org/doc.execute
+
+ * "gcstar --help" is more verbose. A man page has also been
+ created.
+
+ * Borrowers information (Name and e-mail address) could be
+ imported from these formats: LDIF, Sylpheed-Claws, VCARD.
+
+ * Pictures could be saved with a file name that is prefixed
+ with the item title or name (instead of gcstar_).
+ (sr #1175)
+
+ * It is now possible to set some properties on a collection
+ (a name, owner name and e-mail address, description). It is
+ done through File menu, Properties item.
+
+ * A play button is in toolbar for collections that needs one
+ (as for movies collections). It could also be set for
+ user-defined collections.
+
+ * For user-defined collections, a read-only layout is also
+ generated.
+
+ * HTML export is also possible for user-defined collections.
+
+ * Saving is faster and gives more feedback to user.
+
+ * When importing data from Internet, if the preview for an
+ image is used, it won't be downloaded only once.
+
+ * Some templates used by HTML export have been made valid
+ XHTML 1.0 Strict: Shelf, Tabs, Tian, Tian-Mario
+
+ * New option in preferences to set if the previous
+ collection should be loaded on startup.
+
+ * Locked status is stored in the collection itself and not
+ globally.
+
+ * Force UTF-8 encoding for models files.
+ (bug #6545)
+
+ * Bug fixed with search.
+ (bug #6536)
+
+ * Bug fixed when no user-defined collection exists.
+ (bug #6520)
+
+--------------------------------------------------------------------
+
+0.3
+
+ * It is now possible to create personal collections.
+ Such a collection will contain some fields set by the
+ user according to her or his needs. More information
+ in the documentation:
+ http://www.gcstar.org/doc.models.en.php
+
+ * If something is changed in a collection and the
+ auto-save feature is not activated, the user is warned
+ when closing the collection.
+
+ * Installer failed when an unsupported locale was used.
+ (bug #6324)
+
+ * CSV import didn't correcty set the charset to UTF-8.
+
+ * Added an update shortcut in Start menu for Windows users.
+
+ * HTML templates was not listed on Windows systems.
+ (bug #6366)
+
+ * Website plugins works also if sites send pages in a compressed
+ format (useful for AniDB that was broken).
+
+--------------------------------------------------------------------
+
+0.2
+
+ * Added Video games management: GCgames.
+
+ * 2 plugins for video games to import from websites:
+ GameSpot.com (EN) and JeuxVideo.fr (FR). They also
+ import screenshots and the tips that could be found.
+
+ * Added Turkish translation thanks to KaraGarga.
+
+ * Collections member could be grouped directly from toolbar.
+ More options are available for different kind of grouping
+ in preferences dialog.
+
+ * A picture could be dragged and dropped from a web browser
+ to any displayed picture (movie cover for GCfilms,
+ box picture or screenshot for GCgames).
+
+ * Bug fixes and performances enhancements.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/README b/README
new file mode 100644
index 0000000..a206948
--- /dev/null
+++ b/README
@@ -0,0 +1,37 @@
+GCstar, personal collections manager
+
+Application useful to manage your collections.
+More information available on http://www.gcstar.org/
+
+Install
+-------
+
+You need to have Gtk2, perl and perl-gtk2 on your system.
+
+Then launch install script (being root for a system wide installation).
+Here are available options:
+
+Graphic mode installation:
+./install
+
+Text mode installation:
+./install --text
+
+Automatic installation in a directory
+./install --prefix=/path/to/directory
+
+
+Contribution
+------------
+
+If you want to contribute to GCstar, consult this page:
+
+http://gcstar.org/contribute
+
+
+Bug submission
+--------------
+
+To submit a bug, go there:
+
+http://forums.gcstar.org/viewforum.php?id=4
diff --git a/README.fr b/README.fr
new file mode 100644
index 0000000..19d59a2
--- /dev/null
+++ b/README.fr
@@ -0,0 +1,37 @@
+GCstar, gestionnaire de collections personnelles
+
+Application permettant de gérer ses collections.
+Plus d'informations : http://www.gcstar.org/
+
+Installation
+------------
+
+Vous devez avoir au préalable installé Gtk2, perl et perl-gtk2.
+Puis lancez le script install comme indiqué ci-dessous.
+Pour faire une installation sur tout le systeme, lancez le en tant que root.
+
+Pour installer en mode graphique :
+./install
+
+Pour installer en mode texte :
+./install --text
+
+Pour automatiquement installer dans un répertoire :
+./install --prefix=/chemin/vers/le/repertoire
+
+
+Contribution
+------------
+
+Si vous souhaitez contribuer à GCstar, consultez cette page :
+
+http://gcstar.org/contribute
+
+
+Rapport d'anomalie
+------------------
+
+Pour soumettre un rapport d'anomalie, rendez vous ici :
+
+http://forums.gcstar.org/viewforum.php?id=9
+
diff --git a/bin/gcstar b/bin/gcstar
new file mode 100644
index 0000000..4f83b71
--- /dev/null
+++ b/bin/gcstar
@@ -0,0 +1,358 @@
+#!/usr/bin/perl
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+my $initTime;
+$ENV{GCS_PROFILING} = 0 if ! exists $ENV{GCS_PROFILING};
+if ($ENV{GCS_PROFILING} > 0)
+{
+ eval 'use Time::HiRes';
+ eval '$initTime = [Time::HiRes::gettimeofday()]';
+}
+
+my $VERSION = '1.7.0';
+
+my $MULTI_PROCESS = ((!exists $ENV{GCS_PROFILING}) || ($ENV{GCS_PROFILING} == 0));
+
+use Getopt::Long;
+use File::Path;
+use File::Spec;
+use FindBin qw($RealBin);
+use POSIX qw(locale_h);
+
+$ENV{GCS_BIN_DIR} = $RealBin;
+($ENV{GCS_LIB_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/lib\/gcstar/;
+($ENV{GCS_SHARE_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/share\/gcstar/;
+use lib File::Spec->canonpath("$RealBin/../lib/gcstar");
+if (exists $ENV{PAR_TEMP})
+{
+ unshift @INC, "$RealBin/../lib/gcstar";
+}
+
+# For win32, redirect all the output to files
+if ($^O =~ /win32/i)
+{
+ my $logdir = $ENV{'APPDATA'};
+ $logdir =~ s/\\/\//g;
+ mkpath $logdir;
+ close(STDOUT);
+ close(STDERR);
+ open(STDOUT, ">$logdir/gcstar.log");
+ open STDERR, ">&STDOUT";
+ select STDERR; $| = 1;
+}
+
+#XDG stuff
+my $home = $ENV{'HOME'};
+$home = $ENV{'APPDATA'} if ($^O =~ /win32/i);
+$home =~ s/\\/\//g if ($^O =~ /win32/i);
+
+$ENV{XDG_CONFIG_HOME} = $home.'/gcstar/config' if ($^O =~ /win32/i);
+$ENV{XDG_CONFIG_HOME} = $home.'/.config' if ! exists $ENV{XDG_CONFIG_HOME};
+
+$ENV{XDG_DATA_HOME} = $home.'/gcstar' if ($^O =~ /win32/i);
+$ENV{XDG_DATA_HOME} = $home.'/.local/share' if ! exists $ENV{XDG_DATA_HOME};
+
+$ENV{GCS_CONFIG_HOME} = $ENV{XDG_CONFIG_HOME}.'/gcstar';
+$ENV{GCS_CONFIG_HOME} = $ENV{XDG_CONFIG_HOME} if ($^O =~ /win32/i);
+
+# Migrate settings from old windows data path if required
+if (($^O =~ /win32/i) && !(-d $ENV{XDG_DATA_HOME}))
+{
+ if (-d $RealBin.'/../config')
+ {
+ print ("Need to migrate settings from old gcstar data store\n");
+ mkpath $ENV{XDG_CONFIG_HOME};
+ mkpath $ENV{XDG_DATA_HOME};
+ my $winRealBin = $RealBin;
+ $winRealBin =~ s/\//\\/g;
+ my $winXDGConfig = $ENV{XDG_CONFIG_HOME};
+ $winXDGConfig =~ s/\//\\/g;
+ my $winXDGData = $ENV{XDG_CONFIG_HOME};
+ $winXDGData =~ s/\//\\/g;
+ system "xcopy /Y \"".$winRealBin."\\..\\config\" \"".$winXDGConfig."\"";
+ system "xcopy /Y \"".$winRealBin."\\..\\data\" \"".$winXDGData."\"";
+ }
+}
+
+mkpath $ENV{XDG_CONFIG_HOME};
+mkpath $ENV{XDG_DATA_HOME};
+
+mkdir $ENV{GCS_CONFIG_HOME};
+mkdir $ENV{GCS_CONFIG_HOME}.'/GCModels/';
+$ENV{GCS_CONFIG_FILE} = $ENV{GCS_CONFIG_HOME}.'/GCstar.conf';
+$ENV{GCS_DATA_HOME} = $ENV{XDG_DATA_HOME}.'/gcstar';
+$ENV{GCS_DATA_HOME} = $ENV{XDG_DATA_HOME} if ($^O =~ /win32/i);
+mkdir $ENV{GCS_DATA_HOME};
+
+use GCOptions;
+my $options = new GCOptionLoader($ENV{GCS_CONFIG_FILE}, 1);
+
+my $lang = $options->getFullLang;
+$ENV{LANG} = $lang;
+$ENV{LANGUAGE} = $lang;
+$ENV{LC_ALL} = $lang;
+$ENV{LC_CTYPE} = $lang;
+setlocale(LC_ALL, $lang);
+
+sub usage
+{
+ print "Usage: $0 [-u UPDATE-OPTIONS] [-x EXECUTE-OPTIONS] [FILENAME]
+
+Launch GCstar, a personal collection manager. Without any option, it will open
+FILENAME if specified or the previously opened file.
+
+Update options:
+
+ -u, --update Tell GCstar to look for available updates
+ -a, --all Update all components
+ -c, --collection Update collection models
+ -w, --website Update plugins to download information
+ -i, --import Update plugins to import data
+ -e, --export Update plugins to export data
+ -l, --lang Update translations
+ -n, --noproxy Don't ask for a proxy
+
+Execute options:
+
+ -x, --execute Enter non-interactive mode
+ -c, --collection MODEL Specify the collection type
+ -w, --website PLUGIN Specify the plugin to use to download information
+ -i, --import PLUGIN Specify the plugin to use to import a collection
+ -e, --export PLUGIN Specify the plugin to use to export the collection
+ -f, --fields FILENAME File containing fields list to use for import/export
+ -o, --output FILENAME Write output in FILENAME instead of standard output
+ --download TITLE Search for the item with TITLE as name
+ --importprefs PREFERENCES Preferences for the import plugin
+ --exportprefs PREFERENCES Preferences for the export plugin
+ --list-plugins List all the plugins available to download information
+
+ Preferences for import/export plugins are specified using this schema:
+ \"Key1=>Value1,Key2=>Value2\"
+
+Environment variables:
+
+ \$HOME Used to define following variables if needed
+ \$XDG_CONFIG_HOME Where configuration files should be stored
+ If not defined: \$HOME/.config
+ \$XDG_DATA_HOME Where some data will be stored
+ If not defined: \$HOME/.local/share
+
+Bugs reporting:
+
+ To report bugs, please use this forum:
+ http://forums.gcstar.org/viewforum.php?id=4
+
+";
+}
+
+sub version
+{
+ print "GCstar $VERSION\n";
+}
+
+Getopt::Long::Configure ('bundling');
+my ($help, $version, $update, $toBeUpdated, $noProxy, $listPlugins) = (0, 0, 0, {}, 0);
+my ($collection, $website, $import, $export) = (undef, undef, undef, undef);
+my ($execute, $title, $output, $inPrefs, $outPrefs, $fields) = (0, '', '', '', '', '');
+(usage, exit 1) if !GetOptions("h|help" => \$help,
+ "v|version" => \$version,
+ "u|update" => \$update,
+ "x|execute" => \$execute,
+ "a|all" => \$toBeUpdated->{all},
+ "c|collection:s" => \$collection,
+ "w|website:s" => \$website,
+ "i|import:s" => \$import,
+ "e|export:s" => \$export,
+ "l|lang" => \$toBeUpdated->{lang},
+ "n|noproxy" => \$noProxy,
+ "download=s" => \$title,
+ "o|output=s" => \$output,
+ "importprefs=s" => \$inPrefs,
+ "exportprefs=s" => \$outPrefs,
+ "f|fields=s" => \$fields,
+ "list-plugins" => \$listPlugins,
+ );
+
+my $atLeastOne = 0;
+foreach (keys %$toBeUpdated)
+{
+ $atLeastOne = 1 if $toBeUpdated->{$_};
+}
+(usage, exit 1) if $help || ($atLeastOne && !$update);
+(version, exit 0) if $version;
+
+if ($update)
+{
+ eval '
+ use GCUpdater;
+ use GCLang;
+ ';
+ my $langContainer = $GCLang::langs{$options->lang};
+ $toBeUpdated->{all} = 1 if !$atLeastOne;
+ $toBeUpdated->{models} = defined($collection);
+ $toBeUpdated->{plugins} = defined($website);
+ $toBeUpdated->{import} = defined($import);
+ $toBeUpdated->{export} = defined($export);
+ my $updater = new GCTextUpdater($langContainer,
+ $ENV{GCS_LIB_DIR},
+ $toBeUpdated,
+ $noProxy,
+ $VERSION);
+ $updater->update;
+ exit 0;
+}
+elsif ($execute)
+{
+ use GCCommandLine;
+
+ my $execution = new GCCommandExecution($options,
+ $collection,
+ $website,
+ $import,
+ $export,
+ $output);
+ if ($listPlugins)
+ {
+ if ($collection)
+ {
+ $execution->listPlugins;
+ exit 0;
+ }
+ else
+ {
+ print "A kind of collection should be specified (with -c) when using --list-plugins\n";
+ exit 1;
+ }
+ }
+
+ if ($ARGV[0])
+ {
+ if ($import)
+ {
+ $execution->import($ARGV[0], $inPrefs);
+ }
+ else
+ {
+ $execution->open($ARGV[0]);
+ }
+ }
+ $execution->setFields($fields) if $fields;
+ $execution->load($title) if $title;
+ if ($export)
+ {
+ $execution->export($outPrefs);
+ }
+ else
+ {
+ $execution->save;
+ }
+ exit 0;
+}
+if ($ARGV[0])
+{
+ # We have to make it absolute if needed
+ my $file = $ARGV[0];
+ $file = File::Spec->rel2abs($file)
+ if (!File::Spec->file_name_is_absolute($file));
+ $options->file($file);
+}
+
+my $pid;
+if ($MULTI_PROCESS)
+{
+ pipe(RCOMMAND, WCOMMAND);
+ pipe(RDATA, WDATA);
+ if ($^O !~ /win32/i)
+ {
+ if (!($pid = fork))
+ {
+ use GCPlugins;
+ close WCOMMAND;
+ close RDATA;
+ my $searchJob = new GCPluginJob(\*RCOMMAND, \*WDATA);
+
+ $searchJob->run;
+ }
+ }
+}
+
+use Gtk2;
+use GCMainWindow;
+
+my %searchJob = ();
+
+if ($MULTI_PROCESS)
+{
+ close RCOMMAND;
+ close WDATA;
+ %searchJob = (
+ pid => $pid,
+ command => \*WCOMMAND,
+ data => \*RDATA
+ );
+
+ if ($^O =~ /win32/i)
+ {
+ close WCOMMAND;
+ close RDATA;
+ }
+}
+Gtk2->init;
+my $window = new GCFrame($options, $VERSION, \%searchJob);
+
+#Gtk2->set_locale;
+Gtk2->main;
+
+if ($^O =~ /win32/i)
+{
+ # We store the language in .bat file if possible
+
+ my $batch = 'gcstar.bat';
+ if (-w $batch)
+ {
+ local $/ = undef;
+ open BATCH, "<$batch";
+ my $lang = $options->lang;
+ my $bat = <BATCH>;
+ $bat =~ s/LANG=.*$/LANG=$lang/m;
+ close BATCH;
+ open BATCH, ">$batch" or die "Cannot open .bat to save language\n";
+ print BATCH $bat;
+ close BATCH;
+ }
+ close(STDOUT);
+ close(STDERR);
+}
+
+if ($ENV{GCS_PROFILING} > 0)
+{
+ my $elapsed;
+ eval '$elapsed = Time::HiRes::tv_interval($initTime)';
+ print "Elapsed : $elapsed\n";
+}
+
+0;
diff --git a/install b/install
new file mode 100755
index 0000000..6bedf76
--- /dev/null
+++ b/install
@@ -0,0 +1,788 @@
+#!/usr/bin/perl
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use FindBin qw($RealBin);
+use File::Copy;
+use File::Find;
+use File::Path;
+use File::Basename;
+
+use lib "$RealBin/lib/gcstar";
+use GCLang;
+
+sub usage
+{
+ print "Usage: install [options]\n";
+ print " --text Force text installation\n";
+ print " --prefix=PREFIX Installs GCstar in PREFIX [/usr/local]\n";
+ print " --nomenu Don't install menu entry\n";
+ print " --noclean Don't remove previous installation files\n";
+ print " --verbose Display more information during installation\n";
+ print " --remove Remove GCstar from system\n";
+ print " --help Show this message\n";
+}
+
+use Getopt::Long;
+my ($withHelp, $withText, $withPrefix, $withoutMenu, $withoutClean, $verbose, $remove);
+(usage, exit 1) if !GetOptions("help" => \$withHelp,
+ "text" => \$withText,
+ "prefix=s" => \$withPrefix,
+ "nomenu" => \$withoutMenu,
+ "noclean" => \$withoutClean,
+ "verbose" => \$verbose,
+ "remove" => \$remove);
+
+(usage, exit 1) if ($ARGV[0]);
+
+sub verbosePrint
+{
+ print @_,"\n" if $verbose;
+}
+
+our $binName = 'gcstar';
+
+chdir $RealBin;
+$ENV{GCS_LIB_DIR} = 'lib/gcstar';
+
+our %lang;
+
+GCLang::loadLangs;
+(my $langCode = uc $ENV{LANG}) =~ s/(^.{2}).*$/$1/;
+$langCode = 'EN' if !$langCode || !$GCLang::langs{$langCode};
+%lang = %{$GCLang::langs{$langCode}};
+
+our $type = 'graphic';
+
+$type = 'text' if (($withPrefix) || ($withHelp) || ($withText) || ($withoutMenu) || ($withoutClean) || ($remove));
+
+sub checkDependencies;
+
+our ($mand, $opt, $optModules) = checkDependencies('GC');
+
+sub clean
+{
+ my $baseDir = shift;
+
+ my $home = $ENV{HOME};
+
+ verbosePrint $lang{InstallCleanDirectory}, $baseDir;
+ foreach (glob $baseDir.'/lib/gcstar/*')
+ {
+ unlink if -f $_;
+ if (-d _)
+ {
+ unlink foreach (glob "$_");
+ }
+ }
+
+ foreach (glob $baseDir.'/share/gcstar/*')
+ {
+ unlink if -f $_;
+ if (-d _)
+ {
+ unlink foreach (glob "$_");
+ }
+ }
+
+ unlink $baseDir.'/bin/'.$binName;
+ unlink $baseDir.'/man/man1/'.$binName.'.1.gz';
+
+ # remove menu and mime items
+
+ if (-w '/usr/share/applications')
+ {
+ unlink '/usr/share/applications/gcstar.desktop';
+ }
+ else
+ {
+ unlink $home.'/.local/share/applications/gcstar.desktop';
+ }
+
+ unlink '/usr/share/pixmaps/gcstar.png'
+ if (-w '/usr/share/pixmaps');
+
+ # Remove icons
+ unlink '/usr/share/icons/hicolor/16x16/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ unlink '/usr/share/icons/hicolor/22x22/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ unlink '/usr/share/icons/hicolor/24x24/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/24x24/apps');
+ unlink '/usr/share/icons/hicolor/32x32/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/32x32/apps');
+ unlink '/usr/share/icons/hicolor/36x36/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/36x36/apps');
+ unlink '/usr/share/icons/hicolor/48x48/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/48x48/apps');
+ unlink '/usr/share/icons/hicolor/64x64/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/64x64/apps');
+ unlink '/usr/share/icons/hicolor/72x72/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/72x72/apps');
+ unlink '/usr/share/icons/hicolor/96x96/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/96x96/apps');
+ unlink '/usr/share/icons/hicolor/128x128/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/128x128/apps');
+ unlink '/usr/share/icons/hicolor/192x192/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/192x192/apps');
+ unlink '/usr/share/icons/hicolor/256x256/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/256x256/apps');
+ unlink '/usr/share/icons/hicolor/scalable/apps/gcstar.svg'
+ if (-w '/usr/share/icons/hicolor/scalable/apps');
+ system 'gtk-update-icon-cache /usr/share/icons/hicolor';
+
+ # Remove mime type
+ unlink '/usr/share/mime/packages/gcstar.xml'
+ if (-w '/usr/share/mime/packages');
+
+ system 'update-desktop-database';
+ system 'update-mime-database /usr/share/mime';
+
+}
+
+sub recursiveCopy
+{
+ my ($orig, $dest) = @_;
+
+ mkpath $dest;
+
+ foreach (glob $orig.'/*')
+ {
+ next if /CVS/;
+ copy $_, $dest if -f $_;
+ if (-d $_)
+ {
+ my $dir = basename($_);
+ recursiveCopy($_, $dest.'/'.$dir);
+ }
+ }
+}
+
+sub installMenu
+{
+ my $home = $ENV{HOME};
+
+ if (-w '/usr/share/applications')
+ {
+ verbosePrint $lang{InstallCopyDesktop}, '/usr/share/applications';
+ copy 'share/applications/gcstar.desktop', '/usr/share/applications';
+ }
+ else
+ {
+ verbosePrint $lang{InstallCopyDesktop}, $home.'/.local/share/applications';
+ copy 'share/applications/gcstar.desktop', $home.'/.local/share/applications';
+ }
+
+ copy 'share/gcstar/icons/gcstar_48x48.png', '/usr/share/pixmaps/gcstar.png'
+ if (-w '/usr/share/pixmaps');
+
+ copy 'share/gcstar/icons/gcstar_16x16.png', '/usr/share/icons/hicolor/16x16/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ copy 'share/gcstar/icons/gcstar_22x22.png', '/usr/share/icons/hicolor/22x22/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/16x16/apps');
+ copy 'share/gcstar/icons/gcstar_24x24.png', '/usr/share/icons/hicolor/24x24/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/24x24/apps');
+ copy 'share/gcstar/icons/gcstar_32x32.png', '/usr/share/icons/hicolor/32x32/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/32x32/apps');
+ copy 'share/gcstar/icons/gcstar_36x36.png', '/usr/share/icons/hicolor/36x36/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/36x36/apps');
+ copy 'share/gcstar/icons/gcstar_48x48.png', '/usr/share/icons/hicolor/48x48/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/48x48/apps');
+ copy 'share/gcstar/icons/gcstar_64x64.png', '/usr/share/icons/hicolor/64x64/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/64x64/apps');
+ copy 'share/gcstar/icons/gcstar_72x72.png', '/usr/share/icons/hicolor/72x72/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/72x72/apps');
+ copy 'share/gcstar/icons/gcstar_96x96.png', '/usr/share/icons/hicolor/96x96/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/96x96/apps');
+ copy 'share/gcstar/icons/gcstar_128x128.png', '/usr/share/icons/hicolor/128x128/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/128x128/apps');
+ copy 'share/gcstar/icons/gcstar_192x192.png', '/usr/share/icons/hicolor/192x192/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/192x192/apps');
+ copy 'share/gcstar/icons/gcstar_256x256.png', '/usr/share/icons/hicolor/256x256/apps/gcstar.png'
+ if (-w '/usr/share/icons/hicolor/256x256/apps');
+ copy 'share/gcstar/icons/gcstar_scalable.svg', '/usr/share/icons/hicolor/scalable/apps/gcstar.svg'
+ if (-w '/usr/share/icons/hicolor/scalable/apps');
+ system 'gtk-update-icon-cache /usr/share/icons/hicolor';
+
+ copy 'share/applications/gcstar.xml', '/usr/share/mime/packages'
+ if (-w '/usr/share/mime/packages');
+
+ system 'update-desktop-database';
+ system 'update-mime-database /usr/share/mime';
+
+
+}
+
+sub doInstall
+{
+ my ($baseDir, $baseDir2) = @_;
+ $baseDir = $baseDir2->get_text if $baseDir2;
+
+ $baseDir .= '/' if $baseDir !~ /\/$/;
+ print $lang{InstallDirInfo}.$baseDir."\n";
+
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/bin';
+ mkpath $baseDir.'/bin';
+ copy 'bin/gcstar', $baseDir.'/bin/'.$binName;
+
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/man/man1';
+ mkpath $baseDir.'/man/man1';
+ my $manPage = "$baseDir/man/man1/$binName.1";
+ copy 'man/gcstar.1', $manPage;
+ `gzip -f $manPage 2>&1 >/dev/null`;
+
+ chmod 0755, $baseDir.'/bin/'.$binName;
+
+ #Copying lib
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/lib/gcstar';
+ recursiveCopy('lib/gcstar', $baseDir.'/lib/gcstar');
+
+ #Copying share
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/share/gcstar';
+ recursiveCopy('share/gcstar', $baseDir.'/share/gcstar');
+
+ chmod 0755, $baseDir.'/share/gcstar/helpers/xdg-open';
+}
+
+if ($type eq 'text')
+{
+ if ($withHelp)
+ {
+ usage;
+ exit 0;
+ }
+ elsif ($remove)
+ {
+ my $dir;
+ if ($withPrefix)
+ {
+ $dir = $withPrefix;
+ }
+ else
+ {
+ print $lang{InstallPrompt};
+
+ $| = 1;
+ $_ = <stdin>;
+ chomp;
+ $dir = ($_ ? $_ : '/usr/local/');
+ }
+ clean $dir;
+ print "\nRemoved\n";
+
+ exit 0;
+ }
+
+ print "\n".$lang{InstallMandatory}."\n\n";
+ my %mand = %$mand;
+ my @missing = ();
+ foreach (sort keys %mand)
+ {
+ print $_, ' 'x(35-length($_)), $mand{$_}, "\n";
+ push @missing, $_ if ($mand{$_} eq $lang{InstallMissing});
+ }
+
+ print "\n".$lang{InstallOptional}."\n\n";
+ my %opt = %$opt;
+ foreach (sort keys %opt)
+ {
+ print $_, ' 'x(35-length($_)), $opt{$_}, "\n";
+ }
+ print "\n";
+ if (scalar(@missing))
+ {
+ print "\n".$lang{InstallErrorMissing}."\n\n";
+ print "$_\n" foreach (@missing);
+ exit 1;
+ }
+
+ my $dir;
+ if ($withPrefix)
+ {
+ $dir = $withPrefix;
+ }
+ else
+ {
+ print $lang{InstallPrompt};
+
+ $| = 1;
+ $_ = <stdin>;
+ chomp;
+ $dir = ($_ ? $_ : '/usr/local/');
+ }
+
+ $dir =~ s/^~/$ENV{HOME}/;
+
+ my $dirError = 0;
+ if (! -e $dir)
+ {
+ eval { mkpath $dir };
+ $dirError = 1 if $@;
+ }
+ if (-w $dir && !$dirError)
+ {
+ clean $dir unless ($withoutClean);
+ installMenu unless ($withoutMenu);
+ doInstall $dir;
+ $dir .= '/' if $dir !~ /\/$/;
+ print "\n",$lang{InstallEnd},"\n",$lang{InstallNoError},"\n",$lang{InstallLaunch},$dir,"bin/",$binName,"\n";
+
+ exit 0;
+ }
+ else
+ {
+ print $lang{InstallNoPermission}."\n";
+ exit 0;
+ }
+
+}
+
+sub checkDependencies
+{
+ my $pref = shift;
+
+ my @dependencies = ();
+ my @optionals = ();
+ my $optionalsModules = {};
+
+ my @files = glob 'lib/gcstar/*';
+ for my $component('GCPlugins', 'GCExport', 'GCImport', 'GCExtract', 'GCBackend', 'GCItemsLists')
+ {
+ foreach (glob "lib/gcstar/$component/*")
+ {
+ if (-d $_)
+ {
+ push @files, glob "lib/gcstar/$component/$_/*.pm";
+ }
+ else
+ {
+ push @files, $_;
+ }
+ }
+ }
+
+ foreach my $file(@files)
+ {
+ open FILE, $file;
+ while (<FILE>)
+ {
+ push (@dependencies, $1) if ((/^\s*use\s*(.*?)\s*(qw.*?)?;/) && ($1 !~ /base|vars|locale|integer|^lib|utf8|strict|^$pref/));
+ if (
+ ((/eval.*?[\"\']use\s*(.*?)[\"\'];/) && ($1 !~ /base|vars|locale|integer|^lib|utf8|strict|\$opt|\$module|^$pref/))
+ ||
+ (/checkModule\([\"\'](.*?)[\"\']\)/)
+ )
+ #"
+ {
+ next if $1 eq 'Time::HiRes';
+ push (@optionals, $1);
+ push @{$optionalsModules->{$1}}, $file;
+ }
+
+ }
+ close FILE;
+ }
+
+ my %saw1;
+ @saw1{@dependencies} = ();
+ @dependencies = sort keys %saw1;
+
+ my %saw2;
+ @saw2{@optionals} = ();
+ @optionals = sort keys %saw2;
+
+ my %mandatoryResults = ();
+ my %optionalResults = ();
+
+ foreach (@dependencies)
+ {
+ $mandatoryResults{$_} = $lang{InstallOK};
+ eval "use $_";
+ $mandatoryResults{$_} = $lang{InstallMissing} if ($@);
+ }
+ foreach (@optionals)
+ {
+ $optionalResults{$_} = $lang{InstallOK};
+ eval "use $_";
+ $optionalResults{$_} = $lang{InstallMissing} if ($@);
+ }
+
+ return \%mandatoryResults, \%optionalResults, $optionalsModules;
+}
+
+eval
+'
+ use Gtk2 \'-init\';
+ use GCDialogs;
+';
+
+our $installDialog = Gtk2::Window->new('toplevel');
+
+sub graphicInstall
+{
+ my $widget = shift;
+
+ my $dir = $installDialog->{path}->get_text;
+ my $dirError = 0;
+ if (! -e $dir)
+ {
+ eval { mkpath $dir };
+ $dirError = 1 if $@;
+ }
+ if (-w $dir && !$dirError)
+ {
+ clean($installDialog->{path}->get_text)
+ if $installDialog->{clean}->get_active;
+
+ installMenu if $installDialog->{menu}->get_active;
+
+ doInstall($installDialog->{path}->get_text);
+
+ $dir .= '/' if $dir !~ /\/$/;
+
+ my $dialog = Gtk2::MessageDialog->new($installDialog,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'ok',
+ $lang{InstallEnd}."\n\n".$lang{InstallNoError}."\n\n".$lang{InstallLaunch}.$dir."bin/".$binName);
+ $dialog->run();
+ $dialog->destroy ;
+
+ Gtk2->main_quit;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($installDialog,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $lang{InstallNoPermission}."\n\n");
+ $dialog->run();
+ $dialog->destroy ;
+ }
+}
+
+sub browse
+{
+ my $widget = shift;
+ my $dialog = new GCFileChooserDialog($lang{InstallDirectory}, $installDialog, 'select-folder');
+ $dialog->set_filename($installDialog->{path}->get_text);
+ my $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ $installDialog->{path}->set_text($dialog->get_filename);
+ }
+ $dialog->destroy;
+
+}
+
+sub updateLabel
+{
+ my ($tabs, $tabLabel) = @_;
+
+ my $current = $tabs->get_current_page;
+ $current = 0 if ($current <= 0);
+ my $label = $tabs->get_tab_label_text($tabs->get_nth_page($current));
+ $tabLabel->set_markup("<span size='xx-large' weight='bold' background='#ffffff' foreground='#1c86ee'>$label</span>");
+}
+
+$installDialog->set_title($lang{InstallTitle});
+my $iconPrefix = 'share/gcstar/icons/gcstar_';
+my $pixbuf16 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'16x16.png');
+my $pixbuf32 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'32x32.png');
+my $pixbuf48 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'48x48.png');
+my $pixbuf64 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'64x64.png');
+$installDialog->set_icon_list($pixbuf16, $pixbuf32, $pixbuf48, $pixbuf64);
+#$installDialog->set_icon_from_file('share/gcstar/icons/gcstar_16x16.png');
+
+my $vbox = new Gtk2::VBox(0,0);
+
+my %mand = %$mand;
+my %opt = %$opt;
+my $tableDepend = new Gtk2::Table(3 + scalar(keys %mand) + scalar(keys %opt),2, 0);
+$tableDepend->set_row_spacings(10);
+$tableDepend->set_col_spacings(20);
+$tableDepend->set_border_width(10);
+
+my $mandMissing = 0;
+my $optMissing = 0;
+my $labelMand = new Gtk2::Label;
+$labelMand->set_markup('<b>'.$lang{InstallMandatory}.'</b>');
+$labelMand->set_alignment(0.5, 0.0);
+$tableDepend->attach($labelMand, 0, 2, 0, 1, 'expand', 'fill', 0, 10);
+my @missings;
+my @oks;
+foreach (sort keys %mand)
+{
+ my $label1 = new Gtk2::Label($_);
+ my $label2 = new Gtk2::Label;
+
+ if ($mand{$_} eq $lang{InstallMissing})
+ {
+ $label2->set_markup("<span color='red' weight='bold'>".$lang{InstallMissing}."</span>");
+ $mandMissing = 1;
+ push @missings, [$label1, $label2];
+ }
+ else
+ {
+ $label2->set_markup("<span color='green' weight='bold'>".$lang{InstallOK}."</span>");
+ push @oks, [$label1, $label2];
+ }
+
+}
+my $i = 1;
+foreach (@missings)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+foreach (@oks)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+
+%opt = %$opt;
+my $labelOpt = new Gtk2::Label;
+$labelOpt->set_markup('<b>'.$lang{InstallOptional}.'</b>');
+$tableDepend->attach(new Gtk2::HSeparator, 0, 2, $i, $i+1, 'fill', 'fill', 0, 10);
+$i++;
+$tableDepend->attach($labelOpt, 0, 2, $i, $i+1, 'expand', 'fill', 0, 10);
+
+$i++;
+@missings = ();
+@oks = ();
+foreach (sort keys %opt)
+{
+ my $label1 = new Gtk2::Label($_);
+ my $label2 = new Gtk2::Label;
+
+ if ($opt{$_} eq $lang{InstallMissing})
+ {
+ my $value;
+ foreach my $module (@{$optModules->{$_}})
+ {
+ $module =~ s/.*?GC([^\/]*?)\.pm$/$1/;
+ $value .= $module.",\n";
+ }
+ $value =~ s/,\n$//;
+ $label2->set_markup("<span color='orange' weight='bold'>".$lang{InstallMissingFor}." $value</span>");
+ $label2->set_line_wrap(1);
+ $label2->set_justify('left');
+ $optMissing = 1;
+ push @missings, [$label1, $label2];
+ }
+ else
+ {
+ $label2->set_markup("<span color='green' weight='bold'>".$lang{InstallOK}."</span>");
+ push @oks, [$label1, $label2];
+ }
+}
+foreach (@missings)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+foreach (@oks)
+{
+ $tableDepend->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $tableDepend->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+}
+
+my $scrollDepend = new Gtk2::ScrolledWindow;
+$scrollDepend->set_policy ('automatic', 'automatic');
+$scrollDepend->set_shadow_type('none');
+$scrollDepend->add_with_viewport($tableDepend);
+$scrollDepend->set_size_request(300, 200);
+
+my $hasErrors = 0;
+my $errorLabel = new Gtk2::Label;
+$errorLabel->set_line_wrap(1);
+$errorLabel->set_justify('center');
+my $vboxDepend = new Gtk2::VBox(0,0);
+my $vboxPath = new Gtk2::VBox(0,0);
+my $hboxActions = new Gtk2::HBox(0,0);
+my $hboxControls = new Gtk2::HBox(0,1);
+my $vboxOptions = new Gtk2::VBox(0,0);
+my $ok = new Gtk2::Button->new_from_stock('gtk-ok');
+my $cancel = new Gtk2::Button->new_from_stock('gtk-cancel');
+my $next = new Gtk2::Button->new_from_stock('gtk-go-forward');
+my $previous = new Gtk2::Button->new_from_stock('gtk-go-back');
+
+$ok->can_default(1);
+$cancel->can_default(1);
+$next->can_default(1);
+
+$hboxControls->pack_end($ok, 0, 1, 5);
+$hboxControls->pack_end($next, 0, 1, 5);
+$hboxControls->pack_end($previous, 0, 1, 5);
+$hboxControls->pack_end($cancel, 0, 1, 5);
+
+$vboxOptions->set_border_width(10);
+
+if ($mandMissing)
+{
+ $errorLabel->set_markup('<b>'.$lang{InstallMissingMandatory}.'</b>');
+ $hasErrors = 2;
+}
+else
+{
+ if ($optMissing)
+ {
+ $errorLabel->set_markup('<b>'.$lang{InstallMissingOptional}.'</b>');
+ $hasErrors = 1;
+ }
+ else
+ {
+ $errorLabel->set_markup('<b>'.$lang{InstallMissingNone}.'</b>');
+ }
+
+ $installDialog->{menu} = new Gtk2::CheckButton($lang{InstallWithMenu});
+ $installDialog->{menu}->set_active(1);
+ $vboxOptions->pack_start($installDialog->{menu},0,0,10);
+
+ $installDialog->{clean} = new Gtk2::CheckButton($lang{InstallWithClean});
+ $installDialog->{clean}->set_active(1);
+ $vboxOptions->pack_start($installDialog->{clean},0,0,10);
+
+ $hboxActions->set_border_width(20);
+ my $pathLabel = new Gtk2::Label($lang{InstallSelectDirectory});
+ $installDialog->{path} = new Gtk2::Entry;
+ $installDialog->{path}->set_text('/usr/local/');
+ $installDialog->{path}->set_activates_default(1);
+ $hboxActions->pack_start($installDialog->{path},1,1,5);
+ my $openButton = Gtk2::Button->new_from_stock('gtk-open');
+ $openButton->signal_connect('clicked', \&browse, $installDialog);
+ $hboxActions->pack_start($openButton,0,0,5);
+ $vboxPath->pack_start($pathLabel,0,0,5);
+ $vboxPath->pack_start($hboxActions,0,0,5);
+}
+
+$vboxDepend->pack_start($errorLabel,0,0,10);
+$vboxDepend->pack_start($scrollDepend,1,1,0);
+
+
+my $sep1 = new Gtk2::HSeparator;
+my $sep2 = new Gtk2::HSeparator;
+
+#my $image = Gtk2::Image->new_from_file('share/gcstar/logos/about.png');
+#$vbox->pack_start($image,0,0,10);
+
+my $tabs = Gtk2::Notebook->new();
+$tabs->set_border_width(0);
+$tabs->set_tab_pos('left');
+$tabs->set_show_border(1);
+$tabs->set_show_tabs(0);
+
+$tabs->append_page($vboxDepend, $lang{InstallDependencies});
+$tabs->append_page($vboxPath, $lang{InstallPath});
+$tabs->append_page($vboxOptions, $lang{InstallOptions});
+
+my $headerBox = new Gtk2::EventBox;
+my $colorHeaderBg = Gtk2::Gdk::Color->parse('#ffffff');
+$headerBox->modify_bg('normal', $colorHeaderBg);
+my $hboxLabel = new Gtk2::HBox;
+my $leftBox = new Gtk2::EventBox;
+$leftBox->modify_bg('normal', $colorHeaderBg);
+$leftBox->set_size_request(83,57);
+my $tabLabel = new Gtk2::Label;
+my $image = Gtk2::Image->new_from_file('share/gcstar/logos/install.png');
+$hboxLabel->pack_start($leftBox,0,0,0);
+$hboxLabel->pack_start($tabLabel,1,1,0);
+$hboxLabel->pack_start($image,0,0,0);
+$headerBox->add($hboxLabel);
+
+$previous->set_sensitive(0);
+updateLabel($tabs, $tabLabel);
+$next->signal_connect('clicked' => sub {
+ $tabs->next_page;
+ my $currentPage = $tabs->get_current_page;
+ updateLabel($tabs, $tabLabel);
+ if ($currentPage == 2)
+ {
+ my $allocation = $next->allocation;
+ $ok->set_size_request($allocation->width, $allocation->height);
+ $ok->show;
+ $next->hide;
+ $ok->grab_default;
+ }
+ $previous->set_sensitive(1) if $currentPage >= 1;
+});
+
+$previous->signal_connect('clicked' => sub {
+ $tabs->prev_page;
+ my $currentPage = $tabs->get_current_page;
+ updateLabel($tabs, $tabLabel);
+ $previous->set_sensitive(0) if $currentPage == 0;
+ if ($currentPage <= 1)
+ {
+ $ok->hide;
+ $next->show;
+ $next->grab_default;
+ }
+});
+
+my $vboxIn = new Gtk2::VBox(0,0);
+$vboxIn->pack_start($headerBox,0,0,0);
+$vboxIn->pack_start(Gtk2::HSeparator->new,0,0,5);
+$vboxIn->pack_start($tabs,1,1,0);
+my $hboxSpace = new Gtk2::HBox(0,0);
+$hboxSpace->pack_start($vboxIn,1,1,12);
+$vbox->pack_start($hboxSpace,1,1,10);
+
+$vbox->pack_start($sep2,0,0,0);
+$vbox->pack_start($hboxControls,0,0,5);
+
+$installDialog->add($vbox);
+
+$ok->signal_connect('clicked' => \&graphicInstall);
+$cancel->signal_connect('clicked' => sub { Gtk2->main_quit; });
+$installDialog->signal_connect(destroy => sub { Gtk2->main_quit; });
+
+$installDialog->show_all;
+$ok->hide;
+$installDialog->resize(500,400);
+
+if ($hasErrors > 1)
+{
+ $ok->set_sensitive(0);
+ $next->set_sensitive(0);
+ $cancel->grab_default;
+}
+else
+{
+ $next->grab_default;
+}
+
+Gtk2->main;
+
+0;
diff --git a/lib/gcstar/GCBackend/GCBackendXmlCommon.pm b/lib/gcstar/GCBackend/GCBackendXmlCommon.pm
new file mode 100644
index 0000000..b8a3054
--- /dev/null
+++ b/lib/gcstar/GCBackend/GCBackendXmlCommon.pm
@@ -0,0 +1,305 @@
+package GCBackend::GCBackendXmlCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use filetest 'access';
+
+{
+ package GCBackend::GCBeXmlBase;
+
+ use File::Temp qw/ tempfile /;
+ use File::Copy;
+
+ my %xmlConv = (
+ '&' => '&amp;',
+ '"' => '&quot;',
+ '<' => '&lt;',
+ '>' => '&gt;',
+ '' => '',
+ );
+ my $toBeReplaced = join '', keys %xmlConv;
+
+ sub new
+ {
+ my ($proto, $modelLoader) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {modelLoader => $modelLoader};
+ bless $self, $class;
+ return $self;
+ }
+
+ sub getVersion
+ {
+ my $self = shift;
+ my $version = undef;
+ return $version if (! -r $self->{file});
+ open DATA, $self->{file};
+ binmode(DATA, ':utf8');
+ while (<DATA>)
+ {
+ next if ! /^\s*<collection.*/;
+ $version = $1
+ if /version="([^"]*)"/;
+ last;
+ }
+ close DATA;
+ return $version;
+ }
+
+ sub prepareModel
+ {
+ my ($self, $file) = @_;
+ open COLLECTION, $file;
+ my $model;
+ while (<COLLECTION>)
+ {
+ if (/type="(.*?)"/)
+ {
+ $model = $1;
+ last;
+ }
+ }
+ close COLLECTION;
+ $self->{modelLoader}->preloadModel($model);
+ }
+
+ sub setParameters
+ {
+ my ($self, %options) = @_;
+ $self->{$_} = $options{$_} foreach keys %options;
+ }
+
+ sub hashToXMLString
+ {
+ my %hash = @_;
+ my $result = '';
+ foreach (keys %hash)
+ {
+ $result .= " $_=\"".$hash{$_}.'"';
+ }
+ return $result;
+ }
+
+ sub listToXml
+ {
+ my $value = shift;
+ my $xml = '';
+ my $col;
+ foreach (@{$value})
+ {
+ $xml .= ' <line>
+';
+ foreach $col(@{$_})
+ {
+ (my $newCol = $col) =~ s/([$toBeReplaced])/$xmlConv{$1}/go;
+ #"
+ $xml .= " <col>$newCol</col>\n";
+ }
+ $xml .= ' </line>
+';
+ }
+ return $xml;
+ }
+
+ sub setHistories
+ {
+ my ($self, $histories) = @_;
+
+ $self->{histories} = $histories;
+ }
+
+ sub save
+ {
+ my ($self, $data, $info, $splash, $keepCurrentValueForDate) = @_;
+
+ # Save into a new file to prevent crashes during saving
+ (my ($tmpFd, $tmpFile)) = tempfile();
+ if (!$tmpFd)
+ {
+ my @error = ('SaveError', '');
+ return {error => \@error};
+ }
+
+ binmode($tmpFd, ':utf8');
+
+ my $xmlModel = '';
+ my $xmlPreferences = '';
+ my $collectionType;
+ my $versionString = '';
+
+ if (exists $self->{version})
+ {
+ $versionString = ' version="'.$self->{version}.'"';
+ }
+ if (($self->{modelLoader}->{model}->isInline)
+ || ($self->{modelLoader}->{model}->isPersonal && $self->{standAlone}))
+ {
+ $xmlModel = $self->{modelLoader}->{model}->toString('collectionInlineDescription', 1);
+ $xmlPreferences = $self->{modelLoader}->{model}->{preferences}->toXmlString;
+ $collectionType = 'inline';
+ }
+ else
+ {
+ $collectionType = $self->{modelLoader}->{model}->getName;
+ $xmlModel = $self->{modelLoader}->{model}->toStringAddedFields('userCollection');
+ }
+ my $information = ' <information>
+';
+ $information .= " <$_>".GCUtils::encodeEntities($info->{$_})."</$_>\n"
+ foreach (sort keys %{$info});
+ $information .= ' </information>';
+
+ # Change this to 1 to save history. Not fully functional yet
+ # Because we don't remove item that are no more present in data.
+ my $withHistory = 0;
+ my $histories;
+ if ($withHistory)
+ {
+ $histories = ' <histories>
+';
+ foreach (keys %{$self->{histories}})
+ {
+ $histories .= " <history name=\"$_\">\n";
+ foreach my $value(@{$self->{histories}->{$_}})
+ {
+ if (ref($value) eq 'ARRAY')
+ {
+ $histories .= ' <values>
+';
+ foreach my $entry(@$value)
+ {
+ next if $entry eq '';
+ $entry =~ GCUtils::encodeEntities($entry);
+ $histories .= " <value>$entry</value>\n";
+ }
+ $histories .= ' </values>
+';
+ }
+ else
+ {
+ next if $value eq '';
+ $histories .= ' <value>'.GCUtils::encodeEntities($value)."</value>\n";
+ }
+ }
+ $histories .= ' </history>
+';
+ }
+ $histories .= ' </histories>';
+ }
+
+ my $number = 0;
+ $number = scalar @$data;
+
+ print $tmpFd '<?xml version="1.0" encoding="UTF-8"?>
+<collection type="',$collectionType,'" items="',$number,'"', $versionString,'>
+',$information,'
+',$xmlModel,'
+',$xmlPreferences,'
+',$histories,'
+';
+ my $i = 1;
+ foreach (@$data)
+ {
+ #Perform the transformation for each image value
+ foreach my $pic(@{$self->{modelLoader}->{model}->{managedImages}})
+ {
+ $_->{$pic}
+ = $self->{modelLoader}->transformPicturePath($_->{$pic}, undef, $_, $pic);
+ }
+
+ print $tmpFd ' <item
+';
+ my @complexFields;
+ my @longFields;
+ foreach my $field(@{$self->{modelLoader}->{model}->{fieldsNames}})
+ {
+ if (ref($_->{$field}) eq 'ARRAY')
+ {
+ push @complexFields, $field;
+ }
+ elsif ($self->{modelLoader}->{model}->{fieldsInfo}->{$field}->{type}
+ eq 'long text')
+ {
+ push @longFields, $field;
+ }
+ else
+ {
+ (my $data = $_->{$field}) =~ s/([$toBeReplaced])/$xmlConv{$1}/go;
+ if (($self->{modelLoader}->{model}->{fieldsInfo}->{$field}->{type} eq 'date')
+ && ($data eq 'current')
+ && (!$keepCurrentValueForDate))
+ {
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+ $data = sprintf('%02d/%02d/%4d', $mday, $mon+1, 1900+$year);
+ }
+ print $tmpFd ' ', $field, '="', $data, '"
+';
+ }
+ }
+ print $tmpFd ' >
+';
+ foreach my $field(@longFields)
+ {
+ #(my $data = $_->{$field}) =~ s/&/&amp;/g;
+ #$data =~ s/</&lt;/g;
+ #$data =~ s/>/&gt;/g;
+ #$data =~ s/"/&quot;/g;
+ (my $data = $_->{$field}) =~ s/([$toBeReplaced])/$xmlConv{$1}/go;
+ #"
+ print $tmpFd ' <', $field, '>', $data, '</', $field, '>
+';
+ }
+ foreach my $field(@complexFields)
+ {
+ print $tmpFd ' <', $field, '>
+', listToXml($_->{$field}), ' </', $field, '>
+';
+ }
+
+ print $tmpFd ' </item>
+';
+ $splash->setProgressForItemsDisplay($i) if $splash;
+
+ $self->{modelLoader}->restoreInfo($_)
+ if $self->{wantRestore};
+
+ $i++;
+ }
+ print $tmpFd '</collection>
+';
+ close $tmpFd;
+
+ # Now everything is OK, we move the temporary file over the correct one
+ if (!move($tmpFile, $self->{file}))
+ {
+ my @error = ('SaveError', $!);
+ return {error => \@error};
+ }
+
+ return {error => undef};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCBackend/GCBackendXmlParser.pm b/lib/gcstar/GCBackend/GCBackendXmlParser.pm
new file mode 100644
index 0000000..091823b
--- /dev/null
+++ b/lib/gcstar/GCBackend/GCBackendXmlParser.pm
@@ -0,0 +1,491 @@
+package GCBackend::GCBackendXmlParser;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use filetest 'access';
+use GCBackend::GCBackendXmlCommon;
+
+{
+ package GCBackend::GCBeXmlParser;
+
+ use File::Temp qw/ tempfile /;
+ use File::Copy;
+
+ use base 'GCBackend::GCBeXmlBase';
+
+ my $globalInstance;
+ my $globalSplash;
+ my $globalModelLoader;
+ #my @data;
+ #my %information;
+ #my %histories;
+ my $maxId;
+ my $savedMaxId;
+ my $historyInline;
+
+ sub load
+ {
+ my ($self, $splash) = @_;
+
+ if (! -r $self->{file})
+ {
+ my @error = ('OpenError', '');
+ return {error => \@error};
+ }
+
+ $self->{data} = [];
+ $self->{information} = {};
+ $self->{histories} = ();
+ $maxId = 0;
+ $savedMaxId = 0;
+
+ $globalInstance = $self;
+ $globalSplash = $splash;
+ $globalModelLoader = $self->{modelLoader};
+
+ my $parser = XML::Parser->new(Handlers => {
+ Init => \&StartDocument,
+ Final => \&EndDocument,
+ Start => \&StartTag,
+ End => \&EndTag,
+ Char => \&Text,
+ });
+ # We have to preload the model into cache because XML::Parser is not
+ # re-entrant. Then when we begin parsing, we cannot parse the model
+ $self->prepareModel($self->{file});
+ my $error = undef;
+ while (1)
+ {
+ eval {
+ $parser->parsefile($self->{file});
+ };
+ if ($@)
+ {
+ my $errorDesc = $@;
+
+ # Here we will fix the collection if an invalid character was found by trying to remove it.
+ # There should be room for optimisation here
+
+ if ($errorDesc =~ /not\s*well-formed\s*\(invalid\s*token\)\s*.*?byte\s*(\d+)/)
+ {
+ my $charPosition = $1;
+ # We would have failed before if it cannot be opened, so we don't check that.
+ open COL, $self->{file};
+ seek COL, $charPosition, 0;
+ my $badChar;
+ read COL, $badChar, 1;
+ seek COL, 0, 0;
+ (my ($newCol, $tmpFile)) = tempfile();
+ while (<COL>)
+ {
+ s/$badChar//g;
+ print $newCol $_;
+ }
+ close $newCol;
+ close COL;
+ move($tmpFile, $self->{file});
+ }
+ else
+ {
+ $errorDesc =~ s/^\n*//;
+ my @errorArray = ('OpenFormatError', $errorDesc);
+ $error = \@errorArray;
+ last;
+ }
+ }
+ else
+ {
+ last;
+ }
+ }
+
+ # TODO : Compare performances with and without the compact below because the duplicates are checked
+ # also when adding to the graphical components
+ # Compact histories. We didn't filtered previously for performances issues
+ #GCUtils::compactHistories(\%histories);
+
+ $self->{information}->{maxId} = $maxId
+ if ! exists $self->{information}->{maxId};
+
+ # gotHistory:
+ # 0: Nothing done
+ # 1: Returning history
+ # 2: Already initialized
+
+ return {
+ error => $error,
+ data => $self->{data},
+ information => $self->{information},
+ histories => \$self->{histories},
+ gotHistory => (1 + ($historyInline ? 0 : 1)), # We always have an initalized history with this BE.
+ };
+ }
+
+ # Parser routines
+
+ # Some globals to speed up things
+ my $inCol;
+ my $inLine;
+ my $currentTag;
+ my $currentCol;
+ my $currentCount;
+ my $currentIsList;
+ my $isItem;
+ my $isInfo;
+ my $newItem;
+ my $modCap;
+ my $prefCap;
+ my $anyCap;
+ my $isInline;
+ my $inlineModel;
+ my $inlinePreferences;
+
+ my $inHistories;
+ my $historyField;
+ # history type :
+ # 1 : Single list
+ # 2 : Multiple list
+ my $historyType;
+ my $historyCap;
+
+ sub StartDocument
+ {
+ $isItem = 0;
+ $inLine = 0;
+ $inCol = 0;
+ $currentCol = '';
+ $currentCount = 0;
+ $modCap = 0;
+ $prefCap = 0;
+ $anyCap = 0;
+ $inlineModel = '';
+ $inlinePreferences = '';
+
+# SAVED HISTORIES DEACTIVATED
+# $inHistories = 0;
+# $historyField = '';
+# $historyCap = 0;
+ $historyInline = 0;
+ }
+
+ sub EndDocument
+ {
+ if (($inlineModel) && ($isInline))
+ {
+ $globalModelLoader->setCurrentModelFromInline({inlineModel => $inlineModel,
+ inlinePreferences => $inlinePreferences});
+ }
+ }
+
+ sub StartTag
+ {
+ #my ($expat, $tag, %attrs) = @_;
+ if ($isItem)
+ {
+ if ($inLine)
+ {
+ #Only a col could start in a line
+ $inCol = 1;
+ }
+ elsif ($_[1] eq 'line')
+ {
+ $inLine = 1;
+ $currentIsList = 1;
+ $newItem->{$currentTag} = [] if (ref($newItem->{$currentTag}) ne 'ARRAY');
+ push @{$newItem->{$currentTag}}, [];
+ }
+ else
+ {
+ $currentIsList = 0;
+ $currentTag = $_[1];
+ }
+ }
+ elsif ($isInfo)
+ {
+ $currentTag = $_[1];
+ $savedMaxId = 1 if $currentTag eq 'maxId';
+ }
+ else
+ {
+ my ($expat, $tag, %attrs) = @_;
+ if ($modCap)
+ {
+ $tag =~ s/^user(.)/\L$1\E/;;
+ $inlineModel .= "<$tag".GCBackend::GCBeXmlBase::hashToXMLString(%attrs).'>';
+ }
+ elsif ($prefCap)
+ {
+ $inlinePreferences .= "<$tag".GCBackend::GCBeXmlBase::hashToXMLString(%attrs).'>';
+ }
+ elsif ($tag eq 'item')
+ {
+ $newItem = \%attrs;
+ $isItem = 1;
+ }
+ elsif ($tag eq 'information')
+ {
+ $isInfo = 1;
+ }
+ elsif (($tag eq 'collectionInlineDescription') || ($tag eq 'userCollection'))
+ {
+ $modCap = 1;
+ $anyCap = 1;
+ $inlineModel = '<collection'.GCBackend::GCBeXmlBase::hashToXMLString(%attrs).">\n";
+ }
+ elsif ($tag eq 'collectionInlinePreferences')
+ {
+ $prefCap = 1;
+ $anyCap = 1;
+ $inlinePreferences = '<preferences'.GCBackend::GCBeXmlBase::hashToXMLString(%attrs).">\n";
+ }
+ elsif ($tag eq 'collection')
+ {
+ $globalSplash->setItemsTotal($attrs{items})
+ if $globalSplash;
+ if ($attrs{type} eq 'inline')
+ {
+ $isInline = 0;
+ }
+ else
+ {
+ if (! $globalModelLoader->setCurrentModel($attrs{type}))
+ {
+ die $globalModelLoader->{lang}->{ErrorModelNotFound}.$attrs{type}
+ ."\n\n"
+ .$globalModelLoader->getUserModelsDirError."\n";
+ }
+ }
+ }
+# SAVED HISTORIES DEACTIVATED
+# elsif ($tag eq 'histories')
+# {
+# $inHistories = 1;
+# $historyInline = 1;
+# }
+# elsif ($inHistories)
+# {
+# if ($tag eq 'history')
+# {
+# $historyField = $attrs{name};
+# # Default is single
+# $historyType = 1;
+# }
+# elsif ($tag eq 'values')
+# {
+# push @{$globalInstance->{histories}->{$historyField}}, [];
+# $historyType = 2;
+# }
+# elsif ($tag eq 'value')
+# {
+# if ($historyType == 1)
+# {
+# push @{$globalInstance->{histories}->{$historyField}}, '';
+# }
+# else
+# {
+# push @{$globalInstance->{histories}->{$historyField}->[-1]}, '';
+# }
+# $historyCap = 1;
+# }
+# }
+ }
+ }
+
+ sub EndTag
+ {
+ if ($anyCap)
+ {
+ if ($modCap)
+ {
+ if (($_[1] eq 'collectionInlineDescription') || ($_[1] eq 'userCollection'))
+ {
+ $anyCap = $prefCap;
+ $modCap = 0;
+ $inlineModel .= '</collection>';
+ if ($inlinePreferences)
+ {
+ $globalModelLoader->setCurrentModelFromInline({inlineModel => $inlineModel,
+ inlinePreferences => $inlinePreferences});
+ $inlineModel = undef;
+ }
+ elsif($_[1] eq 'userCollection')
+ {
+ $globalModelLoader->addFieldsToDefaultModel($inlineModel);
+ $inlineModel = undef;
+ }
+
+ }
+ else
+ {
+ (my $tag = $_[1]) =~ s/^user(.)/\L$1\E/;
+ $inlineModel .= "</$tag>\n";
+ }
+ return;
+ }
+ else
+ {
+ if ($_[1] eq 'collectionInlinePreferences')
+ {
+ $anyCap = $modCap;
+ $prefCap = 0;
+ $inlinePreferences .= '</preferences>';
+ if ($inlineModel)
+ {
+ $globalModelLoader->setCurrentModelFromInline({inlineModel => $inlineModel,
+ inlinePreferences => $inlinePreferences});
+ $inlineModel = '';
+ }
+ }
+ else
+ {
+ $inlinePreferences .= '</'.$_[1].">\n";
+ }
+ return;
+ }
+ }
+
+ if ($_[1] eq 'item')
+ {
+ push @{$globalInstance->{data}}, $newItem;
+ $currentCount++;
+# SAVED HISTORIES DEACTIVATED
+# if (!$historyInline)
+# {
+ #foreach (@{$globalModelLoader->{model}->{fieldsHistory}})
+ #{
+ # push @{$globalInstance->{histories}->{$_}}, $newItem->{$_};
+ #}
+ if ($globalModelLoader->{panel})
+ {
+ foreach (@{$globalModelLoader->{model}->{fieldsHistory}})
+ {
+ $globalModelLoader->{panel}->{$_}->addHistory($newItem->{$_}, 1);
+ }
+ }
+# }
+ foreach (@{$globalModelLoader->{model}->{fieldsNotNull}})
+ {
+ $newItem->{$_} = $globalModelLoader->{model}->{fieldsInfo}->{$_}->{init} if ! $newItem->{$_};
+ }
+
+ if (!$savedMaxId)
+ {
+ my $id = $newItem->{$globalModelLoader->{model}->{commonFields}->{id}};
+ $maxId = $id
+ if $id > $maxId;
+ }
+
+ $globalSplash->setProgressForItemsLoad($currentCount)
+ if $globalSplash;
+
+ $isItem = 0;
+ }
+ elsif ($_[1] eq 'information')
+ {
+ $isInfo = 0 if !$isItem;
+ }
+ elsif ($inCol)
+ {
+ # We are closing a col as it could not have tags inside
+ push @{$newItem->{$currentTag}->[-1]}, $currentCol;
+ $currentCol = '';
+ $inCol = 0;
+ }
+# SAVED HISTORIES DEACTIVATED
+# elsif ($inHistories)
+# {
+# $inHistories = 0 if $_[1] eq 'histories';
+# $historyField = '' if $_[1] eq 'history';
+# $historyCap = 0 if $_[1] eq 'value';
+#
+# }
+ else
+ {
+ # The only tag that could prevent us from closing a line is col, but it has
+ # already been managed
+ if ($inLine)
+ {
+ $inLine = 0;
+ }
+ else
+ {
+ $currentTag = '';
+ }
+ }
+ }
+
+ sub Text
+ {
+ if ($isItem)
+ {
+ if ((! $currentTag)
+ || $inLine
+ || $currentIsList
+ || ((!$newItem->{$currentTag}) && ($_[1] =~ /^\s*$/oms)))
+ {
+ if ($inCol)
+ {
+ return if $_[1] =~ /^\s*$/oms;
+ $currentCol .= $_[1];
+ }
+ }
+ else
+ {
+ $newItem->{$currentTag} .= $_[1];
+ }
+ }
+ elsif ($isInfo)
+ {
+ return if $_[1] =~ /^\s*$/oms;
+ $globalInstance->{information}->{$currentTag} .= $_[1];
+ }
+ else
+ {
+ if ($modCap)
+ {
+ $inlineModel .= $_[1];
+ }
+ elsif ($prefCap)
+ {
+ $inlinePreferences .= $_[1];
+ }
+# elsif ($historyCap)
+# {
+# if ($historyType == 1)
+# {
+# $globalInstance->{histories}->{$historyField}->[-1] .= $_[1];
+# }
+# else
+# {
+# $globalInstance->{histories}->{$historyField}->[-1]->[-1] .= $_[1];
+# }
+# }
+ }
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCBookmarks.pm b/lib/gcstar/GCBookmarks.pm
new file mode 100644
index 0000000..e771113
--- /dev/null
+++ b/lib/gcstar/GCBookmarks.pm
@@ -0,0 +1,729 @@
+package GCBookmarks;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+our $bookmarksFile = 'GCbookmarks.conf';
+
+use strict;
+{
+ package GCBookmarksLoader;
+
+ sub new
+ {
+ my ($proto, $parent, $menu) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent,
+ menu => $menu};
+ bless ($self, $class);
+ $self->load;
+ return $self;
+ }
+
+ sub load
+ {
+ my $self = shift;
+
+ open BOOKMARKS, $ENV{GCS_CONFIG_HOME}."/$bookmarksFile";
+ my $xmlString = do {local $/; <BOOKMARKS>};
+ close BOOKMARKS;
+ $self->{menu}->clearBookmarks;
+ my $bookmarks;
+ if ($xmlString)
+ {
+ my $xs = XML::Simple->new;
+ $bookmarks = $xs->XMLin($xmlString,
+ ForceArray => ['file', 'dir'],
+ KeyAttr => {
+ 'dir' => 'id'
+ });
+ $self->{menu}->setBookmarks($bookmarks);
+ }
+ $self->{bookmarks} = $bookmarks;
+ }
+
+ sub save
+ {
+ my ($self, $bookmarks) = @_;
+
+ return if !$bookmarks->{file};
+ $self->{bookmarks} = $bookmarks;
+ my $xs = XML::Simple->new;
+ my $xmlString = $xs->XMLout($bookmarks,
+ XMLDecl => '<?xml version="1.0" encoding="UTF-8"?>',
+ RootName => 'bookmarks');
+ open BOOKMARKS, '>'.$ENV{GCS_CONFIG_HOME}."/$bookmarksFile";
+ binmode(BOOKMARKS, ':utf8');
+ print BOOKMARKS $xmlString;
+ close BOOKMARKS;
+ $self->{menu}->clearBookmarks;
+ $self->{menu}->setBookmarks($bookmarks);
+ }
+}
+
+{
+ package GCBookmarksFolders;
+ use base 'Gtk2::TreeView';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new();
+ $self->{class} = $class;
+ $self->{model} = new Gtk2::TreeStore('Glib::String', 'Glib::Int');
+ $self->set_model($self->{model});
+ $self->{parent} = $parent;
+ my $column = Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{BookmarksFolder}, Gtk2::CellRendererText->new,
+ 'text' => 0, 'editable' => 1);
+ $self->append_column($column);
+
+ $self->signal_connect (cursor_changed => sub {
+ my ($sl, $path, $column) = @_;
+ my $iter = $sl->get_selection->get_selected;
+ $self->{currentIdx} = ($self->{model}->get($iter))[1];
+ $self->{parent}->setBookmarksList($self->{bookmarks}->[$self->{currentIdx}]);
+ });
+
+ my $targetEntryReorder = {
+ target => 'text/plain',
+ flags => ['same-widget'],
+ info => 0,
+ };
+ my $targetEntryMove = {
+ target => 'text/plain',
+ flags => ['same-app'],
+ info => 1,
+ };
+
+ $self->enable_model_drag_source('button1-mask','move', $targetEntryReorder, $targetEntryMove);
+ $self->enable_model_drag_dest('move', $targetEntryReorder, $targetEntryMove);
+ $self->signal_connect_after('drag_data_received' => \&dropHandler, $self);
+
+ $self->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $self->removeFolder;
+ return 1;
+ }
+ return 0;
+ });
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub dropHandler
+ {
+ my ($treeview, $context, $widget_x, $widget_y, $data, $info,$time, $self) = @_;
+ my $source = $context->get_source_widget;
+ my ($targetPath, $targetPos) = $treeview->get_dest_row_at_pos($widget_x, $widget_y);
+ return if !$targetPath;
+ my $targetIter = $self->get_model->get_iter($targetPath);
+ my $origIter = $source->get_selection->get_selected;
+ if ($source == $self)
+ {
+ if (($targetPath->to_string eq $self->get_model->get_path($origIter)->to_string)
+ || ($self->{model}->is_ancestor($origIter, $targetIter)))
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+ my $newIter;
+ my $parent;
+ my $pos;
+ my $ref;
+ if ($targetPos =~ /^into/)
+ {
+ $parent = $targetIter;
+ $pos = 0;
+ $ref = 0;
+ }
+ else
+ {
+ $parent = $self->{model}->iter_parent($targetIter);
+ $pos = ($targetPos eq 'before') ? 1 : 0;
+ $ref = $targetIter;
+ }
+ $self->copyIter($origIter, $parent, $pos, $ref);
+ }
+ else
+ {
+ my @origData = $source->get_model->get_value($origIter);
+ my $bookmark = {'name' => $origData[0], 'path' => $origData[1]};
+ my $idx = ($self->{model}->get($targetIter))[1];
+ push @{$self->{bookmarks}->[$idx]}, $bookmark;
+ my @bookmarks;
+ my $i = -1;
+ my $selected = ($source->get_selected_indices)[0];
+ foreach (@{$source->{data}})
+ {
+ $i++;
+ next if $i == $selected;
+ push @bookmarks, {name => $_->[0], path => $_->[1]};
+ }
+ $self->{bookmarks}->[$self->{currentIdx}] = \@bookmarks;
+ }
+ $context->finish(1,1,$time);
+ }
+
+ sub copyIter
+ {
+ my ($self, $iter, $parent, $pos, $ref) = @_;
+
+ my @origData;
+ my $i = 0;
+ foreach ($self->get_model->get_value($iter))
+ {
+ push @origData, $i, $_;
+ $i++;
+ }
+ my $newIter;
+ if ($ref)
+ {
+ if ($pos)
+ {
+ $newIter = $self->{model}->insert_before($parent,
+ $ref);
+ }
+ else
+ {
+ $newIter = $self->{model}->insert_after($parent,
+ $ref);
+ }
+ }
+ else
+ {
+ $newIter = $self->{model}->append($parent);
+ }
+ $self->{model}->set($newIter, @origData);
+ my $childIter = $self->{model}->iter_children($iter);
+ while ($childIter)
+ {
+ $self->copyIter($childIter, $newIter);
+ $childIter = $self->{model}->iter_next($childIter);
+ }
+ }
+
+ sub setBookmarks
+ {
+ my ($self, $bookmarks) = @_;
+ $self->{bookmarks} = [];
+ $self->{bookmarkIdx} = 0;
+ $self->{currentIdx} = 0;
+ $self->{model}->clear;
+ $self->addBookmarksDir($bookmarks, undef);
+ $self->expand_row(Gtk2::TreePath->new_from_string('0'), 0);
+ $self->{parent}->setBookmarksList($self->{bookmarks}->[$self->{currentIdx}]);
+ }
+
+ sub addBookmarksDir
+ {
+ my ($self, $dir, $parent) = @_;
+ my $name = $dir->{name};
+ ($name = $self->{parent}->{lang}->{MenuBookmarks}) =~ s/_//g if !$parent;
+ my @data = (0 => $name, 1 => $self->{bookmarkIdx});
+ $self->{bookmarks}->[$self->{bookmarkIdx}] = $dir->{file};
+ $self->{bookmarkIdx}++;
+ my $newDir = $self->{model}->append($parent);
+ $self->{model}->set($newDir, @data);
+ foreach my $sub(@{$dir->{dir}})
+ {
+ $self->addBookmarksDir($sub, $newDir);
+ }
+ }
+
+ sub addBookmark
+ {
+ my ($self, $path, $name) = @_;
+ push(@{$self->{bookmarks}->[$self->{currentIdx}]}, {name => $name, path => $path});
+ }
+
+ sub addFolder
+ {
+ my ($self, $name) = @_;
+ my @data = (0 => $name, 1 => $self->{bookmarkIdx});
+ $self->{bookmarks}->[$self->{bookmarkIdx}] = [];
+ $self->{bookmarkIdx}++;
+ my $parent = $self->get_selection->get_selected;
+ $parent ||= $self->{model}->get_iter_first;
+ $self->{model}->set($self->{model}->append($parent), @data);
+ }
+
+ sub removeFolder
+ {
+ my $self = shift;
+ my $iter = $self->get_selection->get_selected;
+ $self->{model}->remove($iter);
+ }
+
+ sub getBookmarks
+ {
+ my $self = shift;
+
+ my $result = {};
+ $self->dumpTree($result, $self->{model}->get_iter_first, 1);
+ return $result;
+ }
+
+ sub dumpTree
+ {
+ my ($self, $dir, $iter, $first) = @_;
+ my @data = $self->{model}->get($iter);
+ $dir->{name} = $data[0] if ! $first;
+ $dir->{file} = $self->{bookmarks}->[$data[1]];
+ $dir->{dir} = [];
+ my $i = 0;
+ my $child;
+ while ($child = $self->{model}->iter_nth_child($iter, $i))
+ {
+ $dir->{dir}->[$i] = {};
+ $self->dumpTree($dir->{dir}->[$i], $child);
+ $i++;
+ }
+ }
+
+ sub setBookmarksInCurrentFolder
+ {
+ my ($self, $bookmarksList) = @_;
+
+ $self->{bookmarks}->[$self->{currentIdx}] = $bookmarksList;
+ }
+}
+
+use GCDialogs;
+
+{
+ package GCBookmarkNewFolderDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{BookmarksNewFolder},
+ 'gtk-add',
+ );
+ bless($self, $class);
+ $self->{entry} = new GCShortText;
+ $self->{entry}->signal_connect('activate' => sub {$self->response('ok')} );
+ my $hbox = new Gtk2::HBox(0,0);
+ $hbox->pack_start($self->{entry},1,1,$GCUtils::margin);
+ $self->vbox->pack_start($hbox,1,1,$GCUtils::margin);
+ return $self;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{entry}->grab_focus;
+ my $code = $self->run;
+ $self->hide;
+ return ($code eq 'ok');
+ }
+}
+
+{
+ package GCBookmarkPropertiesDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent, $title, $okLabel) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ $okLabel,
+ );
+ bless($self, $class);
+
+ my $table = new Gtk2::Table(2, 2);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::margin);
+ my $labelLabel = new GCLabel($parent->{lang}->{BookmarksLabel});
+ $self->{label} = new GCShortText;
+ $self->{label}->signal_connect('activate' => sub {$self->response('ok')} );
+ my $pathLabel = new GCLabel($parent->{lang}->{BookmarksPath});
+ $self->{path} = new GCShortText;
+ $self->{path}->signal_connect('activate' => sub {$self->response('ok')} );
+ $table->attach($labelLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{label}, 1, 2, 0, 1, ['fill', 'expand'], 'fill', 0, 0);
+ $table->attach($pathLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{path}, 1, 2, 1, 2, ['fill', 'expand'], 'fill', 0, 0);
+ $self->vbox->pack_start($table, 1, 1, 0);
+ $table->show_all;
+ return $self;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{label}->grab_focus;
+ my $code = $self->run;
+ $self->hide;
+ return ($code eq 'ok');
+ }
+}
+
+
+{
+ package GCBookmarkAdderDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ (my $title = $parent->{lang}->{MenuBookmarksAdd}) =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ 'gtk-add',
+ 0,
+ $parent->{lang}->{BookmarksNewFolder} => 'yes',
+ );
+
+ $self->{lang} = $parent->{lang};
+
+ my $table = new Gtk2::Table(2, 2);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::margin);
+ my $labelLabel = new GCLabel($parent->{lang}->{BookmarksLabel});
+ $self->{label} = new GCShortText;
+ my $pathLabel = new GCLabel($parent->{lang}->{BookmarksPath});
+ $self->{path} = new GCShortText;
+
+ $table->attach($labelLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{label}, 1, 2, 0, 1, ['fill', 'expand'], 'fill', 0, 0);
+ $table->attach($pathLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{path}, 1, 2, 1, 2, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{folders} = new GCBookmarksFolders($self);
+ my $scroller = new Gtk2::ScrolledWindow;
+ $scroller->set_policy ('automatic', 'automatic');
+ $scroller->add($self->{folders});
+ $table->attach($scroller, 0, 2, 2, 3, ['fill', 'expand'], ['fill', 'expand'], 0, 0);
+
+ $self->vbox->pack_start($table, 1, 1, 0);
+ $self->set_default_size(400, 300);
+
+ bless ($self, $class);
+ }
+
+ sub setBookmark
+ {
+ my ($self, $path, $label) = @_;
+ $self->{path}->setValue($path);
+ $self->{label}->setValue($label);
+ }
+
+ sub setBookmarksFolders
+ {
+ my ($self, $bookmarks) = @_;
+ $self->{folders}->setBookmarks($bookmarks);
+
+ }
+
+ sub setBookmarksList
+ {
+ }
+
+ sub getBookmarks
+ {
+ my $self = shift;
+ return $self->{folders}->getBookmarks;
+ }
+
+ sub addFolder
+ {
+ my $self = shift;
+ my $dialog = new GCBookmarkNewFolderDialog($self);
+ $self->{folders}->addFolder($dialog->{entry}->getValue) if $dialog->show;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ my $response;
+ my $done = 0;
+ while (!$done)
+ {
+ $response = $self->run;
+ if ($response eq 'ok')
+ {
+ $self->{folders}->addBookmark($self->{path}->getValue, $self->{label}->getValue);
+ }
+ $self->addFolder if ($response eq 'yes');
+ $done = 1 if ($response eq 'ok') || ($response eq 'cancel') || ($response eq 'delete-event');
+ }
+ $self->hide;
+ return ($response eq 'ok');
+ }
+}
+
+{
+ package GCBookmarksEditDialog;
+ use base 'GCModalDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ (my $title = $parent->{lang}->{MenuBookmarksEdit}) =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ 'gtk-save',
+ );
+ bless ($self, $class);
+
+ $self->{lang} = $parent->{lang};
+
+ $self->{folders} = new GCBookmarksFolders($self);
+ my $scroller1 = new Gtk2::ScrolledWindow;
+ $scroller1->set_policy ('automatic', 'automatic');
+ $scroller1->set_shadow_type('etched-in');
+ $scroller1->add($self->{folders});
+ $self->{bookmarksList} = new Gtk2::SimpleList($parent->{lang}->{BookmarksBookmarks} => 'text',
+ 'Path' => 'text');
+ $self->{blockAddSignal} = 0;
+ $self->{bookmarksList}->get_model->signal_connect('row-inserted' => sub {
+ return if $self->{blockAddSignal};
+ $self->saveBookmarks;
+ });
+ $self->{bookmarksList}->set_rules_hint(1);
+ $self->{bookmarksList}->get_column(1)->set_visible(0);
+ my $targetEntryMove = {
+ target => 'text/plain',
+ flags => ['same-app'],
+ info => 14,
+ };
+ $self->{bookmarksList}->enable_model_drag_source('button1-mask','move', $targetEntryMove);
+ $self->{bookmarksList}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $self->deleteBookmark;
+ return 1;
+ }
+ return 0;
+ });
+
+ my $hboxFolders = new Gtk2::HBox(0,0);
+ my $vboxFolders = new Gtk2::VBox(0,0);
+ my $newFolder = new Gtk2::Button->new_from_stock('gtk-new');
+ $newFolder->signal_connect('clicked' => sub {
+ $self->addFolder;
+ });
+ my $removeFolder = new Gtk2::Button->new_from_stock('gtk-delete');
+ $removeFolder->signal_connect('clicked' => sub {
+ $self->{folders}->removeFolder;
+ });
+ $vboxFolders->pack_start($newFolder,0,0,$GCUtils::halfMargin);
+ $vboxFolders->pack_start($removeFolder,0,0,$GCUtils::halfMargin);
+ $hboxFolders->pack_start($vboxFolders,0,0,$GCUtils::margin);
+ $hboxFolders->pack_start($scroller1,1,1,0);
+
+
+ my $scroller2 = new Gtk2::ScrolledWindow;
+ $scroller2->set_policy ('automatic', 'automatic');
+ $scroller2->set_shadow_type('etched-in');
+ $scroller2->add($self->{bookmarksList});
+
+ my $hboxList = new Gtk2::HBox(0,0);
+ $hboxList->pack_start($scroller2,1,1,0);
+ my $vboxList = new Gtk2::VBox(0,0);
+ $hboxList->pack_start($vboxList,0,0,$GCUtils::margin);
+
+ my $up = new Gtk2::Button->new_from_stock('gtk-go-up');
+ $up->signal_connect('clicked' => sub {
+ $self->moveDownUp(-1);
+ });
+ my $down = new Gtk2::Button->new_from_stock('gtk-go-down');
+ $down->signal_connect('clicked' => sub {
+ $self->moveDownUp(1);
+ });
+ my $edit = new Gtk2::Button->new_from_stock('gtk-edit');
+ $edit->signal_connect('clicked' => sub {
+ $self->edit;
+ });
+ my $new = new Gtk2::Button->new_from_stock('gtk-new');
+ $new->signal_connect('clicked' => sub {
+ $self->newBookmark;
+ });
+ my $delete = new Gtk2::Button->new_from_stock('gtk-delete');
+ $delete->signal_connect('clicked' => sub {
+ $self->deleteBookmark;
+ });
+ $vboxList->pack_start($up,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($down,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($edit,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($new,0,0,$GCUtils::halfMargin);
+ $vboxList->pack_start($delete,0,0,$GCUtils::halfMargin);
+
+ my $paned = new Gtk2::HPaned;
+ $paned->pack1($hboxFolders, 1, 0);
+ $paned->pack2($hboxList, 1, 0);
+
+ $self->vbox->pack_start($paned, 1, 1, $GCUtils::margin);
+ $self->set_default_size(600, 400);
+ return $self;
+ }
+
+ sub edit
+ {
+ my $self = shift;
+ my $currentId = ($self->{bookmarksList}->get_selected_indices)[0];
+ return if (!defined($currentId)) || ($currentId < 0);
+ my ($label, $path) = @{$self->{bookmarksList}->{data}->[$currentId]};
+ (my $title = Gtk2::Stock->lookup('gtk-edit')->{label}) =~ s/_//;
+ my $dialog = new GCBookmarkPropertiesDialog($self, $title);
+ $dialog->{label}->setValue($label);
+ $dialog->{path}->setValue($path);
+ if ($dialog->show)
+ {
+ $self->{bookmarksList}->{data}->[$currentId] = [$dialog->{label}->getValue,
+ $dialog->{path}->getValue];
+ $self->saveBookmarks;
+ }
+ $dialog->destroy;
+ }
+
+ sub newBookmark
+ {
+ my $self = shift;
+ $self->{blockAddSignal} = 1;
+ (my $title = Gtk2::Stock->lookup('gtk-new')->{label}) =~ s/_//;
+ my $dialog = new GCBookmarkPropertiesDialog($self, $title, 'gtk-new');
+ $dialog->{label}->clear();
+ $dialog->{path}->clear();
+ if ($dialog->show)
+ {
+ push @{$self->{bookmarksList}->{data}}, [$dialog->{label}->getValue, $dialog->{path}->getValue];
+ $self->saveBookmarks;
+ $self->{bookmarksList}->select($#{$self->{bookmarksList}->{data}});
+ }
+ $dialog->destroy;
+ $self->{blockAddSignal} = 0;
+ }
+
+ sub deleteBookmark
+ {
+ my $self = shift;
+ my $currentId = ($self->{bookmarksList}->get_selected_indices)[0];
+ return if (!defined($currentId)) || ($currentId < 0);
+ splice (@{$self->{bookmarksList}->{data}}, $currentId, 1);
+ $currentId--;
+ $currentId = 0 if $currentId < 0;
+ $self->saveBookmarks;
+ $self->{bookmarksList}->select($currentId);
+ }
+
+ sub moveDownUp
+ {
+ my ($self, $dir) = @_;
+ $self->{blockAddSignal} = 1;
+ my $currentId = ($self->{bookmarksList}->get_selected_indices)[0];
+ my $newId = $currentId + $dir;
+ return if ($newId < 0) || ($newId >= scalar @{$self->{bookmarksList}->{data}});
+ my @data;
+ foreach (@{$self->{bookmarksList}->{data}})
+ {
+ push @data, [$_->[0], $_->[1]];
+ }
+ ($data[$currentId], $data[$newId]) = ($data[$newId], $data[$currentId]);
+ @{$self->{bookmarksList}->{data}} = @data;
+ $self->{bookmarksList}->select($newId);
+ $self->saveBookmarks;
+ $self->{blockAddSignal} = 0;
+ }
+
+ sub addFolder
+ {
+ my $self = shift;
+ my $dialog = new GCBookmarkNewFolderDialog($self);
+ $self->{folders}->addFolder($dialog->{entry}->getValue) if $dialog->show;
+ }
+
+ sub setBookmarksFolders
+ {
+ my ($self, $bookmarks) = @_;
+
+ $self->{folders}->setBookmarks($bookmarks);
+
+ }
+
+ sub setBookmarksList
+ {
+ my ($self, $list) = @_;
+ $self->{blockAddSignal} = 1;
+ @{$self->{bookmarksList}->{data}} = ();
+ foreach (@$list)
+ {
+ push @{$self->{bookmarksList}->{data}}, [$_->{name}, $_->{path}];
+ }
+ $self->{blockAddSignal} = 0;
+ }
+
+ sub getBookmarks
+ {
+ my $self = shift;
+ return $self->{folders}->getBookmarks;
+ }
+
+ sub saveBookmarks
+ {
+ my $self = shift;
+ my @bookmarks;
+ foreach (@{$self->{bookmarksList}->{data}})
+ {
+ push @bookmarks, {name => $_->[0], path => $_->[1]};
+ }
+ $self->{folders}->setBookmarksInCurrentFolder(\@bookmarks);
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ my $done = 0;
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCBorrowings.pm b/lib/gcstar/GCBorrowings.pm
new file mode 100644
index 0000000..d93c444
--- /dev/null
+++ b/lib/gcstar/GCBorrowings.pm
@@ -0,0 +1,662 @@
+package GCBorrowings;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCDialogs;
+use GCUtils;
+
+{
+ package GCImportBorrowersDialog;
+ use base 'GCModalDialog';
+
+ use XML::Simple;
+
+ sub importClaws
+ {
+ my ($self, $file) = @_;
+ my @result;
+ open XML, $file;
+ my $xmlString = do {local $/; <XML>};
+ close XML;
+ my $xs = XML::Simple->new;
+ my $addressBook = $xs->XMLin($xmlString,
+ ForceArray => ['address', 'person']
+ );
+ foreach (@{$addressBook->{person}})
+ {
+ push @result, [$_->{cn}, $_->{'address-list'}->{address}->[0]->{email}];
+ }
+ return \@result;
+ }
+
+ sub importLdif
+ {
+ my ($self, $file) = @_;
+ my @result;
+ open DATA, $file;
+ my %current;
+ while (<DATA>)
+ {
+ if (/^dn/)
+ {
+ push @result, [$current{name}, $current{email}] if %current;
+ %current = {};
+ }
+ $current{name} = $1 if (/^cn:\s*(.*)$/);
+ $current{email} = $1 if (/^mail:\s*(.*)$/);
+ }
+ close DATA;
+ push @result, [$current{name}, $current{email}] if %current;
+ return \@result;
+ }
+
+ sub importVcard
+ {
+ my ($self, $file) = @_;
+ my @result;
+ open DATA, $file;
+ my %current;
+ while (<DATA>)
+ {
+ push @result, [$current{name}, $current{email}] if /^END:VCARD/i;
+ $current{name} = $1 if (/^FN:(.*)$/i);
+ $current{email} = $1 if (/^EMAIL;INTERNET:(.*)$/);
+ }
+ close DATA;
+ return \@result;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->set_position('center');
+ my $done = 0;
+ my $code;
+ while (!$done)
+ {
+ $code = $self->run;
+ if ($code ne 'ok')
+ {
+ $done = 1;
+ }
+ else
+ {
+ my $type = $self->{type}->getValue;
+ my $file = $self->{file}->getValue;
+ if (!$file)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{ImportExportFileEmpty});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+ next;
+ }
+ if ($type eq 'claws')
+ {
+ $self->{borrowers} = $self->importClaws($file);
+ }
+ elsif ($type eq 'ldif')
+ {
+ $self->{borrowers} = $self->importLdif($file);
+ }
+ elsif ($type eq 'vcard')
+ {
+ $self->{borrowers} = $self->importVcard($file);
+ }
+ $done = 1;
+ }
+ }
+ $self->hide;
+ return ($code eq 'ok');
+ }
+
+ sub getBorrowers
+ {
+ my $self = shift;
+ return $self->{borrowers};
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{BorrowersImportTitle},
+ 'gtk-convert'
+ );
+ bless ($self, $class);
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+
+ my $table = new Gtk2::Table(2,2,0);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::halfMargin);
+ $table->set_border_width($GCUtils::margin);
+
+ my $typeLabel = new GCLabel($parent->{lang}->{BorrowersImportType});
+ $self->{type} = new GCMenuList;
+ $self->{type}->setValues([
+ {value => 'ldif', displayed => 'LDIF'},
+ {value => 'claws', displayed => 'Claws Mail'},
+ {value => 'vcard', displayed => 'VCARD'},
+ ]);
+ my $fileLabel = new GCLabel($parent->{lang}->{BorrowersImportFile});
+ $self->{file} = new GCFile($self);
+
+ $table->attach($typeLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{type}, 1, 2, 0, 1, ['expand', 'fill'], 'fill', 0, 0);
+ $table->attach($fileLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{file}, 1, 2, 1, 2, ['expand', 'fill'], 'fill', 0, 0);
+
+ $self->vbox->pack_start($table, 1, 1, 0);
+
+ return $self;
+ }
+}
+
+{
+ package GCBorrowersDialog;
+ use base 'GCModalDialog';
+
+ sub initValues
+ {
+ use locale;
+
+ my $self = shift;
+ my $keepPrevious = shift;
+
+ my @borrowers;
+ my @emails;
+
+ if ($keepPrevious)
+ {
+ foreach my $line(@{$self->{people}->{data}})
+ {
+ push @borrowers, $line->[0];
+ push @emails, $line->[1];
+ }
+ }
+ else
+ {
+ @borrowers = split m/\|/, $self->{options}->borrowers;
+ @emails = split m/\|/, $self->{options}->emails;
+ }
+
+ @{$self->{people}->{data}} = ();
+ my %directory;
+
+ for (my $i = 0; $i < scalar(@borrowers); $i++)
+ {
+ $directory{$borrowers[$i]} = $emails[$i];
+ }
+
+ my @keys = sort keys %directory;
+ @keys = reverse @keys if $self->{reverse};
+ foreach (@keys)
+ {
+ my @infos = [$_, $directory{$_}];
+ push @{$self->{people}->{data}}, @infos;
+ }
+ $self->{people}->select(0);
+
+ (my $template = $self->{options}->template) =~ s|<br/>|\n|g;
+ $self->{mailTemplate}->setValue($template);
+
+ $self->{subject}->set_text($self->{options}->subject);
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ my $borrowers = '';
+ my $emails = '';
+ foreach (@{$self->{people}->{data}})
+ {
+ $borrowers .= $_->[0].'|';
+ $emails .= $_->[1].'|';
+ }
+ $borrowers =~ s/.$//;
+ $emails =~ s/.$//;
+ $self->{options}->borrowers($borrowers);
+ $self->{options}->emails($emails);
+
+ (my $template = $self->{mailTemplate}->getValue) =~ s/\n/<br\/>/g;
+ $self->{options}->template($template);
+
+ $self->{options}->subject($self->{subject}->get_text);
+
+ $self->{options}->save;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ if ($self->run eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub importBorrowers
+ {
+ my $self = shift;
+
+ $self->{importDialog} = new GCImportBorrowersDialog($self)
+ if ! $self->{importDialog};
+
+ if ($self->{importDialog}->show)
+ {
+ unshift @{$self->{people}->{data}}, @{$self->{importDialog}->getBorrowers};
+ }
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ my @idx = $self->{people}->get_selected_indices;
+
+ if ($^O =~ /win32/i)
+ {
+ my @newData;
+ my $i = 0;
+ foreach (@{$self->{people}->{data}})
+ {
+ push @newData, [$_->[0], $_->[1]] if $i != $idx[0];
+ $i++;
+ }
+ @{$self->{people}->{data}} = @newData;
+ }
+ else
+ {
+ splice @{$self->{people}->{data}}, $idx[0], 1;
+ }
+ }
+
+ sub add
+ {
+ my $self = shift;
+
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{BorrowersAdd},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $table = new Gtk2::Table(2,2,0);
+
+ my $labelName = new Gtk2::Label($self->{parent}->{lang}->{BorrowersName});
+ $table->attach($labelName, 0, 1, 0, 1, 'expand', 'fill', 5, 5);
+ my $name = new Gtk2::Entry;
+ $name->signal_connect('activate' => sub {$dialog->response('ok')});
+ $table->attach($name, 1, 2, 0, 1, 'expand', 'fill', 5, 5);
+
+ my $labelEmail = new Gtk2::Label($self->{parent}->{lang}->{BorrowersEmail});
+ $table->attach($labelEmail, 0, 1, 1, 2, 'expand', 'fill', 5, 5);
+ my $email = new Gtk2::Entry;
+ $email->signal_connect('activate' => sub {$dialog->response('ok')});
+ $table->attach($email, 1, 2, 1, 2, 'expand', 'fill', 5, 5);
+
+ $dialog->vbox->pack_start($table,1,1,0);
+ $dialog->vbox->show_all;
+
+ if ($dialog->run eq 'ok')
+ {
+ unshift @{$self->{people}->{data}}, [$name->get_text, $email->get_text];
+ }
+
+ $dialog->destroy;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{BorrowersTitle},
+ );
+
+ bless ($self, $class);
+
+ #$self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{reverse} = 0;
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ my $borrowersFrame = new GCGroup($self->{parent}->{lang}->{BorrowersList});
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{people} = new Gtk2::SimpleList($parent->{lang}->{BorrowersName} => "text",
+ $parent->{lang}->{BorrowersEmail} => "text");
+ $self->{people}->set_column_editable(1, 1);
+ $self->{people}->set_rules_hint(1);
+
+ $self->{people}->get_column(0)->set_sort_column_id(0);
+ $self->{people}->get_model->set_sort_column_id(0, 'ascending');
+
+ for my $i (0..1)
+ {
+ $self->{people}->get_column($i)->set_resizable(1);
+ }
+ $self->{order} = 1;
+ $self->{sort} = -1;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width(0);
+ $scrollPanelList->add($self->{people});
+
+ my $vboxButtons = new Gtk2::VBox(0,0);
+ my $addButton = Gtk2::Button->new_from_stock('gtk-add');
+ $addButton->signal_connect('clicked' => sub {
+ $self->add;
+ });
+ my $removeButton = Gtk2::Button->new_from_stock('gtk-remove');
+ $removeButton->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+
+ my $importButton = Gtk2::Button->new_from_stock('gtk-convert');
+ $importButton->signal_connect('clicked' => sub {
+ $self->importBorrowers;
+ });
+
+ #my $editButton = new Gtk2::Button($parent->{lang}->{BorrowersEdit});
+ $vboxButtons->pack_start($addButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($removeButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($importButton,0,0,$GCUtils::halfMargin);
+ #$vboxButtons->pack_start($editButton,0,0,0);
+
+ $hbox->pack_start($scrollPanelList,1,1,0);
+ $hbox->pack_start($vboxButtons,0,0,$GCUtils::margin);
+ $hbox->set_border_width(0);
+ $borrowersFrame->addWidget($hbox);
+ $self->vbox->pack_start($borrowersFrame,1,1,0);
+
+ my $templateFrame = new GCGroup($self->{parent}->{lang}->{BorrowersTemplate});
+ my $templateBox = new Gtk2::VBox(0,0);
+ $templateFrame->addWidget($templateBox);
+
+ $self->{mailTemplate} = new GCLongText;
+ $self->{mailTemplate}->set_size_request(-1,80);
+
+ my $hboxSubject = new Gtk2::HBox(0,0);
+ my $labelSubject = new Gtk2::Label($self->{parent}->{lang}->{BorrowersSubject});
+ $self->{subject} = new Gtk2::Entry;
+ $hboxSubject->pack_start($labelSubject,0,0,0);
+ $hboxSubject->pack_start($self->{subject},0,0,$GCUtils::halfMargin);
+
+
+# $templateBox->pack_start($labelTemplate,0,0,$GCUtils::halfMargin);
+ $templateBox->pack_start($hboxSubject,0,0,0);
+ $templateBox->pack_start($self->{mailTemplate},1,1,$GCUtils::halfMargin);
+
+ my $label1 = new Gtk2::Label($self->{parent}->{lang}->{BorrowersNotice1});
+ $label1->set_alignment(0,0);
+ my $label2 = new Gtk2::Label($self->{parent}->{lang}->{BorrowersNotice2});
+ $label2->set_alignment(0,0);
+ my $label3 = new Gtk2::Label($self->{parent}->{lang}->{BorrowersNotice3});
+ $label3->set_alignment(0,0);
+ $templateBox->pack_start($label1,0,0,0);
+ $templateBox->pack_start($label2,0,0,0);
+ $templateBox->pack_start($label3,0,0,0);
+
+ $self->vbox->pack_start($templateFrame, 1, 1, 0);
+
+ return $self;
+ }
+
+}
+
+{
+ package GCBorrowedDialog;
+ use base "Gtk2::Dialog";
+
+ sub setList
+ {
+ my ($self, $data, $model) = @_;
+
+ $self->setModel($model);
+ my $items = $data->getItemsListFiltered;
+ $self->{data} = $data;
+
+ $self->{itemsList} = [];
+ $self->{listModel}->clear;
+ my ($listId, $dataId) = (-1, -1);
+ foreach (@{$items})
+ {
+ $dataId++;
+ next if (!$_->{$self->{borrowerField}}) || ($_->{$self->{borrowerField}} eq 'none');
+ $listId++;
+ my $borrower = $_->{$self->{borrowerField}};
+ $borrower = $self->{parent}->{model}->getDisplayedText('PanelUnknown')
+ if $borrower eq 'unknown';
+ my $lendDate = GCUtils::timeToStr($_->{$self->{lendDateField}},
+ $self->{parent}->{options}->dateFormat);
+ push @{$self->{itemsList}}, {
+ $self->{titleField} => $_->{$self->{titleField}},
+ $self->{borrowerField} => $borrower,
+ $self->{lendDateField} => $_->{$self->{lendDateField}}
+ };
+ $self->{listModel}->set($self->{listModel}->append,
+ 0 => $_->{$self->{titleField}},
+ 1 => $borrower,
+ 2 => $lendDate,
+ 3 => $listId,
+ 4 => $dataId);
+ }
+
+ $self->{listView}->columns_autosize;
+ return if $listId == -1;
+ $self->{listView}->get_selection->select_iter($self->{listModel}->get_iter_first);
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ $self->run;
+ $self->hide;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{titleField} = $model->{commonFields}->{title};
+ $self->{borrowerField} = $model->{commonFields}->{borrower}->{name};
+ $self->{lendDateField} = $model->{commonFields}->{borrower}->{date};
+ $self->{historyField} = $model->{commonFields}->{borrower}->{history};
+
+ $self->{titleColumn}->set_title($model->getDisplayedItems);
+ }
+
+ sub displayItem
+ {
+ my ($self, $idx) = @_;
+ $self->{data}->display($idx);
+ $self->{data}->select($idx);
+ }
+
+ sub returnItem
+ {
+ my $self = shift;
+ my $current = $self->{data}->getCurrent;
+ my $iter = $self->{listView}->get_selection->get_selected;
+ my $idx = $self->{listModel}->get($iter, 4);
+ $self->displayItem($idx);
+ if ($self->{data}->{panel}->itemBack)
+ {
+ $self->{listModel}->remove($iter);
+ }
+ $self->displayItem($current);
+ return;
+ }
+
+ sub showHistory
+ {
+ my $self = shift;
+ my $iter = $self->{listView}->get_selection->get_selected;
+ return if !$iter;
+ my $idx = $self->{listModel}->get($iter, 4);
+ $self->{history}->setValue(
+ $self->{data}->getValue($idx, $self->{historyField})
+ );
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{BorrowedTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{parent} = $parent;
+ $self->{options} = $parent->{options};
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{listModel} = new Gtk2::ListStore('Glib::String', 'Glib::String', 'Glib::String',
+ 'Glib::Int', 'Glib::Int');
+ $self->{listView} = Gtk2::TreeView->new_with_model($self->{listModel});
+ $self->{listView}->set_rules_hint(1);
+ $self->{listView}->set_headers_clickable(1);
+
+ my @columns;
+ push @columns, Gtk2::TreeViewColumn->new_with_attributes('',
+ Gtk2::CellRendererText->new,
+ 'text' => 0);
+ push @columns, Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{PanelBorrower},
+ Gtk2::CellRendererText->new,
+ 'text' => 1);
+ push @columns, Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{BorrowedDate},
+ Gtk2::CellRendererText->new,
+ 'text' => 2);
+ $self->{titleColumn} = $columns[0];
+ for my $i (0..2)
+ {
+ $columns[$i]->set_resizable(1);
+ $columns[$i]->set_sort_column_id($i);
+ $columns[$i]->set_reorderable(1);
+ $self->{listView}->append_column($columns[$i]);
+ }
+ $self->{listModel}->set_sort_func(2, sub {
+ my ($model, $a, $b) = @_;
+ my ($day, $month, $year) = split m/\//,
+ $self->{itemsList}->[$model->get($a, 3)]->{$self->{lendDateField}};
+ my $dateA = join "_", $year, $month, $day;
+ ($day, $month, $year) = split m/\//,
+ $self->{itemsList}->[$model->get($b, 3)]->{$self->{lendDateField}};
+ my $dateB = join "_", $year, $month, $day;
+ return $dateA cmp $dateB;
+
+ });
+
+ $self->{listView}->get_selection->signal_connect ('changed' => sub {
+ $self->showHistory;
+ });
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width($GCUtils::margin);
+ $scrollPanelList->add($self->{listView});
+
+ $self->{context} = new Gtk2::Menu;
+ $self->{returned} = Gtk2::MenuItem->new($parent->{lang}->{PanelReturned});
+ $self->{returned}->signal_connect('activate', sub {
+ $self->returnItem;
+ });
+ $self->{context}->append($self->{returned});
+ $self->{display} = Gtk2::MenuItem->new($parent->{lang}->{BorrowedDisplayInPanel});
+ $self->{display}->signal_connect('activate', sub {
+ my $iter = $self->{listView}->get_selection->get_selected;
+ my $idx = $self->{listModel}->get($iter, 4);
+ $self->displayItem($idx);
+ });
+ $self->{context}->append($self->{display});
+ $self->{context}->show_all;
+
+ $self->{listView}->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+ $self->{context}->popup(undef, undef, undef, undef, $event->button, $event->time);
+ return 0;
+ });
+
+ my $historyExpander = new GCExpander($parent->{lang}->{PanelHistory});
+ $historyExpander->setValue($parent->{lang}->{PanelHistory});
+
+ my @labels = ($parent->{lang}->{PanelBorrower},
+ $parent->{lang}->{PanelLendDate},
+ $parent->{lang}->{PanelReturnDate});
+ $self->{history} = new GCMultipleList($self, 3, \@labels, 0, 2);
+
+ my $historyBox = new Gtk2::VBox(0,0);
+ $historyBox->set_border_width($GCUtils::margin);
+ $historyBox->pack_start($self->{history}, 1, 1, 0);
+
+ $historyExpander->add($historyBox);
+ $historyExpander->show_all;
+
+ $self->vbox->pack_start($scrollPanelList,1,1,0);
+ $self->vbox->pack_start($historyExpander,0,0, $GCUtils::halfMargin);
+
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCCommandLine.pm b/lib/gcstar/GCCommandLine.pm
new file mode 100644
index 0000000..17d2cf3
--- /dev/null
+++ b/lib/gcstar/GCCommandLine.pm
@@ -0,0 +1,395 @@
+package GCCommandLine;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+{
+ package GCPseudoFrame;
+
+ use File::Basename;
+ use File::Temp qw(tempdir);
+ use GCUtils;
+
+ sub new
+ {
+ my ($proto, $parent, $options, $lang, $keepPictures) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ options => $options,
+ imagePrefix => 'gcstar_',
+ lang => $lang,
+ parent => $parent,
+ agent => 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041111 Firefox/1.0',
+ };
+ bless ($self, $class);
+ $self->{tmpImageDir} = tempdir(CLEANUP => ($keepPictures ? 0 : 1));
+ return $self;
+ }
+
+ sub setCurrentModel
+ {
+ my ($self, $model) = @_;
+ return $self->{parent}->setModel($model);
+ }
+
+ sub transformTitle
+ {
+ my ($self, $title) = @_;
+ return $title;
+ }
+
+ sub getImagesDir
+ {
+ my ($self, $suffix, $itemTitle, $imagesDir) = @_;
+ return GCFrame::getImagesDir(@_);
+ }
+
+ sub getUniqueImageFileName
+ {
+ my ($self, $suffix, $itemTitle, $imagesDir) = @_;
+ return GCFrame::getUniqueImageFileName(@_);
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file) = @_;
+ return GCFrame::transformPicturePath(@_);
+ }
+
+ sub preloadModel
+ {
+ my ($self, $model) = @_;
+ # Preload the model into the factory cache
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ }
+
+ sub AUTOLOAD
+ {
+ our $AUTOLOAD;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ }
+}
+
+{
+
+ package GCCommandExecution;
+
+ use File::Temp qw/ :POSIX /;
+ use File::Basename;
+ use GCData;
+ use GCDisplay;
+ use GCExport;
+ use GCImport;
+ use GCPlugins;
+ use GCModel;
+
+ sub new
+ {
+ my ($proto, $options, $model, $plugin, $import, $export, $output) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ bless ($self, $class);
+
+ $self->{file} = $output;
+ $self->{useStdOut} = 0;
+ if (!$output)
+ {
+ (undef, $self->{file}) = tmpnam;
+ $self->{useStdOut} = 1;
+ }
+
+ GCPlugins::loadAllPlugins;
+ $self->{lang} = $GCLang::langs{$options->lang};
+ $self->{parent} = new GCPseudoFrame($self, $options, $self->{lang}, $self->{useStdOut});
+
+ $self->{modelsFactory} = new GCModelsCache($self->{parent});
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ $self->{parent}->{model} = $self->{model};
+ $self->{parent}->{modelsFactory} = $self->{modelsFactory};
+
+ $self->{plugin} = $pluginsMap{$model}->{$plugin};
+ $self->leave("Fetch plugin $plugin doesn't exist") if $plugin && (!$self->{plugin});
+
+ if ($import)
+ {
+ GCImport::loadImporters;
+ foreach (@importersArray)
+ {
+ $_->setLangName($options->lang);
+ if (($_->getName =~ /\Q$import/) || ($_ =~ /GCExport::GCExporter$export/))
+ {
+ $self->{importer} = $_;
+ last;
+ }
+ }
+ $self->leave("Import plugin $import doesn't exist") if $import && (!$self->{importer});
+ $self->{importer}->setModel($self->{model});
+ $self->{importOptions} = {};
+ foreach (@{$self->{importer}->getOptions})
+ {
+ $self->{importOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+ if ($export)
+ {
+ GCExport::loadExporters;
+ foreach (@exportersArray)
+ {
+ $_->setLangName($options->lang);
+ if (($_->getName eq $export) || ($_ =~ /GCExport::GCExporter$export/))
+ {
+ $self->{exporter} = $_;
+ last;
+ }
+ }
+ $self->leave("Export plugin $export doesn't exist") if $export && (!$self->{exporter});
+ $self->{exporter}->setModel($self->{model});
+ $self->{exportOptions} = {
+ lang => $self->{lang}
+ };
+ foreach (@{$self->{exporter}->getOptions})
+ {
+ $self->{exportOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+
+ $self->{toBeRemoved} = [];
+
+ $self->{data} = new GCItems($self->{parent});
+ $self->{data}->{options} = $options;
+
+ return $self;
+ }
+
+ sub DESTROY
+ {
+ my $self = shift;
+
+ unlink $_ foreach (@{$self->{toBeRemoved}});
+ }
+
+ sub leave
+ {
+ my ($self, $message) = @_;
+ print "$message\n";
+ $self->DESTROY;
+ exit 1;
+ }
+
+ sub listPlugins
+ {
+ my $self = shift;
+
+ foreach (sort keys %{$pluginsMap{$self->{model}->getName}})
+ {
+ print "$_\n";
+ print "\t", $pluginsMap{$self->{model}->getName}->{$_}->getAuthor,"\n";
+ print "\n";
+ }
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ if ($self->{exporter})
+ {
+ $self->{exporter}->setModel($self->{model});
+ foreach (@{$self->{exporter}->getOptions})
+ {
+ $self->{exportOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+ if ($self->{importer})
+ {
+ $self->{importer}->setModel($self->{model});
+ foreach (@{$self->{importer}->getOptions})
+ {
+ $self->{importOptions}->{$_->{name}} = $_->{default};
+ }
+ }
+ return 1;
+ }
+
+ sub setFields
+ {
+ my ($self, $fieldsFile) = @_;
+
+ $self->{fields} = [];
+ open FIELDS, '<'.$fieldsFile;
+ my $model = <FIELDS>;
+ chop $model;
+ while (<FIELDS>)
+ {
+ chop;
+ push @{$self->{fields}}, $_;
+ }
+ }
+
+ sub load
+ {
+ my ($self, $title) = @_;
+ my @data;
+ $self->leave("No fetch plugin specified") if !$self->{plugin};
+ $self->{plugin}->{title} = $title;
+ $self->{plugin}->{type} = 'load';
+ $self->{plugin}->{urlField} = $self->{model}->{commonFields}->{url};
+ $self->{plugin}->load;
+ my $itemNumber = $self->{plugin}->getItemsNumber();
+ $self->{plugin}->{type} = 'info';
+ for (my $i = 0;
+ $i < $itemNumber;
+ $i++)
+ {
+ $self->{plugin}->{wantedIdx} = $i;
+ my $info = $self->{plugin}->getItemInfo;
+ foreach (@{$self->{model}->{managedImages}})
+ {
+ $info->{$_} = $self->downloadPicture($info->{$_});
+ }
+ push @data, $info;
+ }
+ $self->{data}->setItemsList(\@data);
+ }
+
+ sub save
+ {
+ my $self = shift;
+ my $previousFile = $self->{data}->{options}->file;
+ my $previousRelativePaths = $self->{data}->{options}->useRelativePaths;
+ my $prevImages = $self->{parent}->getImagesDir;
+
+
+ my $newFile = GCUtils::pathToUnix(File::Spec->rel2abs($self->{file}));
+ $self->{data}->{options}->file($newFile);
+ $self->{parent}->{file} = $newFile;
+
+ # We re-generate it because it could have changed with new file name
+ my $newImages = $self->{parent}->getImagesDir;
+ if ($prevImages ne $newImages)
+ {
+ # The last parameter is for copy. When saving a new file, we move.
+ $self->{data}->setNewImagesDirectory($newImages, $prevImages, 1);
+ }
+
+ $self->{data}->{model} = $self->{model};
+ $self->{data}->{backend} = new GCBackend::GCBeXmlParser($self->{parent})
+ if ! $self->{data}->{backend};
+ $self->{data}->{options}->useRelativePaths(0) if $self->{useStdOut};
+ $self->{data}->save;
+ $self->{data}->{options}->useRelativePaths($previousRelativePaths);
+ $self->{data}->{options}->file($previousFile);
+ open IN, $self->{file};
+ if ($self->{useStdOut})
+ {
+ print $_ while (<IN>);
+ }
+ close IN;
+ unlink $self->{file} if $self->{useStdOut};
+ }
+
+ sub open
+ {
+ my ($self, $file) = @_;
+ $self->{data}->load($file, undef, undef, 1);
+ $self->{original} = $file;
+ }
+
+ sub import
+ {
+ my ($self, $file, $prefs) = @_;
+ $self->{importOptions}->{parent} = $self->{parent};
+ $self->{importOptions}->{file} = $file;
+ $self->{importOptions}->{fields} = $self->{fields};
+ $self->parsePrefs($prefs, $self->{importOptions});
+ $self->{importer}->{options} = $self->{importOptions};
+ $self->{data}->setItemsList($self->{importer}->getItemsArray($file));
+ $self->setModel($self->{importer}->getModelName);
+ $self->{data}->{model} = $self->{model}
+ if $self->{data};
+ }
+
+ sub export
+ {
+ my ($self, $prefs) = @_;
+
+ if (!scalar $self->{fields})
+ {
+ $self->{fields} = $self->{model}->{fieldsNames};
+ }
+ $self->{exportOptions}->{parent} = $self->{parent};
+ $self->{exportOptions}->{fields} = $self->{fields};
+ $self->{exportOptions}->{originalList} = $self->{data};
+ $self->{exportOptions}->{withPictures} = 1;
+ $self->{exportOptions}->{file} = $self->{file};
+ $self->{exportOptions}->{collection} = $self->{original};
+ $self->{exportOptions}->{fieldsInfo} = $self->{model}->{fieldsInfo};
+ $self->{exportOptions}->{items} = $self->{data}->getItemsListFiltered;
+ $self->{exportOptions}->{defaultImage} = $ENV{GCS_SHARE_DIR}.'/logos/no.png';
+ $self->parsePrefs($prefs, $self->{exportOptions});
+ $self->{data}->{model} = $self->{model}
+ if $self->{data};
+
+ $self->{exporter}->process($self->{exportOptions});
+
+ CORE::open IN, $self->{exportOptions}->{file};
+ if ($self->{useStdOut})
+ {
+ print $_ while (<IN>);
+ }
+ close IN;
+ unlink $self->{exportOptions}->{file} if $self->{useStdOut};
+ }
+
+ sub downloadPicture
+ {
+ my ($self, $pictureUrl) = @_;
+
+ return '' if ! $pictureUrl;
+ my ($name,$path,$suffix) = fileparse($pictureUrl, "\.gif", "\.jpg", "\.jpeg", "\.png");
+ (undef, my $picture) = tmpnam;
+ $picture .= $suffix;
+
+ GCUtils::downloadFile($pictureUrl, $picture, $self->{parent});
+ push @{$self->{toBeRemoved}}, $picture;
+ return $picture;
+ }
+
+ sub parsePrefs
+ {
+ my ($self, $prefs, $cont) = @_;
+
+ foreach (split /,/, $prefs)
+ {
+ my @option = split /=>/, $_;
+ $option[0] =~ s/^\s*//g;
+ $option[0] =~ s/\s*$//g;
+ $option[1] =~ s/^\s*//g;
+ $option[1] =~ s/\s*$//g;
+ $cont->{$option[0]} = $option[1];
+ }
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCData.pm b/lib/gcstar/GCData.pm
new file mode 100644
index 0000000..84582f3
--- /dev/null
+++ b/lib/gcstar/GCData.pm
@@ -0,0 +1,970 @@
+package GCData;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+
+{
+ package GCItems;
+ #
+ # This is seen as $main->{items}
+ #
+ use XML::Parser;
+ use Storable;
+ use File::Copy;
+ use File::Path;
+ use File::Basename;
+
+ use GCModel;
+ use GCBackend::GCBackendXmlParser;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+
+ $self->{parent} = $parent;
+
+ $self->{imagesToBeRemoved} = [];
+ $self->{imagesToBeAdded} = [];
+ $self->{loaded} = {};
+
+ $self->{currentItem} = -1;
+ $self->{hasBeenDeleted} = 0;
+ $self->{block} = 0;
+ $self->{previousFile} = 0;
+ #$self->{filterSearch} = new GCFilterSearch;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub initModel
+ {
+ #if $modelChanged is set, that means we updated the currently used model
+ # and not that we changed the model
+ my ($self, $model, $modelUpdated) = @_;
+ $self->{model} = $model;
+ $self->{parent}->notifyModelChange($modelUpdated);
+ }
+
+ sub setPanel
+ {
+ my ($self, $panel) = @_;
+ $self->{panel} = $panel;
+ }
+
+ sub unselect
+ {
+ my ($self) = @_;
+
+ $self->{currentItem} = -1;
+ }
+
+ sub updateSelectedItemInfoFromGivenPanel
+ {
+ my ($self, $panel) = @_;
+ my $previousPanel = $self->{panel};
+ $self->{panel} = $panel;
+ $self->updateSelectedItemInfoFromPanel(1);
+ $self->{panel} = $previousPanel;
+ }
+
+ sub getInfoFromPanel
+ {
+ # $info contains default values that will be merged with new ones
+ my ($self, $panel, $info) = @_;
+
+ my $idField = $self->{model}->{commonFields}->{id};
+ my $panelId = $panel->$idField;
+ my $previousId = $info->{$idField};
+
+ my $changed = 0;
+ if ($panelId &&
+ ($panelId != $previousId))
+ {
+ $info->{$idField} = $panel->$idField;
+ $self->{loaded}->{information}->{maxId} = $panelId
+ if ($panelId > $self->{loaded}->{information}->{maxId});
+ $self->findMaxId if $previousId == $self->{loaded}->{information}->{maxId};
+ $changed = 1;
+ }
+ $panel->$idField($info->{$idField}) if $panel->$idField;
+
+ my $previous = {$idField => $previousId};
+
+ for my $field (@{$self->{model}->{fieldsNames}})
+ {
+ next if $field eq $idField;
+ $previous->{$field} = $info->{$field};
+ next if !$panel->{$field}->hasChanged;
+ $panel->{$field}->addHistory if ($self->{model}->{fieldsInfo}->{$field}->{hasHistory});
+ $changed = 1;
+ $info->{$field} = $panel->$field;
+ $self->{parent}->{menubar}->checkFilter($field);
+ }
+
+ return ($changed, $info, $previous);
+ }
+
+ sub updateSelectedItemInfoFromPanel
+ {
+ my ($self, $withSelect, $forced) = @_;
+ my $selectedChanged = 0;
+ my $filtered = 0;
+ return $selectedChanged if $self->{currentItem} == -1;
+ my $info;
+ if ($self->{multipleMode})
+ {
+ $info = {};
+ }
+ else
+ {
+ $info = ($self->getItemsListFiltered)->[$self->{currentItem}];
+ }
+
+ my $changed;
+ my $previous;
+ ($changed, $info, $previous) = $self->getInfoFromPanel($self->{panel}, $info);
+ if ($forced)
+ {
+ $previous->{$_} = 'GCS_FORCED' foreach @$forced;
+ }
+ if ($changed)
+ {
+ if ($self->{multipleMode})
+ {
+ my $newIdx;
+ # Propagate the changes to all the items
+ foreach (@{$self->{multipleCurrentItems}})
+ {
+ my $previous = Storable::dclone(($self->getItemsListFiltered)->[$_]);
+ my $item = ($self->getItemsListFiltered)->[$_];
+ for my $field (keys %$info)
+ {
+ $item->{$field} = $info->{$field};
+ }
+ $self->{panel}->dataChanged($item, 1);
+ $newIdx = $self->{parent}->{itemsView}->changeItem($_, $previous, $item);
+ if ($newIdx != $_)
+ {
+ $selectedChanged = 1;
+ }
+ }
+ if ($selectedChanged)
+ {
+ $self->{currentItem} = $self->{parent}->{itemsView}->getCurrentIdx;
+ $self->{multipleMode} = 0;
+ $self->displayCurrent;
+ }
+ }
+ else
+ {
+ $self->{panel}->dataChanged($info);
+ my $current = $self->{parent}->{itemsView}->changeCurrent($previous,
+ $info,
+ $self->{currentItem},
+ $withSelect);
+ # If we didn't selected the same, the selection didn't change
+ if ($current != $self->{currentItem})
+ {
+ $self->{currentItem} = $current;
+ $self->displayCurrent if $withSelect;
+ $selectedChanged = 1;
+ }
+ if ($selectedChanged)
+ {
+ $filtered = 1;
+ $selectedChanged = 0 if !$withSelect;
+ }
+ }
+ $self->{parent}->checkPanelVisibility;
+ $self->{parent}->markAsUpdated;
+ }
+ return ($selectedChanged, $filtered);
+ }
+
+ sub getTitle
+ {
+ my ($self, $idx) = @_;
+ if ($self->{multipleMode})
+ {
+ # Multiple items selected, so just use collection title or filename
+ my $name;
+ if ($self->{parent}->{options}->file)
+ {
+ $name = $self->{parent}->{items}->getInformation->{name}
+ if $self->{parent}->{items};
+ $name ||= basename($self->{parent}->{options}->file);
+ }
+ else
+ {
+ $name = $self->{parent}->{lang}->{UnsavedCollection};
+ }
+ return $name;
+ }
+ else
+ {
+ my $realIdx = $idx;
+ $realIdx = $self->{currentItem} if ! defined $idx;
+ return ($self->getItemsListFiltered)->[$realIdx]->{$self->{model}->{commonFields}->{title}};
+ }
+ }
+
+ sub getCurrent
+ {
+ my ($self) = @_;
+ return $self->{currentItem};
+ }
+
+ sub displayCurrent
+ {
+ my ($self) = @_;
+ $self->displayInPanel($self->{panel}, undef);
+ }
+
+ sub displayInPanel
+ {
+ my ($self, $panel, $idx) = @_;
+ my $info;
+ if ($self->{multipleMode})
+ {
+ # We merge all the items here
+ my %fields = map {$_ => 1} @{$self->{model}->{fieldsNotFormatted}};
+ foreach (@{$self->{multipleCurrentItems}})
+ {
+ my $item = ($self->getItemsListFiltered)->[$_];
+ for my $field (keys %fields)
+ {
+ if (exists $info->{$field})
+ {
+ if ($self->transformValue($info->{$field}, $field)
+ ne
+ $self->transformValue($item->{$field}, $field))
+ {
+ $info->{$field} = '';
+ delete $fields{$field};
+ # TODO store the information also elsewhere to mark
+ # the fields in panel. Or mark it immediately with something
+ # such as
+ # panel->markAsDirty($field);
+ }
+ }
+ else
+ {
+ $info->{$field} = $item->{$field};
+ }
+ }
+ }
+ }
+ else
+ {
+ $idx = $self->{currentItem} if ! defined $idx;
+ return if $self->{currentItem} < 0;
+ $info = ($self->getItemsListFiltered)->[$idx];
+ }
+ $self->displayDataInPanel($panel, $info);
+ }
+
+ sub displayDataInPanel
+ {
+ my ($self, $panel, $info) = @_;
+ for my $field (@{$self->{model}->{fieldsNotFormatted}})
+ {
+ $panel->$field($info->{$field});
+ $panel->{$field}->resetChanged
+ if $panel->{$field};
+ }
+
+ $panel->dataChanged;
+ $GCGraphicComponent::somethingChanged = 0;
+ }
+
+ sub display
+ {
+ my $self = shift;
+ return if (! $self->{itemArray}) || (! scalar @{$self->{itemArray}});
+ my @numbers = @_;
+ my $number;
+ my $multipleMode;
+ my $withSelect = 0;
+ my $noUpdate = 0;
+ if ($#numbers > 0)
+ {
+ $multipleMode = 1;
+ $self->{multipleCurrentItems} = \@numbers;
+ }
+ else
+ {
+ $multipleMode = 0;
+ $number = $numbers[0];
+ if ($number == -1)
+ {
+ $number = 0;
+ $noUpdate = 1;
+ }
+ # We want a selection if user clicked on the same one
+ $withSelect = ($number == $self->{currentItem});
+ }
+ my ($selectedHasChanged, $filtered) = (0, 0);
+
+ if ((!$noUpdate) && ($self->{currentItem} > -1) && !($self->{hasBeenDeleted}))
+ {
+ ($selectedHasChanged, $filtered) = $self->updateSelectedItemInfoFromPanel($withSelect);
+ }
+ else
+ {
+ $self->{currentItem} = $number
+ if !$multipleMode;
+ }
+ $self->{multipleMode} = $multipleMode;
+ $self->{hasBeenDeleted} = 0;
+
+ $self->{currentItem} = $number if !$selectedHasChanged && !$multipleMode;
+ $self->displayCurrent if !$selectedHasChanged;
+ return ($selectedHasChanged || $filtered);
+ }
+
+ sub valueToDisplayed
+ {
+ my ($self, $value, $field) = @_;
+ my $displayed = $self->{model}->getDisplayedValue($self->{model}->{fieldsInfo}->{$field}->{values}, $value);
+ return $displayed if $displayed;
+ # For personal models, it won't return a value. Then we keep the original one.
+ return $value;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field, $type) = @_;
+
+ $type ||= $self->{model}->{fieldsInfo}->{$field}->{type};
+ $value = $self->{parent}->transformTitle($value) if $field eq $self->{model}->{commonFields}->{title};
+ #$value = GCPreProcess::reverseDate($value) if $type eq 'date';
+ $value = GCUtils::timeToStr($value, $self->{parent}->{options}->dateFormat)
+ if $type eq 'date';
+ $value = $self->valueToDisplayed($value, $field) if $type eq 'options';
+ $value = GCPreProcess::multipleList($value, $type) if $type =~ /list$/o;
+ return $value;
+ }
+
+ sub getValue
+ {
+ my ($self, $idx, $field) = @_;
+
+ return ($self->getItemsListFiltered)->[$idx]->{$field};
+ }
+
+ sub setValue
+ {
+ my ($self, $idx, $field, $value) = @_;
+
+ ($self->getItemsListFiltered)->[$idx]->{$field} = $value;
+ if ($idx == $self->{currentItem})
+ {
+ $self->{panel}->$field($value);
+ $self->{panel}->dataChanged;
+ }
+ }
+
+ sub getItemsListFiltered
+ {
+ my ($self, $filter) = @_;
+
+ return $self->{itemArray} if ! $filter;
+ my @results = ();
+ foreach (@{$self->{itemArray}})
+ {
+ if ($self->{parent}->{filterSearch}->test($_))
+ {
+ push @results, $_;
+ }
+ }
+ return \@results;
+ }
+
+ # Should only be used by GCCommandExecution
+ sub setItemsList
+ {
+ my ($self, $itemsList) = @_;
+
+ $self->{itemArray} = $itemsList;
+ }
+
+ sub getInformation
+ {
+ my $self = shift;
+ $self->{loaded}->{information} ||= {};
+ return $self->{loaded}->{information};
+ }
+
+ sub setInformation
+ {
+ my ($self, $info) = @_;
+ $self->{loaded}->{information} = $info;
+ }
+
+ sub reloadList
+ {
+ my ($self, $splash, $fullProgress, $filtering) = @_;
+ return if $self->{block};
+ if ($splash)
+ {
+ $splash->initProgress if $fullProgress;
+ $splash->setItemsTotal(scalar @{$self->{itemArray}})
+ if $self->{itemArray};
+ }
+ $self->{parent}->{itemsView}->reset if $self->{parent}->{itemsView};
+
+ my $lastDisplayed = -1;
+ my $hasId = 0;
+ my $j = 0;
+ my $idField = $self->{model}->{commonFields}->{id};
+ my $currentId;
+
+ # If we don't get an history from BE, we will have to initialize it now
+ my $historyNeeded = ! $self->{loaded}->{gotHistory};
+ my %histories;
+
+ foreach (@{$self->{itemArray}})
+ {
+ if ($historyNeeded)
+ {
+ foreach my $field (@{$self->{model}->{fieldsHistory}})
+ {
+ #push @{$histories{$field}}, $_->{$field};
+ $self->{panel}->addHistory($_->{$field}, 1);
+ }
+ }
+
+ $currentId = $_->{$idField};
+
+ $self->{parent}->{itemsView}->addItem($_, 0);
+ $lastDisplayed = $j;
+ $splash->setProgressForItemsDisplay($j) if $splash;
+ $j++;
+ }
+
+ if ($historyNeeded)
+ {
+ for my $hfield(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$hfield}->setDropDown;
+ }
+ # Now we are sure we got one
+ $self->{loaded}->{gotHistory} = 2;
+ }
+
+ $self->{panel}->show if $j;
+
+ #if ($splash && $fullProgress)
+ #{
+ # $splash->endProgress;
+ #}
+
+ if (! $self->{parent}->{initializing})
+ {
+ $self->{parent}->reloadDone(0, $splash);
+ $self->select($self->{currentItem}, 0);
+ }
+ }
+
+ sub select
+ {
+ my ($self, $value, $init) = @_;
+ return if !$self->{parent}->{itemsView};
+ return $self->{parent}->{itemsView}->select($value, $init) unless $value < -1;
+ }
+
+ sub removeCurrentItems
+ {
+ my $self = shift;
+
+ my $numbers = $self->{parent}->{itemsView}->getCurrentItems;
+
+ my $nbRemoved = 0;
+ # Numerically sort list
+ foreach my $number(sort {$a <=> $b} @$numbers)
+ {
+ # We need to adjust it because we already removed other ones.
+ my $actualNumber = $number - $nbRemoved;
+ foreach (@{$self->{model}->{managedImages}})
+ {
+ my $image = $self->{itemArray}->[$actualNumber]->{$_};
+ $self->{parent}->checkPictureToBeRemoved($image);
+ }
+
+ splice @{$self->{itemArray}}, $actualNumber, 1;
+ $nbRemoved++;
+ }
+ my $newIdx = $self->{parent}->{itemsView}->removeCurrentItems; #($number);
+
+ $self->{currentItem} = $newIdx;
+ $self->{multipleMode} = 0;
+ $self->{hasBeenDeleted} = 1;
+ $self->displayCurrent;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $keepId, $noSelect) = @_;
+ my $nbItems = scalar @{$self->{itemArray}};
+# $self->{panel}->show if ! $nbItems;
+
+ my $currentId;
+ if ($keepId)
+ {
+ $currentId = $self->{itemArray}->[$nbItems]->{$self->{model}->{commonFields}->{id}};
+ }
+ else
+ {
+ $self->{loaded}->{information}->{maxId}++;
+ $currentId = $self->{loaded}->{information}->{maxId};
+ $self->{itemArray}->[$nbItems]->{$self->{model}->{commonFields}->{id}} = $currentId;
+ }
+
+ for my $field (@{$self->{model}->{fieldsNames}})
+ {
+ next if $field eq $self->{model}->{commonFields}->{id};
+ if ($self->{model}->{fieldsInfo}->{$field}->{hasHistory})
+ {
+ $self->{panel}->{$field}->addHistory($info->{$field});
+ }
+ $self->{itemArray}->[$nbItems]->{$field} = $info->{$field};
+ }
+
+ $self->{parent}->{itemsView}->addItem($self->{itemArray}->[$nbItems], 1);
+
+ $self->{multipleMode} = 0;
+ $self->{currentItem} = $nbItems;
+ $self->displayCurrent;
+ $self->select($nbItems, 0)
+ if !$noSelect;
+
+ $self->{parent}->{itemsView}->showCurrent;
+
+ return $currentId;
+ }
+
+ sub setOptions
+ {
+ my ($self, $options) = @_;
+
+ $self->{options} = $options;
+
+ #return $self->load($options->file, $splash, 0);
+ }
+
+ sub markToBeRemoved
+ {
+ my ($self, $image) = @_;
+ push @{$self->{imagesToBeRemoved}}, $image;
+ }
+
+ sub markToBeAdded
+ {
+ my ($self, $image) = @_;
+ push @{$self->{imagesToBeAdded}}, $image;
+ }
+
+ sub removeMarkedPictures
+ {
+ my $self = shift;
+ my $image;
+ foreach $image(@{$self->{imagesToBeRemoved}})
+ {
+ unlink $image;
+ }
+
+ $self->{imagesToBeRemoved} = [];
+ }
+
+ sub addMarkedPictures
+ {
+ my $self = shift;
+
+ $self->{imagesToBeAdded} = [];
+ }
+
+ sub clean
+ {
+ my $self = shift;
+ my $image;
+ foreach (@{$self->{imagesToBeAdded}})
+ {
+ unlink $_;
+ }
+ $self->{oldImagesDirectory} = {};
+ $self->{newImagesDirectory} = undef;
+ $self->{copyImagesWhenChangingDir} = 0;
+ }
+
+ sub setNewImagesDirectory
+ {
+ # $prev is also a parameter because we didn't store it here
+ my ($self, $new, $prev, $withCopy) = @_;
+ $new =~ s|/$||;
+ $self->{newImagesDirectory} = $new;
+ $self->{copyImagesWhenChangingDir} = $withCopy;
+ # We stored the previous one as a hash so it will be easier for tests
+ $prev =~ s|/$||;
+ $self->{oldImagesDirectory}->{$prev} = 1;
+ }
+
+ sub setPreviousFile
+ {
+ my ($self, $prev) = @_;
+
+ $self->{previousFile} = $prev;
+ }
+
+ sub queryReplace
+ {
+ my ($self, $field, $old, $new, $caseSensitive) = @_;
+ foreach (@{$self->{itemArray}})
+ {
+ if (ref($_->{$field}) eq 'ARRAY')
+ {
+ foreach my $subval(@{$_->{$field}})
+ {
+ foreach my $val(@$subval)
+ {
+ if ($caseSensitive)
+ {
+ $val =~ s/$old/$new/g;
+ }
+ else
+ {
+ $val =~ s/$old/$new/gi;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ($caseSensitive)
+ {
+ $_->{$field} =~ s/$old/$new/g;
+ }
+ else
+ {
+ $_->{$field} =~ s/$old/$new/gi;
+ }
+ }
+ }
+ $self->displayCurrent;
+ $self->reloadList;
+ }
+
+ sub findMaxId
+ {
+ my $self = shift;
+
+ $self->{loaded}->{information}->{maxId} = -1;
+ foreach (@{$self->{itemArray}})
+ {
+ $self->{loaded}->{information}->{maxId} = $_->{$self->{model}->{commonFields}->{id}}
+ if $_->{$self->{model}->{commonFields}->{id}} > $self->{loaded}->{information}->{maxId};
+ }
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+ $self->{currentItem} = -1;
+ $self->{loaded} = {};
+ $self->{itemArray} = [];
+ $self->{panel}->hide if $self->{panel};
+ $self->{parent}->{itemsView}->clearCache if $self->{parent}->{itemsView};
+ $self->{parent}->{itemsView}->reset if $self->{parent}->{itemsView};
+ #$self->{parent}->reloadDone(1) if ! $self->{parent}->{initializing};
+ #$self->reloadList if ! $self->{parent}->{initializing};
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+ return 0 if ! $self->{itemArray};
+ return scalar @{$self->{itemArray}};
+ }
+
+ sub setLock
+ {
+ my ($self, $value) = @_;
+ $self->{loaded}->{information}->{locked} = $value;
+ }
+
+ sub getLock
+ {
+ my $self = shift;
+ return $self->{loaded}->{information}->{locked};
+ }
+
+ sub getBackend
+ {
+ my ($self, $file) = @_;
+ $self->{backend} = new GCBackend::GCBeXmlParser($self->{parent})
+ if !$self->{backend};
+ $self->{backend}->setParameters(file => $file,
+ version => $self->{parent}->{version});
+ return $self->{backend};
+ }
+
+ sub getVersion
+ {
+ my ($self, $file) = @_;
+
+ return $self->getBackend($file)->getVersion;
+ }
+
+ sub load
+ {
+ my ($self, $file, $splash, $fullProgress, $noReload) = @_;
+
+ my $initTime;
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ eval 'use Time::HiRes';
+ eval '$initTime = [Time::HiRes::gettimeofday()]';
+ }
+
+ $self->clean;
+ if (!$file)
+ {
+ $self->{parent}->setCurrentModel;
+ return 0;
+ }
+
+ my $collection;
+
+ $self->{block} = 1;
+ $self->clearList;
+ $self->{block} = 0;
+ $self->{splash} = $splash;
+ my $backend;
+ eval
+ {
+ $backend = $self->getBackend($file);
+
+ $self->{loaded} = $backend->load($splash);
+ # We keep a direct access to this one
+ $self->{itemArray} = $self->{loaded}->{data};
+ };
+ if ($@)
+ {
+ my @error = ('Fatal error while reading file', $@);
+ return (0, \@error);
+ }
+ elsif ($self->{loaded}->{error})
+ {
+ return (0, $self->{loaded}->{error});
+ }
+
+ # Perform Models Change if needed
+ if(!$self->{model}->{isInline} && ($backend->getVersion() ne $backend->{version}))
+ {
+ my $modelFormatUpdater=GCModelsChanges->new($self,$self->{model}->{collection}->{name});
+ $modelFormatUpdater->applyChanges($self->{itemArray}, $backend->getVersion(), $backend->{version});
+ }
+
+ # Hide the panel if no item
+ if (! scalar @{$self->{itemArray}})
+ {
+ $self->{panel}->hide;
+ }
+
+ # gotHistory = 1 means we got one but it has not been set in components
+ if ($self->{loaded}->{gotHistory} == 1)
+ {
+ for my $hfield(@{$self->{model}->{fieldsHistory}})
+ {
+ if (exists $self->{loaded}->{histories}->{$hfield})
+ {
+ $self->{panel}->{$hfield}->setValues($self->{loaded}->{histories}->{$hfield}, 1);
+ }
+ $self->{panel}->{$hfield}->setDropDown;
+ }
+# $self->{loaded}->{gotHistory} = 2;
+ }
+ elsif ($self->{loaded}->{gotHistory} == 2)
+ {
+ for my $hfield(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$hfield}->setDropDown;
+ }
+ }
+
+ $self->reloadList($splash, $fullProgress) unless $noReload;
+
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ my $elapsed;
+ eval '$elapsed = Time::HiRes::tv_interval($initTime)';
+ print "Load time : $elapsed\n";
+ }
+
+ return 1;
+ }
+
+ sub movePictures
+ {
+ my ($self) = @_;
+ eval {
+ mkpath $self->{newImagesDirectory};
+ my $file;
+ my $dataFile = $self->{previousFile} ? $self->{previousFile} : $self->{options}->file;
+ foreach (@{$self->getItemsListFiltered})
+ {
+ foreach my $pic(@{$self->{model}->{fieldsImage}})
+ {
+ $file = GCUtils::getDisplayedImage($_->{$pic},
+ '',
+ $dataFile);
+ # Not moving picture if it is not in the previous directory
+ next if !$file;
+ next if ! exists $self->{oldImagesDirectory}->{Cwd::realpath(dirname($file))};
+ (my $suffix = $file) =~ s/.*?(\.[^.]*)$/$1/;
+ my $new =
+ $self->{parent}->getUniqueImageFileName(
+ $suffix,
+ $_->{$self->{model}->{commonFields}->{title}});
+
+ if ($self->{copyImagesWhenChangingDir})
+ {
+ copy $file, $new;
+ }
+ else
+ {
+ move $file, $new;
+ }
+ $_->{$pic} = $new;
+ }
+ }
+ };
+ $self->{previousFile} = 0;
+ return $@ if $@;
+ $self->displayCurrent;
+ $self->{newImagesDirectory} = undef;
+ $self->{copyImagesWhenChangingDir} = 0;
+ $self->{oldImagesDirectory} = {};
+ return 0;
+ }
+
+ sub save
+ {
+ my ($self, $splash) = @_;
+
+ my $initTime;
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ eval 'use Time::HiRes';
+ eval '$initTime = [Time::HiRes::gettimeofday()]';
+ }
+
+ $self->updateSelectedItemInfoFromPanel if ($self->{currentItem} > -1);
+
+ # TODO : Use progress bar for this operation also
+ my $moveError = $self->movePictures
+ if $self->{newImagesDirectory};
+ return (0, ['SaveError', $moveError])
+ if $moveError;
+
+
+ if ($splash)
+ {
+ $splash->initProgress($self->{parent}->{lang}->{StatusSave});
+ $splash->setItemsTotal(scalar @{$self->{itemArray}});
+ }
+ $self->addMarkedPictures;
+ $self->removeMarkedPictures;
+
+ my $backend = $self->getBackend($self->{options}->file);
+
+ # We re-generate histories to give it to backend
+ # Deactivated for the moment
+# if ($self->{panel})
+# {
+# my %histories;
+# for my $hfield(@{$self->{model}->{fieldsHistory}})
+# {
+# $histories{$hfield} = $self->{panel}->{$hfield}->getValues;
+# }
+# $backend->setHistories(\%histories);
+# }
+
+ my $result = $backend->save($self->{itemArray},
+ $self->{loaded}->{information},
+ $splash);
+
+ $self->{parent}->endProgress;
+ if ($result->{error})
+ {
+ return (0, $result->{error});
+ }
+ $self->{parent}->removeUpdatedMark;
+
+ if ($ENV{GCS_PROFILING} > 0)
+ {
+ my $elapsed;
+ eval '$elapsed = Time::HiRes::tv_interval($initTime)';
+ print "Save time : $elapsed\n";
+ }
+ return 1;
+ }
+
+ sub getSummary
+ {
+ my ($self, $idx) = @_;
+
+ my $info = ($self->getItemsListFiltered)->[$idx];
+
+ my $summary = "<b>".GCUtils::encodeEntities($info->{$self->{model}->{commonFields}->{title}})."</b>\n";
+
+ for my $field (@{$self->{model}->getSummaryFields})
+ {
+ my $value = $info->{$field};
+
+ if ($field eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $value = $self->{parent}->{lang}->{PanelNobody}
+ if $value eq 'none';
+ $value = $self->{parent}->{lang}->{PanelUnknown}
+ if $value eq 'unknown';
+ }
+ else
+ {
+ $value = GCUtils::encodeEntities($self->transformValue($value, $field));
+ }
+ $summary .= "\n<b>"
+ .GCUtils::encodeEntities($self->{model}->getDisplayedLabel($field))
+ .$self->{parent}->{lang}->{Separator}
+ ."</b>"
+ .$value;
+ }
+ return $summary;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCDialogs.pm b/lib/gcstar/GCDialogs.pm
new file mode 100644
index 0000000..19908cd
--- /dev/null
+++ b/lib/gcstar/GCDialogs.pm
@@ -0,0 +1,1519 @@
+package GCDialogs;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+use utf8;
+
+our @okCancelButtons = ('gtk-cancel'=>'cancel', 'gtk-ok'=>'ok');
+
+my $hasAboutDialog = 1;
+eval 'Gtk2::AboutDialog->set_email_hook(undef, undef)';
+$hasAboutDialog = 0 if $@;
+
+{
+ package GCModalDialog;
+ use base "Gtk2::Dialog";
+
+ sub showMe
+ {
+ my $self = shift;
+
+ $self->present;
+ }
+
+ sub activateOkButton
+ {
+ my ($self, $value) = @_;
+ ($self->action_area->get_children)[$self->{okPosition}]->set_sensitive($value);
+ }
+
+ sub activateExtraButton
+ {
+ my ($self, $value) = @_;
+ ($self->action_area->get_children)[$self->{extraPosition}]->set_sensitive($value);
+ }
+
+ sub setOkLabel
+ {
+ my ($self, $label) = @_;
+ my @buttons = $self->action_area->get_children;
+ my $tmpWidget = $buttons[0];
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->set_label($label);
+ }
+
+ sub setCancelLabel
+ {
+ my ($self, $label) = @_;
+ my @buttons = $self->action_area->get_children;
+ my $tmpWidget = $buttons[1];
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->set_label($label);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $okLabel, $extraAfter, @extraButtons) = @_;
+ $title =~ s/_//g;
+ my $class = ref($proto) || $proto;
+ my @buttons;
+ if ((defined $okLabel) && ($okLabel =~ /^gtk-/))
+ {
+ @buttons = ('gtk-cancel'=>'cancel', $okLabel=>'ok');
+ $okLabel = '';
+ }
+ else
+ {
+ @buttons = @GCDialogs::okCancelButtons;
+ }
+ my ($okPosition, $extraPosition) = (0, -1);
+ if (@extraButtons)
+ {
+ if ($extraAfter)
+ {
+ $okPosition = 1;
+ $extraPosition = 0;
+ push @buttons, @extraButtons;
+ }
+ else
+ {
+ $okPosition = 0;
+ $extraPosition = 2;
+ unshift @buttons, @extraButtons;
+ }
+ }
+ my $self = $class->SUPER::new($title,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @buttons
+ );
+ bless ($self, $class);
+
+ ($self->{okPosition}, $self->{extraPosition}) = ($okPosition, $extraPosition);
+
+ $self->setOkLabel($okLabel) if $okLabel;
+ $self->set_default_response('ok');
+
+ $self->{parent} = $parent;
+
+ $self->vbox->set_border_width($GCUtils::margin);
+
+ return $self;
+ }
+}
+
+{
+ package GCAboutDialog;
+ if (!$hasAboutDialog)
+ {
+ use base "Gtk2::Dialog";
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ if ($hasAboutDialog)
+ {
+ $self->{about}->set_position('center-on-parent');
+ $self->{about}->run;
+ $self->{about}->hide;
+ }
+ else
+ {
+ $self->SUPER::show();
+ $self->show_all;
+ my $code = $self->run;
+ $self->hide;
+ }
+ }
+
+ sub changeStyle
+ {
+ my $self = shift;
+ $self->{vBox}->set_border_width(0);
+ ($self->{vBox}->get_children)[1]->set_border_width($self->{border});
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $version) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self;
+
+ my $logoFile = $parent->{logosDir}.'about.png';
+
+ if ($hasAboutDialog)
+ {
+ $self = {
+ about => new Gtk2::AboutDialog,
+ parent => $parent
+ };
+ bless ($self, $class);
+
+ open LICENSE, "<".$ENV{GCS_SHARE_DIR}.'/LICENSE';
+ my $license = do {local $/; <LICENSE>};
+ close LICENSE;
+ my @authors = split m/\n/, $parent->{lang}->{AboutWho};
+
+ $self->{about}->set_transient_for($parent);
+ $self->{about}->set_url_hook( sub {
+ my ($widget, $url) = @_;
+ $self->{parent}->launch($url, 'url');
+ });
+
+ if (-f $logoFile)
+ {
+ my $logo = Gtk2::Gdk::Pixbuf->new_from_file($logoFile);
+ $self->{about}->set_logo($logo);
+ }
+ $self->{about}->set_program_name('GCstar');
+ $self->{about}->set_comments($parent->{lang}->{AboutDesc});
+ $self->{about}->set_version($version);
+ $self->{about}->set_authors('', @authors);
+ $self->{about}->set_documenters(("",'Christian Jodar (Tian)','http://wiki.gcstar.org/'));
+ $self->{about}->set_artists("",$parent->{lang}->{AboutDesign});
+ $self->{about}->set_copyright($parent->{lang}->{AboutLicense});
+ $self->{about}->set_license($license);
+ $self->{about}->set_translator_credits("\n".$parent->{lang}->{AboutTranslation});
+ $self->{about}->set_website("http://www.gcstar.org/");
+ $self->{vBox} = $self->{about}->get_children;
+ $self->{border} = $self->{vBox}->get_border_width;
+ if ($self->{about}->signal_query('style_set'))
+ {
+ $self->{about}->signal_connect('style_set' => sub {$self->changeStyle });
+ }
+ $self->changeStyle;
+ }
+ else
+ {
+ $self = $class->SUPER::new($parent->{lang}->{AboutTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+ bless ($self, $class);
+ my $labelDesc = Gtk2::Label->new($parent->{lang}->{AboutDesc});
+ my $labelVersion = Gtk2::Label->new($parent->{lang}->{AboutVersion}.' '.$version);
+ #my $labelTeam = Gtk2::Label->new($parent->{lang}->{AboutTeam});
+
+ my $who = new Gtk2::Label($parent->{lang}->{AboutWho});
+
+ my $labelTranslation = Gtk2::Label->new($parent->{lang}->{AboutTranslation});
+ my $labelLicense = Gtk2::Label->new($parent->{lang}->{AboutLicense});
+ $labelLicense->set_justify('center');
+ my $button = Gtk2::Button->new_with_mnemonic('_http://www.gcstar.org/');
+ $button->child->set_padding(10,0);
+ $button->signal_connect('clicked', sub {
+ my ($widget, $parent) = @_;
+ (my $url = $widget->get_label) =~ s/^_//;
+ $parent->launch($url, 'url');
+ }, $parent);
+ my $labelDesign = Gtk2::Label->new($parent->{lang}->{AboutDesign});
+
+ $self->vbox->set_homogeneous(0);
+ if (-f $logoFile)
+ {
+ my $image = Gtk2::Image->new_from_file($logoFile);
+ $self->vbox->pack_start($image, 0, 0, 0);
+ }
+ $self->vbox->pack_start($labelDesc, 1, 1, 4);
+ $self->vbox->pack_start($labelVersion, 1, 1, 4);
+ $self->vbox->pack_start($labelLicense, 1, 1, 4);
+ $self->vbox->pack_start(Gtk2::HSeparator->new, 1, 1, 4);
+ my $hbox = new Gtk2::HBox(0,0);
+ $hbox->pack_start($button, 1, 0, 10);
+ $self->vbox->pack_start($hbox, 0, 0, 4);
+ my $hboxDesign = new Gtk2::HBox(0,0);
+ $self->vbox->pack_start($labelDesign, 1, 1, 4);
+ $self->vbox->pack_start($hboxDesign, 0, 0, 4);
+
+ my $teamButton = Gtk2::Button->new($parent->{lang}->{AboutTeam});
+ $teamButton->signal_connect('clicked' => sub {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'ok',
+ $parent->{lang}->{AboutWho});
+ $dialog->run;
+ $dialog->destroy;
+ });
+ $self->action_area->pack_start($teamButton,0,0,0);
+ $self->action_area->reorder_child($teamButton,0);
+
+
+ #$self->vbox->set_size_request(400,-1);
+ $self->set_resizable(0);
+ $self->set_position('center-always');
+ }
+
+ return $self;
+ }
+}
+
+{
+ package GCImageDialog;
+ use base "Gtk2::Dialog";
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->set_position('center-always');
+ $self->{scrollArea}->signal_connect('size-allocate' => sub {
+ return if !$self->{scrollArea};
+ my ($width, $height) = $self->get_size;
+ return if ($width == $self->{width}) && ($height == $self->{height});
+ my $allocation = $self->{scrollArea}->allocation;
+ return if $allocation->height < 10;
+ $self->{image}->parent->set_size_request(-1, -1);
+ $self->set_position('center');
+ my $pixbuf = GCUtils::scaleMaxPixbuf($self->{originalPixbuf}, $allocation->width, $allocation->height);
+ $self->{image}->set_from_pixbuf($pixbuf);
+ ($self->{width}, $self->{height}) = ($width, $height);
+ }) if $self->{scrollArea};
+ my $code = $self->run;
+ $self->hide;
+ $self->{windowParent}->showMe;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $file, $windowParent) = @_;
+ my $class = ref($proto) || $proto;
+ $windowParent ||= $parent;
+ my $self = $class->SUPER::new($parent->{lang}->{ImportViewPicture},
+ $windowParent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{windowParent} = $windowParent;
+
+ if (-f $file)
+ {
+ $self->{image} = Gtk2::Image->new;
+ $self->{originalPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($file);
+ $self->{image}->set_from_pixbuf($self->{originalPixbuf});
+ $self->{image}->set_size_request(0,0);
+ $self->{scrollArea} = new Gtk2::ScrolledWindow;
+ $self->{scrollArea}->set_policy ('automatic', 'automatic');
+ $self->{scrollArea}->set_shadow_type('none');
+ $self->{scrollArea}->add_with_viewport($self->{image});
+ $self->vbox->pack_start($self->{scrollArea},1,1,0);
+ my ($screenWidth, $screenHeight) = ($self->get_screen->get_width, $self->get_screen->get_height);
+ my ($pixWidth, $pixHeight) = ($self->{originalPixbuf}->get_width, $self->{originalPixbuf}->get_height);
+
+ # Minimum amount of spacing we want to leave for panels, window decorations, borders, etc
+ my $heightMargin = 150;
+ my $widthMargin = 30;
+
+ my $ratio = $pixWidth / $pixHeight;
+
+ # Check if picture will fit into screen, or if we'll need to resize
+ if (($pixHeight > ($screenHeight - $heightMargin)) && ($pixWidth <= ($screenWidth - $widthMargin)))
+ {
+ # Image is higher than vertical space we have available, but not wider
+ $pixHeight = $screenHeight - $heightMargin;
+ $pixWidth = $pixHeight * $ratio;
+ }
+ elsif (($pixHeight <= ($screenHeight - $heightMargin)) && ($pixWidth > ($screenWidth - $widthMargin)))
+ {
+ # Image is wider than horizontal space we have available, but not taller
+ $pixWidth = $screenWidth - $widthMargin;
+ $pixHeight = $pixWidth / $ratio;
+ }
+ elsif (($pixHeight > ($screenHeight - $heightMargin)) && ($pixWidth > ($screenWidth - $widthMargin)))
+ {
+ # Image is both too high and too wide for space we have, so see which direction will be
+ # affected the most
+ if ($screenHeight - $heightMargin - $pixHeight < $screenWidth - $widthMargin - $pixWidth)
+ {
+ # Constrained by vertical height
+ $pixHeight = $screenHeight - $heightMargin;
+ $pixWidth = $pixHeight * $ratio;
+ }
+ else
+ {
+ # Constrained by horizontal width
+ $pixWidth = $screenWidth - $widthMargin;
+ $pixHeight = $pixWidth / $ratio;
+ }
+ }
+ $self->{image}->parent->set_size_request($pixWidth, $pixHeight);
+ }
+ else
+ {
+ my $label = new Gtk2::Label;
+ $label->set_markup('<b>'.$parent->{lang}->{PanelImageNoImage}.'</b>');
+ $self->vbox->pack_start($label,1,1,4 * $GCUtils::margin);
+ }
+
+ return $self;
+ }
+}
+
+{
+ package GCNumberEntryDialog;
+ use base "Gtk2::Dialog";
+
+ sub getUserValue
+ {
+ my $self = shift;
+ my $value = -1;
+ my $code = $self->run;
+ $value = $self->{value}->get_value if ($code eq 'ok');
+ $self->hide;
+ return $value;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $self->{value}->set_value($value);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $min, $max, $step) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($title,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $label = Gtk2::Label->new($parent->{lang}->{DialogEnterNumber});
+ $label->set_line_wrap(1);
+ $label->set_padding(5,0);
+ $self->{value} = new GCNumeric(($min + $max) / 2, $min, $max, $step);
+
+ my $hboxRating = new Gtk2::HBox(1,10);
+
+ $self->vbox->set_homogeneous(0);
+ $self->vbox->set_spacing(20);
+ $self->vbox->pack_start($label, 0, 0, 5);
+ $hboxRating->pack_start($self->{value}, 0, 0, 5);
+ $self->vbox->pack_start($hboxRating, 0, 0, 5);
+ $self->vbox->show_all;
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCDependenciesDialog;
+ use base "Gtk2::Dialog";
+
+ use GCUtils 'glob';
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ my $code = $self->run;
+ $self->hide;
+ }
+
+ sub checkDependencies
+ {
+ my $self = shift;
+
+ my $pref = 'GC';
+
+ my @optionals = ();
+ my $optionalsModules = {};
+
+ my @files = glob $ENV{GCS_LIB_DIR}.'/*.pm';
+
+ for my $component('GCPlugins', 'GCExport', 'GCImport', 'GCExtract')
+ {
+ foreach (glob $ENV{GCS_LIB_DIR}."/$component/*")
+ {
+ if (-d $_)
+ {
+ push @files, glob $ENV{GCS_LIB_DIR}."/$component/$_/*.pm";
+ }
+ else
+ {
+ push @files, $_;
+ }
+ }
+ }
+ foreach my $file(@files)
+ {
+ open FILE, $file;
+ while (<FILE>)
+ {
+ if (
+ ((/eval.*?[\"\']use\s*(.*?)[\"\'];/) && ($1 !~ /base|vars|locale|integer|^lib|utf8|\$opt|\$module|strict|^$pref/))
+ ||
+ (/checkModule\([\"\'](.*?)[\"\']\)/)
+ )
+ #"
+ {
+ next if $1 eq 'Time::HiRes';
+ push (@optionals, $1);
+ push @{$optionalsModules->{$1}}, $file;
+ }
+
+ }
+ close FILE;
+ }
+
+ my %saw;
+ @saw{@optionals} = ();
+ @optionals = sort keys %saw;
+
+ $self->{tableDepend}->resize(1 + scalar(@optionals),2);
+
+ my @missings = ();
+ my @oks = ();
+ foreach my $opt(sort @optionals)
+ {
+ my $label1 = new Gtk2::Label($opt);
+ my $label2 = new Gtk2::Label;
+
+ $@ = '';
+ eval "use $opt";
+ if ($@)
+ {
+ my $value;
+ foreach my $module (@{$optionalsModules->{$opt}})
+ {
+ $module =~ s/.*?GC([^\/]*?)\.pm$/$1/;
+ $value .= $module.",\n";
+ }
+ $value =~ s/,\n$//;
+ $label2->set_markup("<span color='orange' weight='bold'>".$self->{parent}->{lang}->{InstallMissingFor}." $value</span>");
+ $label2->set_line_wrap(1);
+ $label2->set_justify('left');
+ push @missings, [$label1, $label2];
+ }
+ else
+ {
+ $label2->set_markup("<span color='green' weight='bold'>".$self->{parent}->{lang}->{InstallOK}."</span>");
+ push @oks, [$label1, $label2];
+ }
+
+ }
+
+ my $i = 0;
+ my $labelOpt = new Gtk2::Label;
+ $labelOpt->set_markup('<b>'.$self->{parent}->{lang}->{InstallOptional}.'</b>');
+ $self->{tableDepend}->attach($labelOpt, 0, 2, $i, $i+1, 'expand', 'fill', 0, $GCUtils::margin);
+ $i++;
+
+ foreach (@missings)
+ {
+ $self->{tableDepend}->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $self->{tableDepend}->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+ }
+ foreach (@oks)
+ {
+ $self->{tableDepend}->attach($_->[0], 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $self->{tableDepend}->attach($_->[1], 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+
+ $i++;
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{InstallDependencies},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok'
+ );
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->{tableDepend} = new Gtk2::Table(1, 2, 0);
+ $self->{tableDepend}->set_row_spacings(10);
+ $self->{tableDepend}->set_col_spacings(20);
+ $self->{tableDepend}->set_border_width(10);
+ $self->{scrollDepend} = new Gtk2::ScrolledWindow;
+ $self->{scrollDepend}->set_policy ('automatic', 'automatic');
+ $self->{scrollDepend}->add_with_viewport($self->{tableDepend});
+ $self->{scrollDepend}->set_size_request(300, 200);
+ $self->vbox->pack_start($self->{scrollDepend},1,1,10);
+
+ $self->checkDependencies;
+
+ return $self;
+ }
+}
+
+{
+ package GCDateSelectionDialog;
+ use base "GCModalDialog";
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub date
+ {
+ my $self = shift;
+ if (@_)
+ {
+ $_ = shift;
+ return if ! $_;
+ my ($day, $month, $year);
+ ($day, $month, $year) = split m|/|;
+ ($day, $month, $year) = (01, 01, $_) if ! m|/|;
+ $self->{calendar}->select_month($month - 1, $year);
+ $self->{calendar}->select_day($day);
+ }
+ else
+ {
+ my ($year, $month, $day) = $self->{calendar}->get_date;
+ $day = ($day < 10 ? '0' : '').$day;
+ $month++;
+ $month = ($month < 10 ? '0' : '').$month;
+ return join '/', $day, $month, $year;
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $title || $parent->{lang}->{PanelDateSelect});
+
+ $self->{calendar} = new Gtk2::Calendar;
+ $self->{calendar}->signal_connect('day-selected-double-click' => sub {
+ $self->response('ok');
+ });
+
+ $self->vbox->pack_start($self->{calendar}, 0, 0, 5);
+ $self->vbox->show_all;
+
+ $self->set_default_size(1,1);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCPropertiesDialog;
+
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCPropertiesDialog::ISA = ('GCModalDialog');
+
+ sub checkValues
+ {
+ my $self = shift;
+
+ return $self->{parent}->{lang}->{OptionsPicturesWorkingDirError}
+ if $self->{properties}->{images}->getValue =~ /.%WORKING_DIR%/;
+ return undef;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response;
+ while(1)
+ {
+ $response = $self->run;
+ last if $response ne 'ok';
+ my $errorMessage = $self->checkValues;
+ last if !$errorMessage;
+ my $dialog = Gtk2::MessageDialog->new_with_markup($self->{parent},
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $errorMessage);
+ $dialog->run;
+ $dialog->destroy;
+ }
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub setProperties
+ {
+ my ($self, $properties, $file, $count) = @_;
+
+ foreach (keys %{$self->{properties}})
+ {
+ $self->{properties}->{$_}->setValue($properties->{$_});
+ }
+ $self->{info}->{file}->setValue($file);
+ $self->{info}->{items}->setValue($count);
+ $self->{info}->{size}->setValue(GCUtils::sizeToHuman((-s $file),
+ $self->{parent}->{lang}->{PropertiesFileSizeSymbols}));
+ }
+
+ sub getProperties
+ {
+ my $self = shift;
+
+ my %properties;
+ foreach (keys %{$self->{properties}})
+ {
+ $properties{$_} = $self->{properties}->{$_}->getValue;
+ }
+ return \%properties;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $title = Gtk2::Stock->lookup('gtk-properties')->{label};
+ $title =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title);
+
+ $self->{parent} = $parent;
+
+ my $table = new Gtk2::Table(14,4,0);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::halfMargin);
+ $table->set_border_width($GCUtils::margin);
+
+ my $line = 0;
+
+ my $fileGroupLabel = new GCHeaderLabel($parent->{lang}->{PropertiesFile});
+ $table->attach($fileGroupLabel, 0, 4, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $line++;
+
+ my $fileLabel = new GCLabel($parent->{lang}->{PropertiesFilePath});
+ $self->{info}->{file} = new GCShortText;
+ $self->{info}->{file}->lock(1);
+ $table->attach($fileLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{info}->{file}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ $self->{info}->{itemsLabel} = new GCLabel($parent->{lang}->{PropertiesItemsNumber});
+ $self->{info}->{items} = new GCShortText;
+ $self->{info}->{items}->lock(1);
+ $table->attach($self->{info}->{itemsLabel}, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{info}->{items}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $sizeLabel = new GCLabel($parent->{lang}->{PropertiesFileSize});
+ $self->{info}->{size} = new GCShortText;
+ $self->{info}->{size}->lock(1);
+ $table->attach($sizeLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{info}->{size}, 3, 4, 3, 4, ['expand', 'fill'], 'fill', 0, 0);
+
+ $line += 3;
+
+ my $collectionGroupLabel = new GCHeaderLabel($parent->{lang}->{PropertiesCollection});
+ $table->attach($collectionGroupLabel, 0, 4, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $line++;
+
+ my $nameLabel = new GCLabel($parent->{lang}->{PropertiesName});
+ $self->{properties}->{name} = new GCShortText;
+ $table->attach($nameLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{name}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $langLabel = new GCLabel($parent->{lang}->{PropertiesLang});
+ $self->{properties}->{lang} = new GCHistoryText;
+ my @langValues;
+ push @langValues, "$_ (".$GCLang::langs{$_}->{LangName}.')'
+ foreach (keys %GCLang::langs);
+ @langValues = sort @langValues;
+ $self->{properties}->{lang}->setValues(\@langValues);
+ $table->attach($langLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{lang}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $ownerLabel = new GCLabel($parent->{lang}->{PropertiesOwner});
+ $self->{properties}->{owner} = new GCShortText;
+ $table->attach($ownerLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{owner}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $emailLabel = new GCLabel($parent->{lang}->{PropertiesEmail});
+ $self->{properties}->{email} = new GCShortText;
+ $table->attach($emailLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{email}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+
+ my $descriptionLabel = new GCLabel($parent->{lang}->{PropertiesDescription});
+ $self->{properties}->{description} = new GCLongText;
+ $table->attach($descriptionLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{description}, 3, 4, $line, $line + 1, ['expand', 'fill'], ['expand', 'fill'], 0, 0);
+ $line++;
+
+ my $picturesDirLabel = new GCLabel($parent->{lang}->{OptionsImages});
+ $self->{properties}->{images} = new GCFile($self, $parent->{lang}->{FileChooserOpenDirectory}, 'select-folder');
+ $table->attach($picturesDirLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{images}, 3, 4, $line, $line + 1, ['expand', 'fill'], ['fill'], 0, 0);
+ $line++;
+
+ my $defaultImageLabel = new GCLabel($parent->{lang}->{PropertiesDefaultPicture});
+ $self->{properties}->{defaultImage} = new GCFile($self, $parent->{lang}->{FileChooserOpenFile}, 'open');
+ $table->attach($defaultImageLabel, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{properties}->{defaultImage}, 3, 4, $line, $line + 1, ['expand', 'fill'], ['fill'], 0, 0);
+
+ $self->vbox->pack_start($table, 1, 1, 5);
+ $self->vbox->show_all;
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCQueryReplaceDialog;
+ use base "GCModalDialog";
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response = $self->run;
+ $self->{field} = $self->{fieldsOption}->getValue;
+ $self->{oldValue} = $self->{old}->getValue;
+ $self->{newValue} = $self->{new}->getValue;
+ $self->{caseSensitive} = $self->{useCase}->getValue;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ $self->{fieldsOption}->setModel($model);
+ }
+
+ sub updateFields
+ {
+ my $self = shift;
+
+ $self->{layoutTable}->remove($self->{old});
+ ($self->{old}, undef) = $self->{fieldsOption}->createEntryWidget($self, 'eq', $self->{old});
+ $self->{old}->signal_connect('activate' => sub {$self->response('ok')} )
+ if $self->{old}->isa('GCShortText');
+ $self->{layoutTable}->attach($self->{old}, 1, 2, 1, 2, 'fill', 'expand', 0, 0);
+ $self->{old}->show_all;
+
+ $self->{layoutTable}->remove($self->{new});
+ ($self->{new}, undef) = $self->{fieldsOption}->createEntryWidget($self, 'eq', $self->{new});
+ $self->{new}->signal_connect('activate' => sub {$self->response('ok')} )
+ if $self->{new}->isa('GCShortText');
+ $self->{layoutTable}->attach($self->{new}, 1, 2, 2, 3, 'fill', 'expand', 0, 0);
+ $self->{new}->show_all;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $title = Gtk2::Stock->lookup('gtk-find-and-replace')->{label};
+ $title =~ s/_//g;
+ my $self = $class->SUPER::new($parent,
+ $title,
+ $parent->{lang}->{QueryReplaceLaunch}
+ );
+
+ $self->{parent} = $parent;
+
+ # These ones are required for createWidget
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ $self->{layoutTable} = new Gtk2::Table(4,2,0);
+ $self->{layoutTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{layoutTable}->set_col_spacings($GCUtils::margin);
+ $self->{layoutTable}->set_border_width($GCUtils::margin);
+
+ my $fieldLabel = new Gtk2::Label($parent->{lang}->{QueryReplaceField});
+ $fieldLabel->set_alignment(0,0.5);
+ $self->{fieldsOption} = new GCFieldSelector(0, undef, 0);
+ $self->{fieldsOption}->signal_connect('changed' => sub {
+ $self->updateFields;
+ });
+ $self->{layoutTable}->attach($fieldLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{layoutTable}->attach($self->{fieldsOption}, 1, 2, 0, 1, 'fill', 'expand', 0, 0);
+
+ my $oldLabel = new Gtk2::Label($parent->{lang}->{QueryReplaceOld});
+ $oldLabel->set_alignment(0,0.5);
+
+ $self->{old} = new GCShortText;
+ $self->{layoutTable}->attach($oldLabel, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{layoutTable}->attach($self->{old}, 1, 2, 1, 2, 'fill', 'expand', 0, 0);
+
+ my $newLabel = new Gtk2::Label($parent->{lang}->{QueryReplaceNew});
+ $newLabel->set_alignment(0,0.5);
+ $self->{new} = new GCShortText;
+ $self->{layoutTable}->attach($newLabel, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{layoutTable}->attach($self->{new}, 1, 2, 2, 3, 'fill', 'expand', 0, 0);
+
+ $self->{useCase} = new GCCheckBox($parent->{lang}->{AdvancedSearchUseCase});
+ $self->{layoutTable}->attach($self->{useCase}, 0, 2, 3, 4, 'fill', 'fill', 0, 0);
+
+ $self->vbox->pack_start($self->{layoutTable}, 1, 1, 5);
+ $self->vbox->show_all;
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ #Class that is used to let user select
+ #item from a list and order them.
+ package GCDoubleListDialog;
+
+ use base 'GCModalDialog';
+ use GCGraphicComponents::GCDoubleLists;
+
+ sub hideExtra
+ {
+ my $self = shift;
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+ $self->{doubleList}->clearList;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{doubleList}->setListData($self->getData);
+
+ $self->SUPER::show();
+ $self->show_all;
+ $self->hideExtra;
+
+ my $response = $self->run;
+
+ if ($response eq 'ok')
+ {
+ $self->saveList($self->{doubleList}->getUsedItems);
+ }
+ $self->hide;
+ return $response;
+ }
+
+ sub getDoubleList
+ {
+ my $self = shift;
+
+ return $self->{doubleList};
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $withPixbuf, $unusedLabel, $usedLabel) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title);
+
+ bless ($self, $class);
+
+ $self->{options} = $parent->{options};
+
+ $self->{doubleList} = new GCDoubleListWidget($withPixbuf, $unusedLabel, $usedLabel);
+
+ $self->{marginBox} = new Gtk2::VBox;
+ $self->vbox->pack_start($self->{marginBox}, 0, 0, $GCUtils::halfMargin);
+ $self->vbox->pack_start($self->{doubleList}, 1, 1, 0);
+
+ # Without some default size, everything will be shrinked as there are some scrollers
+ $self->set_default_size(200,400);
+
+ return $self;
+ }
+}
+
+{
+ #Class that is used to let user select
+ #fields needed in export.
+ package GCFieldsSelectionDialog;
+
+ use base 'GCModalDialog';
+ use GCGraphicComponents::GCDoubleLists;
+
+ sub hideExtra
+ {
+ my $self = shift;
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+ $self->{fieldsDoubleList}->clearList;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{fieldsDoubleList}->setListData($self->{fieldsDoubleList}->getData);
+
+ $self->SUPER::show();
+ $self->show_all;
+ $self->hideExtra;
+
+ my $response = $self->run;
+
+# if ($response eq 'ok')
+# {
+# $self->{parent}->{fields}
+# $self->saveList($self->{fieldsDoubleList}->getUsedItems);
+# }
+ $self->hide;
+ return $response eq 'ok';
+ }
+
+ sub getSelectedIds
+ {
+ my $self = shift;
+ return $self->{fieldsDoubleList}->getSelectedIds;
+ }
+
+ sub getDoubleList
+ {
+ my $self = shift;
+
+ return $self->{fieldsDoubleList};
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ my @array;
+ foreach (@{$list})
+ {
+ push @array, $self->{fieldNameToId}->{$_};
+ }
+ $self->{parent}->{fields} = \@array;
+ }
+
+ sub addIgnoreField
+ {
+ my ($self, $ignoreField) = @_;
+ $self->{fieldsDoubleList}->addIgnoreField($ignoreField);
+ }
+
+ sub removeIgnoreField
+ {
+ my ($self) = @_;
+ $self->{fieldsDoubleList}->removeIgnoreField;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $preList, $isIdList, $ignoreField) = @_;
+
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title);
+
+ bless ($self, $class);
+
+ $self->{options} = $parent->{options};
+
+ $self->{fieldsDoubleList} = new GCFieldsSelectionWidget($parent->{parent}, $preList, $isIdList, $ignoreField);
+
+ $self->{marginBox} = new Gtk2::VBox;
+ $self->vbox->pack_start($self->{marginBox}, 0, 0, $GCUtils::halfMargin);
+ $self->vbox->pack_start($self->{fieldsDoubleList}, 1, 1, 0);
+
+ # Without some default size, everything will be shrinked as there are some scrollers
+ $self->set_default_size(200,400);
+
+ return $self;
+ }
+
+}
+
+
+{
+ package GCFileChooserDialog;
+ use GCGraphicComponents::GCBaseWidgets;
+ use File::Basename;
+ use File::Spec;
+ use Cwd 'realpath';
+
+ sub new
+ {
+ my ($proto, $title, $parent, $action, $withFilter, $autoAppend) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ $self->{action} = $action;
+ $self->{parent} = $parent;
+ $self->{ignoreFilter} = 1;
+ $self->{autoAppend} = 0;
+ my $dialog;
+ eval { $dialog = new Gtk2::FileChooserDialog($title, $parent, $action, @GCDialogs::okCancelButtons) };
+ if ($@)
+ {
+ $self->{dialog} = new Gtk2::FileSelection($title);
+ $self->{dialog}->main_vbox->show_all;
+ my @vboxChildren = $self->{dialog}->main_vbox->get_children;
+ my @buttonBoxChildren = $vboxChildren[0]->get_children;
+ if ($action eq 'select-folder')
+ {
+ $buttonBoxChildren[1]->hide;
+ $buttonBoxChildren[2]->hide;
+ $self->{dialog}->selection_entry->hide;
+ $self->{dialog}->file_list->parent->hide;
+ }
+ elsif ($action eq 'open')
+ {
+ $self->{dialog}->hide_fileop_buttons;
+ $self->{dialog}->selection_entry->set_editable(0);
+ }
+ $self->{type} = 'old';
+ }
+ else
+ {
+ $self->{dialog} = $dialog;
+ if ($action eq 'save')
+ {
+ $self->{requireOverwriteConfirmation} = 0;
+ eval { $dialog->set_do_overwrite_confirmation(1) };
+ $self->{requireOverwriteConfirmation} = 1 if $@;
+ }
+ $self->{type} = 'new';
+ if ($withFilter)
+ {
+ $self->{autoAppend} = $autoAppend;
+ my $filterAll;
+ $@ = '';
+ eval '$filterAll = new Gtk2::FileFilter';
+ if (!$@)
+ {
+ $self->{ignoreFilter} = 0;
+ $filterAll->set_name($self->{parent}->{lang}->{FileAllFiles});
+ $filterAll->add_pattern('*');
+ $self->{dialog}->add_filter($filterAll);
+ $self->{filters} = [];
+ }
+ }
+ $self->{dialog}->set_default_response ('ok');
+ }
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->{dialog}->set_title($title);
+ }
+
+ sub transformFilename
+ {
+ my ($self, $file) = @_;
+
+ #$file = GCUtils::pathToUnix($file);
+ if ($self->{autoAppend})
+ {
+ my $tmpFilter = $self->{dialog}->get_filter;
+ if ($tmpFilter)
+ {
+ my $pattern = $self->{filtersPatterns}->{$tmpFilter->get_name};
+ if ($pattern)
+ {
+ $pattern =~ s/^.*?([^*]*)$/$1/;
+ $file .= $pattern if $file !~ /\./;
+ }
+ }
+ }
+ return $file;
+ }
+
+ sub get_filename
+ {
+ my $self = shift;
+ my $filename = $self->{dialog}->get_filename;
+ $filename .= (($^O =~ /win32/i) ? '\\' : '/') if ($self->{action} eq 'select-folder');
+ #$filename .= '/' if ($self->{action} eq 'select-folder');
+ return $self->transformFilename($filename);
+ }
+
+ sub set_filename
+ {
+ my ($self, $file) = @_;
+
+ $file ||= $ENV{HOME};
+ my $dir = '.';
+ if (! File::Spec->file_name_is_absolute( $file ))
+ {
+ $dir = dirname($self->{parent}->{options}->file)
+ if ($self->{parent}->{options})
+ && ($self->{parent}->{options}->file);
+ }
+ my $empty = 0;
+ $file = $ENV{HOME}.'/' if !$file;
+ $file = $dir.'/'.$file if (! File::Spec->file_name_is_absolute( $file ));
+ $file =~ s/\//\\/g if ($^O =~ /win32/i);
+ $file = Cwd::realpath($file)
+ if -e $file;
+ $empty = 1 if $file eq '';
+ eval {
+ $self->{dialog}->set_filename($file) if (!$empty && !(-d $file));
+ $self->{dialog}->set_current_folder($file.'/')
+ if (($self->{type} eq 'new') &&
+ (($empty) || (-d $file)));
+ };
+ if ($self->{preview})
+ {
+ $self->updatePreview($self) if ($self->{type} eq 'old');
+ $self->{preview}->setValue($file) if ($self->{type} eq 'new');
+ }
+ }
+
+ sub set_pattern_filter
+ {
+ my ($self, @filters) = @_;
+ return if $self->{ignoreFilter};
+ if ($self->{type} eq 'new')
+ {
+ $self->{dialog}->remove_filter($_) foreach(@{$self->{filters}});
+ $self->{filters} = [];
+ $self->{filtersPatterns} = {};
+ foreach my $filterPattern (@filters)
+ {
+ my $filter;
+ eval '$filter = new Gtk2::FileFilter';
+ return if $@;
+ $filter->set_name($filterPattern->[0]);
+ if (ref($filterPattern->[1]))
+ {
+ # Filter pattern is an array. Use a custom filter so file extensions are not case sensitive
+ $filter->add_custom('filename', sub {
+ my ($filename, undef, $extension) = fileparse(shift->{filename},qr{\.[^\.]*});
+ $extension =~ s/[^\.\w]//g;
+ $extension = lc($extension);
+ return (grep {$_ eq $extension} @{$filterPattern->[1]});
+ });
+
+ }
+ else
+ {
+ # Filter pattern is single valid. Use a custom filter so file extensions are not case sensitive
+ $filter->add_custom('filename', sub {
+ my ($filename, undef, $extension) = fileparse(shift->{filename},qr{\..*});
+ $extension =~ s/[^\.\w]//g;
+ $extension = lc($extension);
+ my $filterExt = $filterPattern->[1];
+ $filterExt =~ s/^[^\.]*//;
+ return ($extension eq $filterExt);
+ });
+ }
+ push @{$self->{filters}}, $filter;
+ $self->{dialog}->add_filter($filter);
+ $self->{filtersPatterns}->{$filterPattern->[0]} = $filterPattern->[1];
+ }
+ $self->{dialog}->set_filter($self->{filters}->[0]) if $self->{filters}->[0];
+ }
+ }
+
+ sub run
+ {
+ my $self = shift;
+ return $self->{dialog}->run if ($self->{action} ne 'save')
+ || (($self->{action} eq 'save')
+ && (!$self->{requireOverwriteConfirmation}));
+ my $response;
+ while (1)
+ {
+ $response = $self->{dialog}->run;
+ return $response if ($response ne 'ok');
+ my $filename = $self->get_filename;
+ if (-e $filename)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self->{dialog},
+ [qw/modal destroy-with-parent/],
+ 'question',
+ 'yes-no',
+ $self->{parent}->{lang}->{FileChooserOverwrite});
+
+ $dialog->set_position('center-on-parent');
+ my $overwrite = $dialog->run;
+ $dialog->destroy;
+ return $response if ($overwrite eq 'yes');
+ }
+ else
+ {
+ return $response;
+ }
+ }
+ }
+
+ sub hide
+ {
+ my $self = shift;
+ return $self->{dialog}->hide;
+ }
+
+ sub setWithImagePreview
+ {
+ my ($self, $value) = @_;
+
+ if ($value)
+ {
+ $self->{preview} = new GCItemImage($self->{parent}->{options}, $self->{parent},1);
+ $self->{preview}->setImmediate;
+ if ($self->{type} eq 'new')
+ {
+ $self->{dialog}->signal_connect('update-preview' => \&updatePreview, $self);
+ $self->{dialog}->set_preview_widget($self->{preview});
+ $self->{dialog}->set_preview_widget_active(1);
+ }
+ else
+ {
+ $self->{dialog}->file_list->signal_connect('cursor-changed' => \&updatePreview, $self);
+ $self->{dialog}->file_list->parent->parent->parent->pack_start($self->{preview},0,0,5);
+ }
+ $self->{preview}->show;
+ }
+ else
+ {
+ if ($self->{preview})
+ {
+ $self->{dialog}->file_list->parent->parent->parent->remove($self->{preview}) if ($self->{type} eq 'old');
+ $self->{preview}->destroy;
+ $self->{preview} = undef;
+ }
+ }
+ }
+
+ sub updatePreview
+ {
+ my ($widget, $self, $other) = @_;
+ my $file;
+ if ($self->{type} eq 'new')
+ {
+ eval
+ {
+ $file = $self->{dialog}->get_preview_filename;
+ }
+ }
+ else
+ {
+ $file = $self->get_filename;
+ }
+ $self->{preview}->setValue($file) if $file;
+ }
+
+ sub destroy
+ {
+ my $self = shift;
+ $self->{dialog}->destroy;
+ }
+}
+
+{
+ package GCItemWindow;
+ use base 'GCModalDialog';
+ use GCGraphicComponents::GCBaseWidgets;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ my $code = $self->run;
+ return $code;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, @extraButtons) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, '', '', 1, @extraButtons);
+ bless ($self, $class);
+
+ $self->set_position('none');
+ my $options = new GCOptionLoader;
+ #$options->lockPanel(0);
+ $options->file($parent->{options}->file);
+ $self->{panel} = new GCFormPanel($parent, $options, $parent->{model}->getDefaultPanel);
+ $self->{panel}->createContent($parent->{model});
+
+ #Init combo boxes
+ foreach(@{$parent->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$_}->setValues($parent->{panel}->getValues($_));
+ }
+
+ my $scrollPanelItem = new Gtk2::ScrolledWindow;
+ $scrollPanelItem->set_policy ('automatic', 'automatic');
+ $scrollPanelItem->set_shadow_type('none');
+ $scrollPanelItem->add_with_viewport($self->{panel});
+
+ $self->vbox->add($scrollPanelItem);
+
+ $self->vbox->show_all;
+ $self->{panel}->setShowOption($parent->getDialog('DisplayOptions')->{show}, 1);
+
+ #Adjust some settings
+ $self->{panel}->disableAutoUpdate;
+
+ $self->set_default_size($parent->{options}->itemWindowWidth,$parent->{options}->itemWindowHeight);
+ $self->setTitle($title);
+ return $self;
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->set_title($title.' - GCstar');
+ }
+
+}
+
+{
+ package GCRandomItemWindow;
+ use base 'GCItemWindow';
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title,
+ 'gtk-go-forward' => 'no');
+ bless ($self, $class);
+
+ $self->{panel}->deactivate;
+
+ $parent->{tooltips}->set_tip(($self->action_area->get_children)[1],
+ $parent->{lang}->{RandomOkTip});
+ $parent->{tooltips}->set_tip(($self->action_area->get_children)[0],
+ $parent->{lang}->{RandomNextTip});
+
+ $self->set_default_response('no');
+ return $self;
+ }
+}
+
+{
+ package GCDefaultValuesWindow;
+ use base 'GCItemWindow';
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $title);
+ bless ($self, $class);
+
+ my $label = new GCLabel('<span font-weight="bold">'.$parent->{lang}->{DefaultValuesTip}.'</span>');
+ $self->vbox->pack_start($label, 0, 0, $GCUtils::margin);
+ $self->vbox->reorder_child($label, 0);
+ $label->show_all;
+
+ return $self;
+ }
+}
+
+{
+ package GCCriticalErrorDialog;
+ use base 'Gtk2::MessageDialog';
+
+ sub new
+ {
+ my ($proto, $parent, $message) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $message);
+ bless ($self, $class);
+ $self->set_position('center-on-parent');
+ $self->{parent} = $parent;
+ $self->{message} = $message;
+
+ my $label = $parent->{lang}->{MenuBugReport};
+ $label =~ s/_//g;
+ my $bugReport = new Gtk2::Button($label);
+ $self->action_area->pack_start($bugReport,0,0,0);
+ $self->action_area->reorder_child($bugReport,0);
+ $bugReport->show_all;
+ $bugReport->signal_connect('clicked' => sub {
+ $self->reportBug;
+ });
+
+ return $self;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->run;
+ $self->destroy;
+ }
+
+ sub reportBug
+ {
+ my $self = shift;
+ my $subject = $self->{parent}->{lang}->{BugReportSubject};
+ my $message = '
+'.$self->{parent}->{lang}->{BugReportVersion}.$self->{parent}->{lang}->{Separator}.$self->{parent}->{version}.'
+'.$self->{parent}->{lang}->{BugReportPlatform}.$self->{parent}->{lang}->{Separator}.$^O.'
+
+'.$self->{parent}->{lang}->{BugReportMessage}.$self->{parent}->{lang}->{Separator}.$self->{message}.'
+
+'.$self->{parent}->{lang}->{BugReportInformation}.$self->{parent}->{lang}->{Separator};
+ $self->{parent}->reportBug(undef, $subject, $message);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCDisplay.pm b/lib/gcstar/GCDisplay.pm
new file mode 100644
index 0000000..41c9157
--- /dev/null
+++ b/lib/gcstar/GCDisplay.pm
@@ -0,0 +1,1146 @@
+package GCDisplay;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCUtils;
+
+{
+ package GCFilterSearch;
+
+ # Used to remove diacritics in test
+ use Unicode::Normalize 'NFKD';
+
+ sub compareExact
+ {
+ my ($field, $value) = @_;
+ return $field eq $value;
+ }
+
+ sub compareContain
+ {
+ my ($field, $value) = @_;
+ return $field =~ m/\Q$value\E/;
+ }
+
+ sub compareNotContain
+ {
+ my ($field, $value) = @_;
+ return $field !~ m/\Q$value\E/;
+ }
+
+ sub compareRegexp
+ {
+ my ($field, $value) = @_;
+ return $field =~ m/$value/;
+ }
+
+ sub compareLessStrings
+ {
+ my ($field, $value) = @_;
+ return $field lt $value;
+ }
+
+ sub compareLessNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field < $value;
+ }
+
+ sub compareLessOrEqualStrings
+ {
+ my ($field, $value) = @_;
+ return $field le $value;
+ }
+
+ sub compareLessOrEqualNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field <= $value;
+ }
+
+ sub compareGreaterStrings
+ {
+ my ($field, $value) = @_;
+ return $field gt $value;
+ }
+
+ sub compareGreaterNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field > $value;
+ }
+
+ sub compareGreaterOrEqualStrings
+ {
+ my ($field, $value) = @_;
+ return $field ge $value;
+ }
+
+ sub compareGreaterOrEqualNumbers
+ {
+ my ($field, $value) = @_;
+ return 0 if !defined($field);
+ return $field >= $value;
+ }
+
+ sub compareRangeStrings
+ {
+ my ($field, $value) = @_;
+ return 1 if $value eq ';';
+ my @values = split m/;/, $value;
+ return ($field ge $values[0]) && ($field le $values[1]);
+ }
+
+ sub compareRangeNumbers
+ {
+ my ($field, $value) = @_;
+ return 1 if $value eq ';';
+ return 0 if !defined($field);
+ my @values = split m/;/, $value;
+ return ($field >= $values[0]) && ($field <= $values[1]);
+ }
+
+ sub new
+ {
+ my ($proto, $info) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+
+ bless ($self, $class);
+
+ $self->{info} = $info if $info;
+ $self->clear if !$info;
+ $self->setMode;
+ $self->setCase(0);
+ $self->setIgnoreDiacritics(0);
+ return $self;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+
+ $self->{cleared} = 1;
+
+ $self->{info} = {};
+ $self->{currentSearch} = [];
+ }
+
+ sub getComparisonFunction
+ {
+ my ($self, $type) = @_;
+ my ($comparison, $numeric) = @$type;
+ $numeric = 1 if $numeric eq 'true';
+ $numeric = 0 if $numeric eq 'false';
+
+ if ($comparison eq 'eq')
+ {
+ return \&compareExact;
+ }
+ elsif ($comparison eq 'contain')
+ {
+ return \&compareContain;
+ }
+ elsif ($comparison eq 'notcontain')
+ {
+ return \&compareNotContain;
+ }
+ elsif ($comparison eq 'lt')
+ {
+ return \&compareLessStrings if (!$numeric);
+ return \&compareLessNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'le')
+ {
+ return \&compareLessOrEqualStrings if (!$numeric);
+ return \&compareLessOrEqualNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'gt')
+ {
+ return \&compareGreaterStrings if (!$numeric);
+ return \&compareGreaterNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'ge')
+ {
+ return \&compareGreaterOrEqualStrings if (!$numeric);
+ return \&compareGreaterOrEqualNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'range')
+ {
+ return \&compareRangeStrings if (!$numeric);
+ return \&compareRangeNumbers if ($numeric);
+ }
+ elsif ($comparison eq 'regexp')
+ {
+ return \&compareRegexp;
+ }
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $value, $type, $model, $add) = @_;
+ if (!$filter)
+ {
+ $self->clear;
+ return;
+ }
+ if ($value eq '')
+ {
+ delete $self->{info}->{$filter};
+ }
+ else
+ {
+ $self->{cleared} = 0;
+ my $preprocess = $type->[2];
+ if (!$preprocess)
+ {
+ my $fieldType = $model->{fieldsInfo}->{$filter}->{type};
+ $preprocess = ($fieldType eq 'date') ? 'reverseDate'
+ : ($fieldType eq 'number') ? 'noNullNumber'
+ : ($fieldType eq 'single list') ? 'singleList'
+ : ($fieldType eq 'double list') ? 'doubleList'
+ : ($fieldType eq 'triple list') ? 'otherList'
+ : ($fieldType =~ /list$/o) ? 'singleList'
+ : '';
+ }
+ my $info = {
+ value => $value,
+ comp => $self->getComparisonFunction($type),
+ preprocess => $preprocess,
+ temporary => $add
+ };
+ if ($add)
+ {
+ push @{$self->{info}->{$filter}}, $info;
+ }
+ else
+ {
+ $self->{info}->{$filter} = [$info];
+ }
+ push @{$self->{currentSearch}}, {
+ field => $filter,
+ value => $value,
+ filter => $type
+ };
+ }
+ }
+
+ sub removeTemporaryFilters
+ {
+ my $self = shift;
+ foreach (keys %{$self->{info}})
+ {
+ foreach my $i(0 .. scalar @{$self->{info}->{$_}} - 1)
+ {
+ delete $self->{info}->{$_}->[$i] if $self->{info}->{$_}->[$i]->{temporary};
+ }
+ }
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ }
+
+ sub test
+ {
+ my ($self, $info) = @_;
+ return 1 if $self->{cleared};
+ my $testAnd = $self->{mode} eq 'and';
+
+ foreach my $field(keys %{$self->{info}})
+ {
+ my $value = '';
+ if ($field eq $GCFieldSelector::anyFieldValue)
+ {
+ # We concatenate all of the values here to perform the
+ # the test on all of the fields in one shot
+ foreach my $key(keys %$info)
+ {
+ if (ref($info->{$key}) eq 'ARRAY')
+ {
+ $value .= GCPreProcess::otherList($info->{$key});
+ }
+ else
+ {
+ $value .= $info->{$key};
+ }
+ }
+ }
+ else
+ {
+ $value = $info->{$field};
+ }
+ foreach my $filter(@{$self->{info}->{$field}})
+ {
+ next if !$filter;
+ if ($filter->{preprocess})
+ {
+ my $preProcess = 'GCPreProcess::'.$filter->{preprocess};
+ eval {
+ no strict qw/refs/;
+ $value = $preProcess->($value);
+ };
+ }
+ my $reference;
+
+ if ($self->{ignoreDiacritics})
+ {
+ # Transform diacritics into single characters
+ # e.g. é -> e; ç -> c
+ # First it normalizes the string to have 2 characters
+ # instead of only one. And then it removes the modifiers
+ ($reference = NFKD($filter->{value})) =~ s/\pm//g;
+ ($value = NFKD($value)) =~ s/\pm//g;
+ }
+ else
+ {
+ $reference = $filter->{value};
+ }
+ if (!$self->{case})
+ {
+ $reference = uc $reference;
+ $value = uc $value;
+ }
+
+ if ($testAnd)
+ {
+ return 0 if ! $filter->{comp}->($value, $reference);
+ }
+ else
+ {
+ return 1 if $filter->{comp}->($value, $reference);
+ }
+ }
+ }
+ return $testAnd;
+ }
+
+ sub setMode
+ {
+ my ($self, $mode) = @_;
+ $mode ||= 'and';
+ #*test = \&testAnd if $mode eq 'and';
+ #*test = \&testOr if $mode eq 'or';
+ $self->{mode} = $mode;
+ }
+
+ sub setCase
+ {
+ my ($self, $case) = @_;
+ $self->{case} = $case;
+ }
+
+ sub setIgnoreDiacritics
+ {
+ my ($self, $id) = @_;
+ $self->{ignoreDiacritics} = $id;
+ }
+
+ sub getCurrentSearch
+ {
+ my $self = shift;
+ return {mode => $self->{mode},
+ info => $self->{currentSearch},
+ case => $self->{case},
+ ignoreDiacritics => $self->{ignoreDiacritics}};
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+ return $self->{cleared};
+ }
+}
+
+use Gtk2;
+
+{
+ package GCSearchDialog;
+
+ use GCGraphicComponents::GCBaseWidgets;
+
+ use base 'GCModalDialog';
+
+ sub initValues
+ {
+ my $self = shift;
+
+ my $info = $self->{parent}->{filterSearch}->{info};
+
+ foreach (@{$self->{fields}})
+ {
+ if (exists $info->{$_})
+ {
+ $self->{$_}->setValue($info->{$_}->[0]->{value});
+ }
+ else
+ {
+ $self->{$_}->clear if $self->{$_};
+ }
+ if ($self->{fieldsInfo}->{$_}->{type} eq 'history text')
+ {
+ $self->{$_}->setValues($self->{parent}->{panel}->{$_}->getValues);
+ }
+ if (
+ (
+ ($self->{fieldsInfo}->{$_}->{type} eq 'single list')
+ ||
+ ($self->{fieldsInfo}->{$_}->{type} eq 'double list')
+ )
+ &&
+ (
+ $self->{parent}->{panel}->{$_}->{withHistory}
+ )
+ )
+ {
+ my @values;
+ foreach ($self->{parent}->{panel}->{$_}->getValues)
+ {
+ push @values, $_->[0];
+ }
+ $self->{$_}->setValues(@values);
+ }
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->activateOkButton($self->{notEmpty});
+ $self->activateExtraButton($self->{notEmpty});
+ $self->{search} = undef;
+ my $ended = 0;
+ while (!$ended)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ my %info;
+
+ foreach (@{$self->{fields}})
+ {
+ $info{$_} = $self->{$_}->getValue
+ if ! $self->{$_}->isEmpty;
+ }
+
+ $self->{parent}->{menubar}->initFilters(\%info);
+
+ $self->{search} = \%info;
+ }
+ if (($response eq 'ok') || ($response eq 'cancel') || ($response eq 'delete-event'))
+ {
+ $ended = 1
+ }
+ elsif ($response eq 'reject')
+ {
+ $self->clear;
+ }
+ }
+ $self->hide;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ foreach (@{$self->{fields}})
+ {
+ $self->{$_}->clear;
+ }
+ }
+
+ sub search
+ {
+ my $self = shift;
+
+ return $self->{search};
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $specialOK, @extraButtons) = @_;
+ my $class = ref($proto) || $proto;
+ my $self;
+ if ($specialOK)
+ {
+ $self = $class->SUPER::new($parent,
+ $parent->{lang}->{SearchTitle},
+ $specialOK,
+ );
+ }
+ else
+ {
+ $self = $class->SUPER::new($parent,
+ $parent->{lang}->{SearchTitle},
+ 'gtk-find',
+ 0,
+ @extraButtons,
+ 'gtk-clear' => 'reject',
+ );
+ }
+ bless ($self, $class);
+ $self->set_position('center-on-parent');
+ $self->{parent} = $parent;
+
+ # These ones are required for createWidget
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+ $self->{window} = $self;
+
+ $self->{comparisonConvertor} = new GCComparisonSelector($parent);
+ $self->{layoutTable} = new Gtk2::Table(1,3,0);
+ $self->{layoutTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{layoutTable}->set_col_spacings($GCUtils::margin);
+ $self->{layoutTable}->set_border_width($GCUtils::margin);
+
+ $self->vbox->pack_start($self->{layoutTable}, 1, 1, 0);
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ foreach ($self->{layoutTable}->get_children)
+ {
+ $self->{layoutTable}->remove($_);
+ $_->destroy;
+ }
+
+ my $fieldsInfo = $model->{fieldsInfo};
+ $self->{fieldsInfo} = $fieldsInfo;
+ my @filtersGroup = @{$model->{filtersGroup}};
+ my @filtersTotal = @{$model->{filters}};
+
+ my $row = 0;
+ my $nbLines = @filtersTotal + (2 * @filtersGroup);
+ if ($nbLines <= 0)
+ {
+ $self->{notEmpty} = 0;
+ $self->{layoutTable}->resize(1, 1);
+ my $label = new GCLabel($self->{parent}->{lang}->{SearchNoField});
+ $self->{layoutTable}->attach($label, 0, 1, 0, 1, 'expand', 'expand', $GCUtils::margin, $GCUtils::margin);
+ return;
+ }
+ $self->{notEmpty} = 1;
+ $self->{layoutTable}->resize($nbLines, 3);
+
+ $self->{fields} = [];
+ foreach my $group(@filtersGroup)
+ {
+ $row++;
+ my @filters = @{$group->{filter}};
+ my $label = new GCHeaderLabel($model->getDisplayedText($group->{label}));
+ $self->{layoutTable}->attach($label, 0, 3, $row, $row + 1, 'fill', 'expand', 0, 0);
+ $row++;
+ my $withComparisonLabel;
+ foreach my $filter(@filters)
+ {
+ my $field = $filter->{field};
+ if ($field ne 'separator')
+ {
+ push @{$self->{fields}}, $field;
+ my $labelText = $fieldsInfo->{$field}->{displayed};
+ $labelText = $model->getDisplayedText($filter->{label}) if $filter->{label};
+ my $label = new GCLabel($labelText);
+ $self->{layoutTable}->attach($label, 0, 1, $row, $row + 1, 'fill', 'fill', 2 * $GCUtils::margin, 0);
+
+ ($self->{$field}, $withComparisonLabel) =
+ GCBaseWidgets::createWidget($self, $fieldsInfo->{$field},
+ $filter->{comparison});
+ $self->{$field}->signal_connect('activate' => sub {$self->response('ok')} )
+ if $self->{$field}->isa('GCShortText');
+ if ($withComparisonLabel
+ && ($filter->{comparison} ne 'eq'))
+ {
+ my $labelComparison = new GCLabel(
+ $self->{comparisonConvertor}->valueToDisplayed($filter->{comparison}),
+ 1
+ );
+ $self->{layoutTable}->attach($labelComparison, 1, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ }
+ $self->{layoutTable}->attach($self->{$field}, 2, 3, $row, $row + 1, ['fill', 'expand'], 'expand', 0, 0);
+ $self->{$field}->grab_focus if $row == 2;
+ }
+ else
+ {
+ $self->{layoutTable}->attach(Gtk2::HSeparator->new, 0, 3, $row, $row + 1, 'fill', 'fill', 0, 0);
+ }
+ $row++;
+ }
+ }
+ $self->{layoutTable}->show_all;
+ }
+}
+
+{
+ package GCAdvancedSearchDialog;
+
+ use GCGraphicComponents::GCBaseWidgets;
+
+ use base 'GCSearchDialog';
+
+ sub addItem
+ {
+ my $self = shift;
+ $self->{layoutTable}->resize($self->{nbFields} + 1, 3);
+ my $field = new GCFieldSelector(0, $self->{model}, 0, 1);
+ $field->{number} = $self->{nbFields};
+ push @{$self->{fields}}, $field;
+ $self->{layoutTable}->attach($field, 0, 1, $self->{nbFields}, $self->{nbFields}+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $field->show_all;
+
+ my $comp = new GCComparisonSelector($self->{parent});
+ $field->signal_connect('changed' => sub {
+ my ($fs, $cs) = @_;
+ $self->updateField($fs, $cs->getValue);
+ }, $comp);
+ $comp->signal_connect('changed' => sub {
+ my ($cs, $fs) = @_;
+ $self->updateField($fs, $cs->getValue);
+ }, $field);
+ push @{$self->{comps}}, $comp;
+ $self->{layoutTable}->attach($comp, 1, 2, $self->{nbFields}, $self->{nbFields}+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $comp->show_all;
+
+ my $value = new GCShortText;
+ push @{$self->{values}}, $value;
+ $self->{layoutTable}->attach($value, 2, 3, $self->{nbFields}, $self->{nbFields}+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $value->show_all;
+ $self->{remove}->set_sensitive(1);
+ $self->{nbFields}++;
+ }
+
+ sub removeItem
+ {
+ my $self = shift;
+ $self->{layoutTable}->remove(pop @{$self->{fields}});
+ $self->{layoutTable}->remove(pop @{$self->{comps}});
+ $self->{layoutTable}->remove(pop @{$self->{values}});
+ delete $self->{isNumeric}->[$self->{nbFields}];
+ $self->{layoutTable}->resize(--$self->{nbFields}, 3);
+ $self->{remove}->set_sensitive(0) if $self->{nbFields} < 2;
+ }
+
+ sub generateSearch
+ {
+ my $self = shift;
+ my @info;
+ my $i = 0;
+ foreach (@{$self->{fields}})
+ {
+ my $field = $_->getValue;
+ next if !$field;
+ my $numeric = 'false';
+ if ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'number')
+ {
+ $numeric = 'true';
+ }
+ # We check we still have the same field in case it was changed
+ elsif ($self->{isNumeric}->[$i]->[0] eq $field)
+ {
+ $numeric = $self->{isNumeric}->[$i]->[1];
+ }
+ push @info, {
+ field => $field,
+ value => $self->{values}->[$i]->getValue,
+ filter => [$self->{comps}->[$i]->getValue,
+ $numeric,
+ undef]
+ }
+ if ! $self->{values}->[$i]->isEmpty;
+ $i++;
+ }
+ $self->{search} = \@info;
+ }
+
+ sub initSearch
+ {
+ my ($self, $filter) = @_;
+ if ($filter->{mode} eq 'and')
+ {
+ $self->{testAnd}->set_active(1);
+ }
+ elsif ($filter->{mode} eq 'or')
+ {
+ $self->{testOr}->set_active(1);
+ }
+ $self->{useCase}->set_active($filter->{case});
+ $self->{ignoreDiacritics}->set_active($filter->{ignoreDiacritics});
+ $self->removeItem while $self->{nbFields} > 1;
+ $self->{isNumeric} = [];
+ my $first = 1;
+ foreach my $line(@{$filter->{info}})
+ {
+ $self->addItem if !$first;
+ $first = 0;
+ $self->{fields}->[-1]->setValue($line->{field});
+ $self->{comps}->[-1]->setValue($line->{filter}->[0]);
+ $self->{values}->[-1]->setValue($line->{value});
+ # We also add the field name to be able to check it later
+ push @{$self->{isNumeric}}, [$line->{field}, $line->{filter}->[1]];
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->show_all;
+ # If saving the search is not possible, hides the corresponding button
+ if (!$self->{canSave})
+ {
+ ($self->action_area->get_children)[3]->hide;
+ }
+ $self->{search} = undef;
+ my $ended = 0;
+ while (!$ended)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ if ($self->{userFilter})
+ {
+ $self->saveSearch;
+ }
+ else
+ {
+ $self->generateSearch;
+ }
+ }
+ else
+ {
+ $self->{search} = undef;
+ }
+ $ended = 1 if ($response eq 'ok') || ($response eq 'cancel') || ($response eq 'delete-event');
+ $self->clear if ($response eq 'reject');
+ $self->saveSearch if ($response eq 'accept');
+ }
+ $self->hide;
+ }
+
+ sub getMode
+ {
+ my $self = shift;
+ return ($self->{testAnd}->get_active ? 'and' : 'or');
+ }
+
+ sub getCase
+ {
+ my $self = shift;
+ return ($self->{useCase}->get_active ? 1 : 0);
+ }
+
+ sub getIgnoreDiacritics
+ {
+ my $self = shift;
+ return ($self->{ignoreDiacritics}->get_active ? 1 : 0);
+ }
+
+ sub saveSearch
+ {
+ my $self = shift;
+
+ my $response;
+ my $name;
+ if ($self->{userFilter} eq 'edit')
+ {
+ $response = 'ok';
+ $name = '';
+ }
+ else
+ {
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{AdvancedSearchSaveTitle},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $hbox = Gtk2::HBox->new(0, $GCUtils::halfMargin);
+ my $label = Gtk2::Label->new($self->{parent}->{lang}->{AdvancedSearchSaveName});
+ $hbox->pack_start($label, 0, 0, 0);
+ my $entry = Gtk2::Entry->new;
+ $hbox->pack_start($entry, 1, 1, 0);
+ $hbox->show_all;
+ $dialog->vbox->pack_start($hbox, 1, 1, $GCUtils::margin);
+ $dialog->set_default_response('ok');
+ $entry->set_activates_default(1);
+ while (1)
+ {
+ $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ $name = $entry->get_text;
+ if ($self->{model}->existsUserFilter($name))
+ {
+ my $errorDialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{AdvancedSearchSaveOverwrite});
+ $dialog->set_position('center-on-parent');
+ $errorDialog->run;
+ $errorDialog->destroy;
+ next;
+ }
+ last;
+ }
+ last;
+ }
+ $dialog->destroy;
+ }
+
+ if ($response eq 'ok')
+ {
+ $self->generateSearch;
+ my $info = {
+ 'name' => $name,
+ 'mode' => $self->getMode,
+ 'case' => $self->getCase,
+ 'ignoreDiacritics' => $self->getIgnoreDiacritics,
+ 'info' => $self->{search}
+ };
+ $self->{parent}->addUserFilter($info);
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $userFilter) = @_;
+ my $class = ref($proto) || $proto;
+ my $self;
+ if ($userFilter)
+ {
+ $self = $class->SUPER::new($parent, 'gtk-save');
+ }
+ else
+ {
+ $self = $class->SUPER::new($parent, undef, 'gtk-save' => 'accept',);
+ }
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{userFilter} = $userFilter;
+ $self->vbox->remove($self->{layoutTable});
+
+ my $allTable = new Gtk2::Table(11,3,0);
+ $allTable->set_row_spacings($GCUtils::halfMargin);
+ $allTable->set_col_spacings($GCUtils::margin);
+ $allTable->set_border_width($GCUtils::margin);
+
+ my $labelType = new GCHeaderLabel($parent->{lang}->{AdvancedSearchType});
+ $self->{testAnd} = new Gtk2::RadioButton(undef, $parent->{lang}->{AdvancedSearchTypeAnd});
+ $self->{testOr} = new Gtk2::RadioButton($self->{testAnd}->get_group, $parent->{lang}->{AdvancedSearchTypeOr});
+
+ my $prefStock = Gtk2::Stock->lookup('gtk-preferences');
+ (my $prefLabel = $prefStock->{label}) =~ s/_//;
+ my $labelPreferences = new GCHeaderLabel($prefLabel);
+ $self->{useCase} = new GCCheckBox($parent->{lang}->{AdvancedSearchUseCase});
+ $self->{ignoreDiacritics} = new GCCheckBox($parent->{lang}->{AdvancedSearchIgnoreDiacritics});
+
+ my $offset1 = 0;
+ $offset1 = 4;
+ $allTable->attach($labelType, 0, 3, $offset1 + 0, $offset1 + 1, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{testAnd}, 2, 3, $offset1 + 1, $offset1 + 2, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{testOr}, 2, 3, $offset1 + 2, $offset1 + 3, 'fill', 'fill', 0, 0);
+ $allTable->attach($labelPreferences, 0, 3, $offset1 + 4, $offset1 + 5, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{useCase}, 2, 3, $offset1 + 5, $offset1 + 6, 'fill', 'fill', 0, 0);
+ $allTable->attach($self->{ignoreDiacritics}, 2, 3, $offset1 + 6, $offset1 + 7, 'fill', 'fill', 0, 0);
+
+ my $labelCriteria = new GCHeaderLabel($parent->{lang}->{AdvancedSearchCriteria});
+ my $scrolled = new Gtk2::ScrolledWindow;
+ $scrolled->set_policy ('never', 'automatic');
+ $scrolled->set_border_width(0);
+ $scrolled->set_shadow_type('none');
+ $scrolled->add_with_viewport($self->{layoutTable});
+
+ my $offset2 = 8;
+ $offset2 = 0;
+ $allTable->attach($labelCriteria, 0, 3, $offset2 + 0, $offset2 + 1, 'fill', 'fill', 0, 0);
+ $allTable->attach($scrolled, 2, 3, $offset2 + 1, $offset2 + 2, ['expand', 'fill'], ['expand', 'fill'], 0, 0);
+
+ my $hboxAction = new Gtk2::HBox(0,0);
+ $self->{add} = Gtk2::Button->new_from_stock('gtk-add');
+ $self->{add}->signal_connect('clicked' => sub {
+ $self->addItem;
+ });
+ $hboxAction->pack_start($self->{add}, 0, 0, 0);
+ $self->{remove} = Gtk2::Button->new_from_stock('gtk-remove');
+ $self->{remove}->signal_connect('clicked' => sub {
+ $self->removeItem;
+ });
+ $hboxAction->pack_start($self->{remove}, 0, 0, $GCUtils::margin);
+# if (!$userFilter)
+# {
+# $self->{save} = Gtk2::Button->new_from_stock('gtk-save');
+# $self->{save}->signal_connect('clicked' => sub {
+# $self->saveSearch;
+# });
+# $hboxAction->pack_end($self->{save}, 0, 0, 0);
+# }
+ $allTable->attach($hboxAction, 2, 3, $offset2 + 2, $offset2 + 3, 'fill', 'fill', 0, 0);
+
+ $self->vbox->pack_start($allTable,1,1,0);
+
+ $self->set_size_request(-1, 400);
+ return $self;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setModel($self->{model});
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ # Searches can only be saved for default collections or user collections with a name
+ # (i.e. when the model is not embedded within the collection).
+ $self->{canSave} = ($model->getName) ? 1 : 0;
+ $self->{nbFields} = 0;
+ $self->{fields} = [];
+ $self->{comps} = [];
+ $self->{values} = [];
+ foreach ($self->{layoutTable}->get_children)
+ {
+ $self->{layoutTable}->remove($_);
+ $_->destroy;
+ }
+ $self->addItem;
+ $self->{remove}->set_sensitive(0);
+ $self->{layoutTable}->show_all;
+ }
+
+ sub updateField
+ {
+ my ($self, $fs, $comparison) = @_;
+ my $idx = $fs->{number};
+ my $widget = $self->{values}->[$idx];
+ $self->{layoutTable}->remove($widget);
+
+ my $newWidget;
+ ($newWidget, undef) = $fs->createEntryWidget($self, $comparison, $widget);
+ $newWidget->signal_connect('activate' => sub {$self->response('ok')} )
+ if $newWidget->isa('GCShortText');
+
+ $self->{values}->[$idx] = $newWidget;
+ $self->{layoutTable}->attach($newWidget, 2, 3, $idx, $idx+1,
+ ['expand', 'fill'], 'fill', 0, 0);
+ $newWidget->show_all;
+ }
+}
+
+{
+ package GCUserFiltersDialog;
+
+ use GCGraphicComponents::GCBaseWidgets;
+ use Storable;
+ use base 'GCModalDialog';
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ $self->{filters} = Storable::dclone($model->getUserFilters);
+ $self->initList(1);
+ $self->{deletedFilters} = [];
+ }
+
+ sub initList
+ {
+ my ($self, $saved) = shift;
+ @{$self->{filtersList}->{data}} = ();
+ $self->{initializing} = 1;
+ $self->{filters} = $self->getUserFilters;
+ #my @sorted = sort {uc($a->{name}) cmp uc($b->{name})} @{$self->{filters}};
+ #$self->{filters} = \@sorted;
+ foreach(@{$self->{filters}})
+ {
+ push @{$self->{filtersList}->{data}}, $_->{name};
+ # All of them should be already saved
+ $_->{saved} = 1 if $saved;
+ }
+ $self->{initializing} = 0;
+ }
+
+ sub getUserFilters
+ {
+ my $self = shift;
+ my @sorted = sort {uc($a->{name}) cmp uc($b->{name})} @{$self->{filters}};
+ return \@sorted;
+ return $self->{filters};
+ }
+
+ sub getDeletedFilters
+ {
+ my $self = shift;
+ return $self->{deletedFilters};
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ # Callbacked by advanced search dialog
+ sub addUserFilter
+ {
+ my ($self, $filter) = @_;
+ $filter->{saved} = 0;
+ if ($self->{mode} eq 'new')
+ {
+ push (@{$self->{filters}}, $filter);
+ push @{$self->{filtersList}->{data}}, $filter->{name};
+ }
+ else
+ {
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ $filter->{name} = $self->{filters}->[$selected]->{name};
+ $self->{filters}->[$selected] = $filter;
+ }
+ }
+
+ sub newFilter
+ {
+ my $self = shift;
+ $self->{mode} = 'new';
+ $self->{panel} = $self->{parent}->{panel};
+ my $dialog = new GCAdvancedSearchDialog($self, $self->{mode});
+ $dialog->setModel($self->{model});
+ $dialog->show;
+ # To avoid unwanted reference if the panel is changed
+ delete $self->{panel};
+ }
+
+ sub editFilter
+ {
+ my $self = shift;
+ $self->{mode} = 'edit';
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ $self->{panel} = $self->{parent}->{panel};
+ my $dialog = new GCAdvancedSearchDialog($self, $self->{mode});
+ $dialog->setModel($self->{model});
+ $dialog->initSearch($self->{filters}->[$selected]);
+ $dialog->show;
+ # To avoid unwanted reference if the panel is changed
+ delete $self->{panel};
+ }
+
+ sub deleteFilter
+ {
+ my $self = shift;
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ push @{$self->{deletedFilters}}, $self->{filters}->[$selected]->{name};
+ splice @{$self->{filters}}, $selected, 1;
+ splice (@{$self->{filtersList}->{data}}, $selected, 1);
+ $self->{filtersList}->select(0);
+ }
+
+ sub renameFilter
+ {
+ my $self = shift;
+ my $selected = ($self->{filtersList}->get_selected_indices)[0];
+ my $oldName = $self->{filters}->[$selected]->{name};
+ my $newName = $self->{filtersList}->{data}->[$selected]->[0];
+ return if $newName eq $oldName;
+ $self->{filters}->[$selected]->{name} = $newName;
+ $self->{filters}->[$selected]->{saved} = 0;
+ push @{$self->{deletedFilters}}, $oldName;
+ $self->initList(0);
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{MenuSavedSearchesEdit});
+ bless ($self, $class);
+ $self->set_position('center-on-parent');
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ my $hBox = new Gtk2::HBox(0,0);
+ $hBox->set_border_width($GCUtils::margin);
+ my $buttonBox = new Gtk2::VBox(0,0);
+
+ my $editButton = new Gtk2::Button->new_from_stock('gtk-edit');
+ $editButton->signal_connect('clicked' => sub {
+ $self->editFilter;
+ });
+ my $newButton = new Gtk2::Button->new_from_stock('gtk-new');
+ $newButton->signal_connect('clicked' => sub {
+ $self->newFilter;
+ });
+ my $deleteButton = new Gtk2::Button->new_from_stock('gtk-delete');
+ $deleteButton->signal_connect('clicked' => sub {
+ $self->deleteFilter;
+ });
+
+ $buttonBox->pack_start($newButton, 0, 0, $GCUtils::halfMargin);
+ $buttonBox->pack_start($deleteButton, 0, 0, $GCUtils::halfMargin);
+ $buttonBox->pack_start($editButton, 0, 0, $GCUtils::halfMargin);
+
+ $self->{filtersList} = new Gtk2::SimpleList($parent->{lang}->{MenuSavedSearches} => 'text');
+ $self->{filtersList}->set_column_editable(0, 1);
+ $self->{filtersList}->get_model->signal_connect("row-changed" => sub {
+ return if $self->{initializing};
+ $self->renameFilter;
+ });
+
+ my $scroller = new Gtk2::ScrolledWindow;
+ $scroller->set_policy ('automatic', 'automatic');
+ $scroller->set_shadow_type('etched-in');
+ $scroller->add($self->{filtersList});
+
+ $hBox->pack_start($scroller, 1, 1, $GCUtils::margin);
+ $hBox->pack_start($buttonBox, 0, 0, $GCUtils::margin);
+
+ $self->vbox->pack_start($hBox, 1, 1, 0);
+ $self->set_default_size(400, 400);
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport.pm b/lib/gcstar/GCExport.pm
new file mode 100644
index 0000000..b32c58e
--- /dev/null
+++ b/lib/gcstar/GCExport.pm
@@ -0,0 +1,118 @@
+package GCExport;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use File::Basename;
+use GCUtils 'glob';
+
+use base 'Exporter';
+our @EXPORT = qw(@exportersArray);
+
+our @exportersArray;
+
+sub loadExporters
+{
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCExport/*.pm')
+ {
+ my $export = basename($_, '.pm')."\n";
+ next if $export =~ /GCExportBase/;
+ eval "use GCExport::$export";
+ (my $exporter = $export) =~ s/^GCExport/GCExporter/;
+ my $obj;
+ eval "\$obj = new GCExport::$exporter";
+ die "Fatal error with exporter $export\n$@" if $@;
+ push @exportersArray, $obj if ! $obj->{errors};
+ }
+}
+
+use Gtk2;
+use GCExportImport;
+
+{
+ package GCExportDialog;
+
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCExportDialog::ISA = ('GCExportImportDialog');
+
+ sub addOptions
+ {
+ my ($self, $options) = @_;
+ my $filter = ($self->{filter}->get_active) ? 1 : 0;
+ $options->{items} = $self->{parent}->{items}->getItemsListFiltered($filter);
+ $options->{collection} = $self->{parent}->{options}->file;
+ $options->{defaultImage} = $self->{parent}->{defaultImage};
+ $options->{sorter} = $self->{sorter}->getValue;
+ $options->{order} = $self->{order}->getValue;
+ }
+
+ sub setModel
+ {
+ my $self = shift;
+ $self->{fieldsDialog} = new GCFieldsSelectionDialog($self, $self->{parent}->{lang}->{ExportFieldsTitle});
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $parent->{lang}->{ExportTitle}, 'export');
+ bless ($self, $class);
+
+ $self->{fieldsButtonLabel} = $parent->{lang}->{ExportFieldsTitle};
+ $self->{fieldsTip} = $parent->{lang}->{ExportFieldsTip};
+ $self->{filter} = new Gtk2::CheckButton($parent->{lang}->{ExportFilter});
+ $self->{sortLabel} = GCLabel->new($parent->{lang}->{ExportSortBy});
+ $self->{sorter} = new GCFieldSelector(0, undef, 0);
+ $self->{orderLabel} = GCLabel->new($parent->{lang}->{ExportOrder});
+ my $ascStock = Gtk2::Stock->lookup('gtk-sort-ascending');
+ (my $ascStockLabel = $ascStock->{label}) =~ s/_//;
+ my $descStock = Gtk2::Stock->lookup('gtk-sort-descending');
+ (my $descStockLabel = $descStock->{label}) =~ s/_//;
+ $self->{order} = new GCMenuList([
+ {value => 'asc', displayed => $ascStockLabel},
+ {value => 'desc', displayed => $descStockLabel},
+ ]);
+ $self->{dataTable}->resize(4, 2);
+ $self->{dataTable}->attach($self->{filter}, 0, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{sortLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{sorter}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{orderLabel}, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{order}, 1, 2, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{labelFile}, 0, 1, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{file}, 1, 2, 3, 4, ['fill', 'expand'], 'fill', 0, 0);
+
+# $self->vbox->pack_start(new Gtk2::HSeparator, 0, 0, 5);
+# $self->vbox->pack_start($self->{filter},0,0,0);
+
+ return $self;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportBase.pm b/lib/gcstar/GCExport/GCExportBase.pm
new file mode 100644
index 0000000..fb23ec2
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportBase.pm
@@ -0,0 +1,362 @@
+package GCExport::GCExportBase;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExportImport;
+
+{
+ package GCExport::GCExportBaseClass;
+
+ use base 'GCExportImportBase';
+
+ use File::Basename;
+ use File::Copy;
+ use GCUtils 'glob';
+
+ #Methods to be overriden in specific classes
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSuffix
+ {
+ return '';
+ }
+
+ sub getModels
+ {
+ return [];
+ }
+
+ sub needsUTF8
+ {
+ return 0;
+ }
+
+ sub getOptions
+ {
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 0;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub getHeader
+ {
+ }
+
+ sub getItem
+ {
+ }
+
+ sub getFooter
+ {
+ }
+
+ sub postProcess
+ {
+ }
+
+ sub preProcess
+ {
+ }
+
+ sub getEndInfo
+ {
+ }
+
+ sub wantsOsSeparator
+ {
+ return 1;
+ }
+
+ sub wantsSort
+ {
+ return 0;
+ }
+
+ sub getNewPictureHeight
+ {
+ return 0;
+ }
+
+ #End of methods to be overriden
+
+ sub getUniqueImageFileName
+ {
+ my ($self, $suffix, $dir, $title) = @_;
+
+ return $self->{options}->{parent}->getUniqueImageFileName($suffix, $title, $dir);
+ }
+
+ sub duplicatePicture
+ {
+ my ($self, $orig, $field, $dir, $title, $newHeight) = @_;
+ $self->{saved}->{$field} = $orig;
+ my $newPic = $orig;
+ if ($orig && $self->{options}->{withPictures})
+ {
+ $newPic = GCUtils::getDisplayedImage($orig,
+ $self->{options}->{defaultImage},
+ $self->{original});
+ if ($newPic eq $self->{options}->{defaultImage})
+ {
+ $newPic = $self->{defaultImage};
+ }
+ else
+ {
+ $newPic =~ /.*?(\.[^.]*)$/;
+ my $suffix = $1;
+ my $dest = $self->getUniqueImageFileName($suffix,
+ $dir,
+ $title);
+ my $picHeight = $self->getNewPictureHeight;
+ if ($picHeight)
+ {
+ my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($newPic);
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ my $picWidth = $width * ($picHeight / $height);
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf, $picWidth, $picHeight, 1);
+ my $format;
+ if ($suffix =~ /png/i)
+ {
+ $format = 'png';
+ }
+ else
+ {
+ $dest =~ s/\.[^.]*$/\.jpg/;
+ $format = 'jpeg';
+ }
+ $pixbuf->save($dest, $format);
+ }
+ else
+ {
+ copy($newPic, $dest);
+ }
+ $newPic = basename($dir).'/'.basename($dest);
+ }
+ }
+ else
+ {
+ $newPic = basename($dir).'/'.basename($self->{options}->{defaultImage});
+ }
+ $newPic =~ s/\//\\/g if ($^O =~ /win32/i) && $self->wantsOsSeparator;
+ return $newPic;
+ }
+
+ sub restorePicture
+ {
+ my $self = shift;
+ return $self->{saved}->{image};
+ }
+
+ sub restoreInfo
+ {
+ my ($self, $info) = @_;
+
+ foreach (keys %{$self->{saved}})
+ {
+ $info->{$_} = $self->{saved}->{$_};
+ }
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+ if ($self->{options}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ if ($self->{copyPictures})
+ {
+ $value = $self->duplicatePicture($value, $field,
+ $self->{dirName},
+ $self->{currentItem}->{
+ $self->{model}->{commonFields}->{title}
+ });
+ }
+ return $value;
+ }
+ return $self->{options}->{originalList}->transformValue($value, $field);
+ }
+
+ sub getStockLabel
+ {
+ my ($self, $stock) = @_;
+ my $item = Gtk2::Stock->lookup($stock);
+ my $label = '';
+ ($label = $item->{label}) =~ s/_//
+ if $item;
+ return $label;
+ }
+
+ # If you need really specific processing, you can instead override the process method
+ sub process
+ {
+ my ($self, $options) = @_;
+
+ $self->{saved} = {};
+ $self->{currentItem} = undef;
+
+ $self->{options} = $options;
+
+ $options->{file} .= $self->getSuffix
+ if ($self->getSuffix)
+ && ($options->{file} !~ /\.\w*$/);
+ $self->{fileName} = $options->{file};
+ $self->{original} = $options->{collection};
+ $self->{origDir} = dirname($self->{original});
+ $options->{collectionDir} = $self->{origDir};
+
+ ($self->{dirName} = $self->{fileName}) =~ s/\.[^.]*?$//;
+ $self->{dirName} .= '_images';
+ if ( -e $self->{dirName})
+ {
+ my @images = glob $self->{dirName}.'/*';
+ unlink foreach (@images);
+ rmdir $self->{dirName};
+ unlink $self->{dirName} if ( -e $self->{dirName});
+ }
+ if ($self->{options}->{withPictures})
+ {
+ mkdir $self->{dirName};
+ #Get a copy of default picture
+ copy($self->{options}->{defaultImage},$self->{dirName});
+ $self->{defaultImage} = basename($self->{dirName}).'/'
+ .basename($self->{options}->{defaultImage});
+ }
+
+ if (! $self->preProcess)
+ {
+ return $self->getEndInfo;
+ }
+
+ my @tmpArray = @{$options->{items}};
+ if ($self->wantsSort)
+ {
+ my $sorter = $self->{options}->{sorter};
+ use locale;
+ if ($self->{model}->{fieldsInfo}->{$sorter}->{type} eq 'number')
+ {
+ @tmpArray = sort {
+ my $val1 = $a->{$sorter};
+ my $val2 = $b->{$sorter};
+ return $val1 <=> $val2;
+ } @tmpArray;
+ }
+ elsif ($self->{model}->{fieldsInfo}->{$sorter}->{type} eq 'date')
+ {
+ @tmpArray = sort {
+ my $val1 = GCPreProcess::reverseDate($a->{$sorter});
+ my $val2 = GCPreProcess::reverseDate($b->{$sorter});
+ return $val1 <=> $val2;
+ } @tmpArray;
+ }
+ else
+ {
+ @tmpArray = sort {
+ my $val1 = uc $self->{options}->{originalList}->transformValue($a->{$sorter}, $sorter);
+ my $val2 = uc $self->{options}->{originalList}->transformValue($b->{$sorter}, $sorter);
+ return $val1 cmp $val2;
+ } @tmpArray;
+ }
+ @tmpArray = reverse @tmpArray if $self->{options}->{order} eq 'desc';
+ }
+
+ $self->{sortedArray} = \@tmpArray;
+
+ my $header = $self->getHeader($#tmpArray + 1);
+ my $body = '';
+
+ my $item;
+ my $idx = 0;
+ my $copyPictures = 0;
+ my @copiedPicturesFields;
+ if ($self->{options}->{withPictures})
+ {
+ # If we don't specify fields, the pictures will be copied with transform value
+ # This one is used now
+ $copyPictures = 1
+ if $self->wantsFieldsSelection;
+ # This one will be used by transform value
+ $self->{copyPictures} = !$copyPictures;
+ foreach my $field(@{$self->{options}->{fields}})
+ {
+ push @copiedPicturesFields, $field
+ if $self->{options}->{fieldsInfo}->{$field}->{type} eq 'image';
+ }
+ }
+ foreach $item(@tmpArray)
+ {
+ $self->{currentItem} = $item;
+ if ($copyPictures)
+ {
+ foreach my $pic(@copiedPicturesFields)
+ {
+ $item->{$pic} = $self->duplicatePicture($item->{$pic}, $pic, $self->{dirName},
+ $item->{$self->{model}->{commonFields}->{title}});
+ }
+ }
+ $body .= $self->getItem($item, $idx);
+ $self->restoreInfo($item);
+ $idx++;
+ }
+ $self->{currentItem} = undef;
+ my $footer = $self->getFooter($#tmpArray + 1);
+
+ $self->postProcess(\$header, \$body);
+
+ open EXPORTFILE, ">".$options->{file};
+ binmode( EXPORTFILE, ':utf8') if $self->needsUTF8;
+ print EXPORTFILE "$header";
+ print EXPORTFILE "$body";
+ print EXPORTFILE "$footer";
+ close EXPORTFILE;
+
+ return $self->getEndInfo;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportCSV.pm b/lib/gcstar/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..c70fe01
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportCSV.pm
@@ -0,0 +1,198 @@
+package GCExport::GCExportCSV;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterCSV;
+
+ use base qw(GCExport::GCExportBaseClass);
+ use Encode;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "CSV";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $charsets = '';
+ my @charsetList = Encode->encodings(':all');
+ foreach (@charsetList)
+ {
+ $charsets .= $_.',';
+ }
+
+ return [
+ {
+ name => 'sep',
+ type => 'short text',
+ label => 'Separator',
+ default => ';'
+ },
+
+ {
+ name => 'rep',
+ type => 'short text',
+ label => 'Replacement',
+ default => ','
+ },
+
+ {
+ name => 'charset',
+ type => 'options',
+ label => 'Charset',
+ valuesList => $charsets,
+ default => 'utf8',
+ },
+
+ {
+ name => 'withHeader',
+ type => 'yesno',
+ label => 'Header',
+ default => '1'
+ },
+
+ ];
+
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub wantsSort
+ {
+ return 1;
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+ return $self->{options}->{charset} eq 'utf8';
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+
+ if ($field)
+ {
+ $value = $self->SUPER::transformValue($value, $field);
+ }
+ $value =~ s/,+$//;
+ $value =~ s /$self->{options}->{sep}/$self->{options}->{rep}/g;
+ $value =~ s/\n|\r//g;
+ $value =~ s/<br\/>/ /g;
+ $value = encode($self->{options}->{charset}, $value)
+ if $self->{options}->{charset} ne 'utf8';
+ return $value;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result = '';
+
+ if ($self->{options}->{withHeader})
+ {
+ foreach (@{$self->{options}->{fields}})
+ {
+ #my $column = $self->{options}->{lang}->{FieldsList}->{$_};
+ my $column = $self->{model}->{fieldsInfo}->{$_}->{displayed};
+ $result .= $self->transformValue($column).$self->{options}->{sep};
+ }
+ $result =~ s/$self->{options}->{sep}$//;
+ $result .= "\n";
+ }
+
+ return $result;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $value = $item->{$_};
+ $result .= $self->transformValue($value, $_).$self->{options}->{sep};
+ }
+ $result =~ s/$self->{options}->{sep}$//;
+ $result .= "\n";
+
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ return $result;
+ }
+
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportExternal.pm b/lib/gcstar/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..d5c096c
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportExternal.pm
@@ -0,0 +1,182 @@
+package GCExport::GCExportExternal;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterExternal;
+
+ use File::Copy;
+ use File::Basename;
+ use Cwd;
+ use XML::Simple;
+ use GCUtils 'glob';
+ use GCBackend::GCBackendXmlParser;
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->{useZip} = $self->checkOptionalModule('Archive::Zip');
+
+ return $self;
+ }
+
+ sub wantsOsSeparator
+ {
+ return 0;
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file, $item, $field) = @_;
+ return $self->duplicatePicture($path,
+ $field,
+ $self->{imageDir},
+ $item->{$self->{model}->{commonFields}->{title}});
+ }
+
+ sub process
+ {
+ my ($self, $options) = @_;
+ $self->{parsingError} = '';
+ $self->{options} = $options;
+ $self->{options}->{withPictures} = 1;
+ #$self->{fileName} = $options->{file};
+ my $ext = ($self->{options}->{zip} ? 'gcz' : 'gcs');
+ my $outFile = $options->{file};
+ $outFile .= ".$ext" if ($outFile !~ m/\.$ext$/);
+ #$self->{fileName} .= '.gcs' if ($self->{fileName} !~ m/\.gcs$/);
+ $self->{fileName} = $outFile;
+ $self->{fileName} =~ s/z$/s/;
+ my $listFile = $self->{fileName};
+ my $baseDir = dirname($listFile);
+ my $baseName = basename($listFile, '.gcs');
+ my $imagesSubDir = $baseName.'_pictures';
+ $self->{imageDir} = $baseDir.'/'.$imagesSubDir;
+ $self->{original} = $options->{collection};
+ #$self->{original} =~ s/\\/\//g if ($^O =~ /win32/i);
+ $self->{origDir} = dirname($self->{original});
+
+ eval {
+ chdir $baseDir;
+ die 'Directory not writable' if !-w '.';
+ mkdir $self->{imageDir};
+
+ $self->{currentDir} = getcwd;
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $listFile,
+ version => $self->{options}->{parent}->{version},
+ wantRestore => 1,
+ standAlone => 1);
+
+ my $result = $backend->save($options->{items},
+ $options->{originalList}->getInformation,
+ undef);
+
+ if ($result->{error})
+ {
+ die $result->{error}->[1];
+ }
+ };
+
+ if ($@)
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $self->{options}->{parent}->{lang},
+ $self->{fileName},
+ ['SaveError', $@]
+ );
+ }
+
+ if ($self->{options}->{zip})
+ {
+ chdir $baseDir;
+ my $zip = Archive::Zip->new();
+ $zip->addFile(basename($self->{fileName}));
+ $zip->addDirectory(basename($self->{imageDir}));
+ my @images = glob $imagesSubDir.'/*';
+ $zip->addFile($_) foreach @images;
+ my $result = $zip->writeToFileNamed($outFile);
+ if ($result)
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $self->{options}->{parent}->{lang},
+ $outFile,
+ ['SaveError', $@]
+ );
+ }
+ else
+ {
+ # Cleanup to remove everything but the .gcz file
+ unlink $self->{fileName};
+ unlink foreach (@images);
+ rmdir $imagesSubDir;
+ }
+ }
+ chdir;
+ return $self->getEndInfo;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+
+ if ($self->{useZip})
+ {
+ push @options, {
+ name => 'zip',
+ type => 'yesno',
+ label => 'ZipAll',
+ default => '0'
+ };
+ }
+
+ return \@options;
+ }
+
+# sub getName
+# {
+# my $self = shift;
+#
+# return "External";
+# }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ return ($self->{parsingError}, 'error')
+ if $self->{parsingError};
+
+ return '';
+ }
+}
diff --git a/lib/gcstar/GCExport/GCExportHTML.pm b/lib/gcstar/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..b083545
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportHTML.pm
@@ -0,0 +1,592 @@
+package GCExport::GCExportHTML;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterHTML;
+
+
+ use File::Copy;
+ use File::Basename;
+ use XML::Simple;
+ use base qw(GCExport::GCExportBaseClass);
+ use GCUtils 'glob';
+
+ our $FieldsList = 'GCSfields';
+ our $GroupsList = 'GCSgroups';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{genericModels} = 0;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "HTML";
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return ".html";
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub getModels
+ {
+ my $self = shift;
+
+ return [];
+ }
+
+ sub setModelsDir
+ {
+ my $self = shift;
+ $self->{genericModelsDir} = $ENV{GCS_SHARE_DIR}.'/html_models/GCstar';
+ if ($self->{model})
+ {
+ $self->{modelsDir} = $ENV{GCS_SHARE_DIR}.'/html_models/'.$self->{model}->getName;
+ if ((! $self->{model}->getName) || (! -e $self->{modelsDir}))
+ {
+ $self->{modelsDir} = $self->{genericModelsDir};
+ $self->{genericModels} = 1;
+ }
+ }
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ $self->{modelsFiles} = '';
+
+ $self->setModelsDir;
+
+ my $defaultModel = '';
+ $self->{isGeneric} = {};
+ foreach (glob $self->{modelsDir}.'/*')
+ {
+ next if ($_ =~ /\/CVS$/) || ($_ =~ /\.png$/);
+ (my $mod = basename($_)) =~ s/_/ /g;
+ $self->{modelsFiles} .= $mod.',';
+ $defaultModel = $mod if !$defaultModel;
+ $self->{isGeneric}->{$mod} = $self->{genericModels};
+ }
+ $self->{genericAdded} = 0;
+ if (!$self->{genericModels})
+ {
+ # Previous one was specific, we also add the generic ones.
+ foreach (glob $self->{genericModelsDir}.'/*')
+ {
+ next if ($_ =~ /\/CVS$/) || ($_ =~ /\.png$/);
+ (my $mod = basename($_)) =~ s/_/ /g;
+
+ next if exists $self->{isGeneric}->{$mod};
+ $self->{modelsFiles} .= $mod.',';
+ $self->{isGeneric}->{$mod} = 1;
+ $self->{genericAdded} = 1;
+ }
+ }
+ $self->{modelsFiles} .= 'UseFile,';
+ return [
+ {
+ name => 'template',
+ type => 'options',
+ label => 'FileTemplate',
+ valuesList => $self->{modelsFiles},
+ default => $defaultModel,
+ changedCallback => sub {shift; $self->checkFileField(@_)},
+ buttonLabel => 'Preview',
+ buttonCallback => sub {shift; $self->preview(@_)}
+ },
+
+ {
+ name => 'modelFile',
+ type => 'file',
+ label => 'TemplateExternalFile',
+ default => '',
+ insensitive => 1,
+ },
+
+ {
+ name => 'title',
+ type => 'short text',
+ label => 'Title',
+ default => 'Items list',
+ },
+
+ {
+ name => 'imgHeight',
+ type => 'number',
+ label => 'HeightImg',
+ default => 160,
+ min => 50,
+ max => 500,
+ },
+
+ {
+ name => 'withJs',
+ type => 'yesno',
+ label => 'WithJS',
+ default => '1'
+ },
+
+ {
+ name => 'open',
+ type => 'yesno',
+ label => 'OpenFileInBrowser',
+ default => '0'
+ },
+
+ ]
+ }
+
+ sub getNewPictureHeight
+ {
+ my $self = shift;
+ return $self->{options}->{imgHeight};
+ }
+
+ sub checkFileField
+ {
+ my ($self, $data) = @_;
+ my ($parent, $list) = @{$data};
+ return if ! $parent->{options}->{modelFile};
+ my $model = $list->getValue ;
+ $parent->{options}->{modelFile}->set_sensitive($model eq 'UseFile');
+ $parent->{fieldsSelection}->set_sensitive($self->{isGeneric}->{$model})
+ if $parent->{fieldsSelection};
+ }
+
+ sub preview
+ {
+ my ($self, $data) = @_;
+ my ($parent, $list) = @{$data};
+ (my $template = $list->getValue) =~ s/ /_/g;
+ my $dialog = new Gtk2::Dialog($self->getLang->{Preview}.' - '.$list->getValue,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-ok' => 'ok',
+ );
+
+ my $picFile;
+ if ($self->{isGeneric}->{$template})
+ {
+ $picFile = $self->{genericModelsDir}.'/'.$template.'.png';
+ }
+ else
+ {
+ $picFile = $self->{modelsDir}.'/'.$template.'.png';
+ }
+ if (-f $picFile)
+ {
+ my $image = Gtk2::Image->new_from_file($picFile);
+ $image->set_padding(10,10);
+ $dialog->vbox->pack_start($image,0,0,0);
+ }
+ else
+ {
+ my $label = new Gtk2::Label;
+ $label->set_markup('<b>'.$self->getLang->{NoPreview}.'</b>');
+ $dialog->vbox->pack_start($label,1,1,0);
+ $dialog->set_default_size(300,300);
+ }
+ $dialog->vbox->show_all;
+ $dialog->run;
+ $dialog->destroy;
+ $parent->showMe;
+ }
+
+ sub wantsFieldsSelection
+ {
+ my $self = shift;
+ return 1;
+ return $self->{genericAdded} || $self->{genericModels};
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub wantsOsSeparator
+ {
+ return 0;
+ }
+
+ sub wantsSort
+ {
+ return 1;
+ }
+
+ sub transformData
+ {
+ my ($self, $item, $field, $asATable) = @_;
+
+ my $data = $item->{$field};
+ if ($asATable)
+ {
+ return '' if !$data;
+ my $result = '';
+ my $i = 1;
+ foreach (@{$data})
+ {
+ my $class = ($i % 2) ? 'even' : 'odd';
+ $result .= " <tr class=\"$class\">\n";
+ foreach my $item(@{$_})
+ {
+ $result .= " <td>$item</td>\n";
+ }
+ $result .= " </tr>\n";
+ $i++;
+ }
+ return $result;
+ }
+ else
+ {
+ my $value = $self->transformValue($data, $field);
+ $value =~ s|\n|<br />|g;
+ return $value;
+ }
+ }
+
+ sub getValues
+ {
+ my ($self, $values, $filter) = @_;
+ my $needFilter = (length($filter) > 2);
+ my @result;
+ if ($values eq $GroupsList)
+ {
+ # We generate the list of group for the selected fields
+ my %groups;
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $group = $self->{options}->{fieldsInfo}->{$_}->{group};
+ $groups{$group} = 1;
+ }
+ foreach (@{$self->{model}->{groups}})
+ {
+ my $group = $_->{id};
+ push @result, $group if $groups{$group};
+ }
+ }
+ else
+ {
+ # We could have a group name or a list of fields types
+ my $type;
+ my $group;
+ foreach (@{$self->{options}->{fields}})
+ {
+ $type = $self->{options}->{fieldsInfo}->{$_}->{type};
+ $group = $self->{options}->{fieldsInfo}->{$_}->{group};
+ push @result, $_
+ if ($type ne 'triple list')
+ && (($group =~ /^$values$/i) || ($values eq $FieldsList))
+ && (!$needFilter || ($needFilter && ($filter =~ /$type/)));
+ }
+ }
+ return \@result;
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+
+ $self->{errors} = 0;
+ $self->setModelsDir;
+ my $template = $self->{options}->{template};
+ my $file;
+ my $model;
+ if ($template eq 'UseFile')
+ {
+ $file = $self->{options}->{modelFile};
+ if ( ! -e $file)
+ {
+ $self->{errors} = $self->getLang->{ModelNotFound};
+ return 0;
+ }
+ }
+ else
+ {
+ $template =~ s/ /_/;
+ if ($self->{isGeneric}->{$template})
+ {
+ $file = $self->{genericModelsDir}.'/'.$self->{options}->{template};
+ }
+ else
+ {
+ $file = $self->{modelsDir}.'/'.$self->{options}->{template};
+ }
+
+ $file =~ s/"//g;
+ #"
+ }
+ # The problem should only happen when using command line, so a die is enough.
+ open FILE, $file or die "\nModel $template doesn't exist for this kind of collection";
+ binmode(FILE, ':utf8' );
+ $model = do { local $/; <FILE> };
+ close FILE;
+
+ if ($model =~ /^<metamodel>/)
+ {
+ my $xs = XML::Simple->new;
+ my $meta = $xs->XMLin($model,
+ ForceArray => ['field']);
+ open FILE, $self->{genericModelsDir}.'/'.$meta->{model};
+ binmode(FILE, ':utf8' );
+ $model = do { local $/; <FILE> };
+ close FILE;
+ $self->{options}->{fields} = $meta->{fields}->{field};
+ }
+
+ if ($self->{options}->{withJs})
+ {
+ $model =~ s/(\[JAVASCRIPT\])|(\[\/JAVASCRIPT\])//gms;
+ $model =~ s/\[NOJAVASCRIPT\].*?\[\/NOJAVASCRIPT\]//gms;
+ }
+ else
+ {
+ $model =~ s/\[JAVASCRIPT\].*?\[\/JAVASCRIPT\]//gms;
+ $model =~ s/(\[NOJAVASCRIPT\])|(\[\/NOJAVASCRIPT\])//gms;
+ }
+
+ # If collection does not manage lendings, remove the LENDING blocks
+ $model =~ s|\[LENDING\](.*?)\[/LENDING\]| $self->{model}->{hasLending} ? $1 : '' |ems;
+
+ #Loops
+ while ($model =~ m/\[LOOP([0-9]+)?\s+values=([^\s]*?)\s+idx=([^\s]*?)(\s+filter=([^\s]*?))?\]\n?(.*?)\n\s*\[\/LOOP\1\]/gms)
+ {
+ my $loopNumber = $1;
+ my $values = $2;
+ my $index = $3;
+ my $filter = ','.$5.',';
+ my $motif = $6;
+ my $valuesArray = $self->getValues($values, $filter);
+ my $string;
+ foreach my $value(@$valuesArray)
+ {
+ (my $line = $motif) =~ s/$index/$value/gms;
+ # For generic models, we add an img tag for images
+ # and an a tag for links
+ if (exists $self->{options}->{fieldsInfo}->{$value})
+ {
+ # If this is an image
+ if ($self->{options}->{fieldsInfo}->{$value}->{type} eq 'image')
+ {
+ # We do it only if it is between 2 tags.
+ $line =~ s|>\$\$$value\$\$<|><img src="\$\$$value\$\$"/><|;
+ }
+ # If this is the item URL
+ elsif ($value eq $self->{model}->{commonFields}->{url})
+ {
+ # We do it only if it is between 2 tags.
+ $line =~ s|>\$\$$value\$\$<|><a href="\$\$$value\$\$"/>\$\$$self->{model}->{commonFields}->{title}\$\$</a><|;
+ }
+ }
+ $string .= $line;
+ }
+ $model =~ s/(\n?)\s*\[LOOP$loopNumber\s+values=$values\s+idx=$index(\s+filter=$filter)?\].*?\[\/LOOP$loopNumber\]/$1$string/gms;
+ }
+ $model =~ s/TITLE_FIELD/$self->{model}->{commonFields}->{title}/eg;
+ $model =~ s/COVER_FIELD/$self->{model}->{commonFields}->{cover}/eg;
+
+ $model =~ m{
+ \[HEADER\]\n?(.*?)\n?\[\/HEADER\].*?
+ \[ITEM\]\n?(.*?)\n?\[\/ITEM\].*?
+ \[FOOTER\]\n?(.*?)\n?\[\/FOOTER\].*?
+ \[POST\]\n?(.*?)\n?\[\/POST\]
+ }xms;
+ $self->{header} = $1;
+ $self->{item} = $2;
+ $self->{footer} = $3;
+ $self->{post} = $4;
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $total) = @_;
+
+ my $result = $self->{header};
+
+ $self->{total} = $total;
+ $result =~ s/\$\$PAGETITLE\$\$/$self->{options}->{title}/g;
+ $result =~ s/\$\$TOTALNUMBER\$\$/$total/g;
+ $result =~ s/\$\$ITEMS\$\$/$self->{model}->getDisplayedItems/eg;
+
+ #Search form
+ $result =~ s/\$\$FORM_INPUT\$\$/$self->getLang->{InputTitle}/eg;
+ $result =~ s/\$\$FORM_SEARCH1\$\$/$self->getLang->{SearchType1}/eg;
+ $result =~ s/\$\$FORM_SEARCH2\$\$/$self->getLang->{SearchType2}/eg;
+ $result =~ s/\$\$FORM_SEARCHBUTTON\$\$/$self->getLang->{SearchButton}/eg;
+ $result =~ s/\$\$FORM_SEARCHTITLE\$\$/$self->getLang->{SearchTitle}/eg;
+ $result =~ s/\$\$FORM_ALLBUTTON\$\$/$self->getLang->{AllButton}/eg;
+ $result =~ s/\$\$FORM_ALLTITLE\$\$/$self->getLang->{AllTitle}/eg;
+ $result =~ s/\$\$FORM_EXPAND\$\$/$self->getLang->{Expand}/eg;
+ $result =~ s/\$\$FORM_EXPANDTITLE\$\$/$self->getLang->{ExpandTitle}/eg;
+ $result =~ s/\$\$FORM_COLLAPSE\$\$/$self->getLang->{Collapse}/eg;
+ $result =~ s/\$\$FORM_COLLAPSETITLE\$\$/$self->getLang->{CollapseTitle}/eg;
+
+ #Labels
+ $result =~ s/\$\$([a-zA-Z0-9_]*)_LABEL\$\$/$self->{model}->getDisplayedLabel($1)/eg;
+
+ return $result."\n";
+ }
+
+ sub getFooter
+ {
+ my ($self, $item) = @_;
+
+ my $total = $self->{total};
+ my $result = $self->{footer};
+ $result =~ s/\$\$PAGETITLE\$\$/$self->{options}->{title}/g;
+ $result =~ s/\$\$TOTALNUMBER\$\$/$total/g;
+ $result =~ s/\$\$GENERATOR_NOTE\$\$/$self->getLang->{Note}/eg;
+ $result =~ s/\$\$BORROWED_ITEMS\$\$/$self->{options}->{lang}->{BorrowedTitle}/g;
+
+ return $result."\n";
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $idx) = @_;
+ my $total = $self->{total};
+ my $result = $self->{item};
+
+ #Separator
+ $result =~ s/\$\$SEPARATOR\$\$/$self->{options}->{lang}->{Separator}/g;
+
+ #Labels that need a special process
+ $result =~ s/\$\$URL_LABEL\$\$/$self->{options}->{lang}->{PanelWeb}/g;
+
+ #Other labels
+ $result =~ s/\$\$([a-zA-Z0-9_]*)_LABEL\$\$/$self->{model}->getDisplayedLabel($1)/eg;
+
+ #Fields that need a special process
+ $result =~ s/\$\$HEIGHT_PIC\$\$/$self->{options}->{imgHeight}/g;
+ my $url = $item->{$self->{model}->{commonFields}->{url}} || '#';
+ $result =~ s/\$\$URL\$\$/$url/g;
+
+ #Borrower
+ my $borrowerField = $self->{model}->{commonFields}->{borrower}->{name};
+ my $tmpBorrower = $item->{$borrowerField};
+ my $borrowerFlag = 1;
+ my $borrowerYesNo = $self->getLang->{Borrowed};
+ my $borrowerOrEmpty = $tmpBorrower;
+ if (!$tmpBorrower || ($tmpBorrower eq 'none'))
+ {
+ $tmpBorrower = $self->{options}->{lang}->{PanelNobody};
+ $borrowerFlag = 0;
+ $borrowerYesNo = $self->getLang->{NotBorrowed};
+ $borrowerOrEmpty = '';
+ }
+ elsif ($tmpBorrower eq 'unknown')
+ {
+ $tmpBorrower = $self->{options}->{lang}->{PanelUnknown};
+ }
+ $result =~ s/\$\$borrower\$\$/$tmpBorrower/g;
+ $result =~ s/\$\$borrower_OREMPTY\$\$/$borrowerOrEmpty/g;
+ $result =~ s/\$\$borrower_FLAG\$\$/$borrowerFlag/g;
+ $result =~ s/\$\$borrower_YESNO\$\$/$borrowerYesNo/g;
+
+ $result =~ s/\$\$IDX\$\$/$idx/g;
+ $result =~ s/\$\$TOP\$\$/$self->getLang->{Top}/eg;
+ $result =~ s/\$\$BOTTOM\$\$/$self->getLang->{Bottom}/eg;
+ $result =~ s/\$\$TOTALNUMBER\$\$/$total/g;
+
+ # Stock labels
+ $result =~ s/\$\$(gtk-[^\$]*)\$\$/$self->getStockLabel($1)/eg;
+
+ #Multiple list displayed as a table
+ $result =~ s/\$\$([a-zA-Z0-9_]*)_TABLE\$\$/$self->transformData($item, $1, 1)/eg;
+
+ #Other fields
+ #$result =~ s/\$\$([A-Z_]*)\$\$/$item->{lc $1}/eg;
+ $result =~ s/\$\$([a-zA-Z0-9_]*)\$\$/$self->transformData($item, $1, 0)/eg;
+ return $result."\n";
+ }
+
+ sub postProcess
+ {
+ my ($self, $headerRef, $bodyRef) = @_;
+
+ #Variables to be used in POST section
+ my $header = $$headerRef;
+ my $body = $$bodyRef;
+ my @items = @{$self->{sortedArray}};
+
+ eval $self->{post};
+ print "Errors with HTML template in POST:\n $@\n" if $@;
+
+ $$headerRef = $header;
+ $$bodyRef = $body;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+
+ if ($self->{errors})
+ {
+ return ($self->{errors}, 'error');
+ }
+
+ my $message = '';
+
+ if ($self->{options}->{open})
+ {
+ $self->{options}->{parent}->launch($self->{fileName}, 'url');
+ }
+ else
+ {
+ $message = $self->getLang->{InfoFile}.$self->{fileName};
+ $message .= '
+
+'.$self->getLang->{InfoDir}.$self->{dirName}
+ if $self->{options}->{withPictures};
+ }
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportLatex.pm b/lib/gcstar/GCExport/GCExportLatex.pm
new file mode 100644
index 0000000..0592908
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportLatex.pm
@@ -0,0 +1,204 @@
+package GCExport::GCExportLatex;
+use utf8;
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterLatex;
+
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName {
+ my $self = shift;
+ return "Latex";
+ }
+
+ sub getOptions {
+ my $self = shift;
+ return [
+ {
+ name => 'one',
+ type => 'yesno',
+ label => 'Export One Media',
+ default => '0',
+ },
+ {
+ name => 'disc',
+ type => 'number',
+ label => '# of Media',
+ default => '1',
+ min => '0',
+ max => '10000',
+ },
+ ];
+
+ }
+
+ sub wantsFieldsSelection {
+ return 0;
+ }
+
+ sub wantsImagesSelection {
+ return 0;
+ }
+
+ sub needsUTF8 {
+ return 1;
+ }
+
+ sub preProcess {
+ my $self = shift;
+ return 1;
+ }
+
+ sub transformValue {
+ my ($self, $value, $field) = @_;
+
+ if ($field) {
+ $value = $self->SUPER::transformValue($value, $field);
+ }
+ $value =~ s/,+$//;
+ $value =~ s/\n|\r//g;
+ $value =~ s/<br\/>/ /g;
+ $value =~ s/\^/\\^{}/g;
+ $value =~ s/\&/\\\&/g;
+ $value =~ s/\"/\'\'/g;
+ return $value;
+ }
+
+ sub getHeader {
+ my ($self, $number) = @_;
+ my $result = '';
+ $result = "\\documentclass[a4paper]{article}
+\\usepackage{ucs}
+\\usepackage[utf8]{inputenc}
+\\usepackage[russian]{babel}
+\\usepackage{geometry}
+\\geometry{a4paper,top=1cm,bottom=1cm,left=1cm,right=1cm}
+\\pagestyle{empty}
+\\linespread{0.6}
+\\sloppy
+
+\\newcommand{\\dvd}[2]{
+\\framebox[12cm]{
+\\begin{tabular}{p{0pt}\@{}p{11.9cm}}
+\\rule[-6cm]{0pt}{11.7cm}&\\begin{minipage}{11.7cm}
+{\\bf DVD #1}
+\\begin{itemize}
+\\setlength{\\parskip}{-3pt}
+#2
+\\end{itemize}\\vspace{-3pt}
+\\end{minipage}
+\\end{tabular}}}
+
+\\begin{document}
+\\footnotesize
+";
+ $result .= "\\dvd{$self->{options}->{disc}}{\n"
+ if $self->{options}->{one};
+ return $result;
+ }
+
+ sub getItem {
+ my ($self, $item, $number) = @_;
+ my $result;
+ return '' if ($self->{options}->{one} &&
+ $item->{number} ne $self->{options}->{disc});
+ $result .= '\item {\bf ' . $self->transformValue ($item->{title}, "title") . "}";
+ $result .= ' / ' . $self->transformValue ($item->{original}, 'original') if $item->{original};
+ $result .= " ($item->{date})" if $item->{date};
+ # one line for russian cartoons
+ if ($self->transformValue ($item->{genre}, 'genre') =~
+ m/Мультфильм/) {
+ $result .= ' м/ф';
+ } elsif ($item->{genre} || $item->{director} ||
+ $item->{audio} || $item->{time}) {
+ $result .= "\\\\\n\\begin{tabular}{ll}\n";
+ $result .= $self->getLocal('genre') . ': & ' .
+ $self->transformValue ($item->{genre}, 'genre') . '\\\\'
+ if $item->{genre};
+ $result .= $self->getLocal('director') . ": & $item->{director}\\\\"
+ if $item->{director};
+ my $audio = $self->transformValue ($item->{audio}, 'audio')
+ if $item->{audio};
+ $audio =~ s/\([\w\ ]+\)//g;
+ $audio =~ s/\([\w\ ]+\)//g;
+ $audio =~ s/\ ,/,/g;
+ $audio =~ s/\s+$//g;
+ $result .= $self->getLocal('audio') . ": & $audio" if length ($audio) > 0;
+ $result .= "; " . $self->transformValue ($item->{subt}, 'subt') .
+ ' (' . $self->getLocal('subt') . ')'
+ if $item->{subt};
+ $result .= '\\\\';
+ $result .= $self->getLocal('time') . ": & $item->{time} мин.\\\\" if $item->{time};
+ $result .= $self->getLocal('country') . ": & $item->{country}" if $item->{country};
+ $result .= "\n\\end{tabular}\n";
+ }
+ # don't include information about media # 0
+ if ((!$self->{options}->{one}) && $item->{number} != 0) {
+ $self->{expdata}->{$item->{number}} .= $result;
+ $self->{expdata}->{all} .= $self->{expdata}->{all} ? ',' . $item->{number} : $item->{number} if $self->{expdata}->{all} !~ m/$item->{number}/;
+ return '';
+ } elsif ($self->{options}->{one}) {
+ return $result;
+ }
+ return '';
+ }
+
+ sub getFooter {
+ my $self = shift;
+ my $result = '';
+ if ($self->{options}->{one}) {
+ $result = "\n}\n\\end{document}\n";
+ } else {
+ my @data = split (/,/, $self->{expdata}->{all});
+ foreach my $key (sort @data) {
+ $result .= "\n\n\\dvd{$key}{\n$self->{expdata}->{$key}}";
+ }
+ $result .= "\n\\end{document}\n";
+ }
+ return $result;
+ }
+
+ sub getLocal {
+ my ($self, $name) = @_;
+ # some abbreviations for russian language
+ if ($self->{options}->{lang}->{LangName} eq "Russian") {
+ return "Реж." if $name eq "director";
+ return "Звук" if $name eq "audio";
+ return "ВремÑ" if $name eq "time";
+ return "Ñуб." if $name eq "subt";
+ return $self->{model}->getDisplayedLabel($name);
+ } else {
+ return $self->{model}->getDisplayedLabel($name);
+ }
+ }
+
+ sub getModels {
+ return ['GCfilms'];
+ }
+
+ sub postProcess {
+ my ($self, $header, $body) = @_;
+ }
+
+ sub getEndInfo {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportPDB.pm b/lib/gcstar/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..af1e4db
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportPDB.pm
@@ -0,0 +1,295 @@
+package GCExport::GCExportPDB;
+
+###################################################
+#
+# Copyright 2009-2010 Andrew Ross
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterPDB;
+
+ use base qw(GCExport::GCExportBaseClass);
+ use Encode;
+
+ my @record_lengths;
+
+ my $EPOCH_1904 = 2082844800; # Difference between Palm's
+ # epoch (Jan. 1, 1904) and
+ # Unix's epoch (Jan. 1, 1970),
+ # in seconds.
+
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ return [
+ {
+ name => 'dbname',
+ type => 'short text',
+ label => 'DatabaseName',
+ default => 'gcstar'
+ },
+ ];
+
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 0;
+ }
+
+ sub wantsSort
+ {
+ return 1;
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+ return 0;
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return ".pdb";
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+
+ if ($field)
+ {
+ $value = $self->SUPER::transformValue($value, $field);
+ }
+ $value =~ s/,+$//;
+ $value =~ s/\n|\r//g;
+ $value =~ s/<br\/>/ /g;
+
+ return $value;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result = '';
+
+ # clear the record lengths array
+ @record_lengths = ();
+
+ # Add database title
+ my $name = $self->{options}->{'dbname'};
+ if (length($name) > 31)
+ {
+ $name = substr($name, 0, 31);
+ }
+ while (length($name) < 32)
+ {
+ $name .= "\x00"; # pack out with null's
+ }
+ $result .= $name;
+
+ # Add attribute flags (=0)
+ $result .= pack('n', 0);
+
+ # Add file version (=0)
+ $result .= pack('n', 0);
+
+ # Add dates for create time, modify time, backup time
+ # These dates are the number of seconds since 1st Jan 1904
+ my $now = time() + $EPOCH_1904;
+
+ $result .= pack('N', $now);
+ $result .= pack('N', $now);
+ $result .= pack('N', $now);
+
+ # Add the Modification Number (=0)
+ $result .= pack('N', 0);
+
+ # Add the offset to the Application Info
+ # offset calculated as:
+ # Title: 0x20
+ # flags + version + 3 x dates 0x10
+ # mod_number + app_offset 0x08
+ # sortID + type 0x08
+ # creator + seed 0x08
+ # recordListID + cnt + 2byte 0x08
+ # 8 bytes per record 8 * $number
+ $result .= pack('N', 0x50 + (8 * $number));
+
+ # Add null for the sortInfoID since we don't create a sortInfo
+ $result .= pack('N', 0);
+
+ # Add the type
+ $result .= "DB00";
+
+ # Add the creator
+ $result .= "DBOS";
+
+ # add the uniqueIDseed = 0
+ $result .= pack('N', 0);
+
+ # Add the nextRecordListID = 0 when on disk
+ $result .= pack('N', 0);
+
+ # add the record count
+ $result .= pack('n',$number);
+
+ # The record offset table goes here, but is added in postProcess()
+
+ # "Traditional" 2-byte gap to data
+ $result .= pack('n', 0);
+
+ # Start the AppInfoID section
+ $result .= pack('N', 2);
+
+
+ # CHUNK_FIELD_NAMES (0)
+ $result .= pack('n',0);
+ my $fieldstring = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $column = $self->{model}->{fieldsInfo}->{$_}->{displayed};
+ $fieldstring .= $self->transformValue($column)."\x00";
+ }
+ $result .= pack('n', length($fieldstring));
+ $result .= $fieldstring;
+
+ # CHUNK_FIELD_TYPES (1)
+ $result .= pack('n',1);
+ $fieldstring = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ $fieldstring .= pack('n',0);
+ }
+ $result .= pack('n', length($fieldstring));
+ $result .= $fieldstring;
+
+ # CHUNK_LISTVIEW_OPTIONS (65)
+ $result .= pack('n',65);
+ $result .= pack('n',4);
+ $result .= pack('n',0);
+ $result .= pack('n',0);
+
+ # CHUNK_LFIND_OPTIONS (128)
+ $result .= pack('n',128);
+ $result .= pack('n',2);
+ $result .= pack('n',0);
+
+ return $result;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ my @lengths = ();
+ my $fieldstr;
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $value = $item->{$_};
+ my $str = $self->transformValue($value, $_)."\x00";
+ push (@lengths, length($str));
+ $fieldstr .= $str;
+ }
+
+ my $al = scalar(@lengths) * 2;
+ for(my $i=0;$i<=$#lengths;$i++)
+ {
+ $result .= pack('n', $al);
+ $al += $lengths[$i];
+ }
+ $result .= $fieldstr;
+ push (@record_lengths, length($fieldstr)+(2 * scalar(@lengths)));
+
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ return $result;
+ }
+
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # add the index:
+ my $index = "";
+
+ my $numrecs = scalar(@record_lengths);
+ my $offset = length($$header) + (8*$numrecs);
+
+ for (my $i=0;$i<$numrecs;$i++)
+ {
+ $index .= pack('N', $offset);
+ $index .= pack('n', 0);
+ $index .= pack('n', $i);
+ $offset += $record_lengths[$i];
+ }
+
+ # Insert the index into the header
+ $$header = substr($$header, 0, 0x4e).$index.substr($$header,0x4e);
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportSQL.pm b/lib/gcstar/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..5164d3b
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportSQL.pm
@@ -0,0 +1,172 @@
+package GCExport::GCExportSQL;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterSQL;
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return "";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ return [
+ {
+ name => 'table',
+ type => 'short text',
+ label => 'TableName',
+ default => 'items'
+ },
+ {
+ name => 'withDrop',
+ type => 'yesno',
+ label => 'WithDrop',
+ default => '1'
+ },
+ {
+ name => 'withCreate',
+ type => 'yesno',
+ label => 'WithCreate',
+ default => '1'
+ },
+ ]
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "SQL";
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+
+ my $result = '';
+
+ if ($self->{options}->{withDrop})
+ {
+ $result .= 'DROP TABLE '.$self->{options}->{table}.";\n";
+ }
+ if ($self->{options}->{withCreate})
+ {
+ $result .= 'CREATE TABLE '.$self->{options}->{table}.' (';
+
+ foreach (@{$self->{options}->{fields}})
+ {
+ my $type = $self->{model}->{fieldsInfo}->{$_}->{type};
+ my $format = 'TEXT';
+ $format = 'NUMBER' if ($type eq 'number') || ($type eq 'yesno');
+ $result .= "$_ $format, ";
+ }
+ $result =~ s/, $//;
+ $result .= ");\n";
+ }
+
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+
+ my $result = "COMMIT;\n";
+ return $result;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ $result = 'INSERT INTO '.$self->{options}->{table}.' (';
+ my $values = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ $result .= "$_, ";
+ my $value = $self->transformValue($item->{$_}, $_);
+ $value =~ s/'/''/g;
+ #'
+ $values .= "'".$value."', ";
+ }
+ $result =~ s/, $//;
+ $values =~ s/, $//;
+
+ $result .= ") VALUES ($values);\n";
+ return $result;
+ }
+
+ sub postProcess
+ {
+ my ($self, $value, $body) = @_;
+
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message = $self->getLang->{InfoFile}.$self->{fileName};
+ return $message;
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCExport/GCExportTarGz.pm b/lib/gcstar/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..b8994d0
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportTarGz.pm
@@ -0,0 +1,174 @@
+package GCExport::GCExportTarGz;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterTarGz;
+
+ use File::Copy;
+ use File::Basename;
+ use Cwd;
+ use XML::Simple;
+ use GCUtils 'glob';
+ use GCBackend::GCBackendXmlParser;
+ use base qw(GCExport::GCExportBaseClass);
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->checkModule('Compress::Zlib');
+ $self->checkModule('Archive::Tar');
+
+ return $self;
+ }
+
+ sub wantsOsSeparator
+ {
+ return 0;
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file, $item, $field) = @_;
+ return $self->duplicatePicture($path,
+ $field,
+ $self->{currentDir}.'/'.$self->{imageDir},
+ $item->{$self->{model}->{commonFields}->{title}});
+ }
+
+ sub process
+ {
+ my ($self, $options) = @_;
+ $self->{parsingError} = '';
+ $self->{options} = $options;
+ $self->{options}->{withPictures} = 1;
+ $self->{fileName} = $options->{file};
+ $self->{fileName} .= '.tar.gz' if ($self->{fileName} !~ m/\.tar\.gz$/);
+
+ my $listFile = 'collection.gcs';
+ my $baseDir = 'tmp_items_tar_gz';
+ my $imagesSubDir = 'images';
+ $self->{imageDir} = $baseDir.'/'.$imagesSubDir;
+ $self->{original} = $options->{collection};
+ #$self->{original} =~ s/\\/\//g if ($^O =~ /win32/i);
+ $self->{origDir} = dirname($self->{original});
+ (my $tarfile = $self->{fileName}) =~ s/\.gz$//;
+
+ eval {
+ chdir dirname($self->{fileName});
+ die 'Directory not writable' if !-w '.';
+ mkdir $baseDir;
+ mkdir $self->{imageDir};
+
+ $self->{currentDir} = getcwd;
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $baseDir.'/'.$listFile,
+ version => $self->{options}->{parent}->{version},
+ wantRestore => 1,
+ standAlone => 1);
+
+ my $result = $backend->save($options->{items},
+ $options->{originalList}->getInformation,
+ undef);
+
+ if ($result->{error})
+ {
+ die $result->{error}->[1];
+ }
+
+ chdir $self->{currentDir};
+
+ my $tar = Archive::Tar->new();
+ chdir $baseDir;
+
+ $tar->add_files($listFile, $imagesSubDir);
+ my @images = glob $imagesSubDir.'/*';
+ $tar->add_files($_) foreach (@images);
+ $tar->write($tarfile);
+
+ my $gz = Compress::Zlib::gzopen($self->{fileName}, "wb");
+ $gz or die 'Cannot write';
+ open(TAR, $tarfile) or die "Cannot open $tarfile";
+ binmode(TAR);
+ my $buff;
+ while (read(TAR, $buff, 8 * 2**10))
+ {
+ $gz->gzwrite($buff);
+ }
+ $gz->gzclose;
+ close TAR;
+ unlink foreach (@images);
+ };
+
+ if ($@)
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $self->{options}->{parent}->{lang},
+ $self->{fileName},
+ ['SaveError', $@]
+ );
+ }
+
+ eval {
+ unlink $listFile;
+ rmdir $imagesSubDir;
+ chdir '..';
+ rmdir $baseDir;
+ $tarfile =~ s/\\/\//g if ($^O =~ /win32/i);
+ unlink $tarfile;
+ };
+ return $self->getEndInfo;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return ".tar.gz";
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ return ($self->{parsingError}, 'error')
+ if $self->{parsingError};
+
+ return ($self->getLang->{Info}.$self->{fileName}, 'info');
+ }
+}
diff --git a/lib/gcstar/GCExport/GCExportTellico.pm b/lib/gcstar/GCExport/GCExportTellico.pm
new file mode 100644
index 0000000..2bac594
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportTellico.pm
@@ -0,0 +1,512 @@
+package GCExport::GCExportTellico;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterTellico;
+
+ use base qw(GCExport::GCExportBaseClass);
+ use GCUtils;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->checkModule('MIME::Base64');
+ $self->checkModule('Digest::MD5');
+
+ #List of collections: http://www.periapsis.org/tellico/doc/collection-type-values.html
+ # [ entryTitle, type, extra fields ]
+ $self->{models} = {
+ GCbooks => ['Books', '2', ''],
+ GCfilms => ['Videos', '3', '<field flags="2" title="Rating" category="Personal" allowed="5;4;3;2;1" format="4" type="3" name="rating" />'],
+ GCmusics => ['Music', '4', ''],
+ GCcoins => ['Coin', '8', ''],
+ GCgames => ['Games', '11', '']
+ };
+
+ return $self;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "Tellico";
+ }
+
+ sub getModels
+ {
+ my $self = shift;
+
+ my @models = keys %{$self->{models}};
+ return \@models;
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ return [];
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+
+ $self->{imagesInfos} = {};
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result;
+
+ my $model = $self->{model};
+ my $title = $model->getDescription;
+ my $info = $self->{models}->{$model->getName};
+
+ $result = '<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE tellico PUBLIC "-//Robby Stephenson/DTD Tellico V9.0//EN" "http://periapsis.org/tellico/dtd/v9/tellico.dtd">
+<tellico xmlns="http://periapsis.org/tellico/" syntaxVersion="7" >
+ <collection title="'.$title.'" entryTitle="'.$info->[0].'" type="'.$info->[1].'" >
+ <fields>
+ <field name="_default" />
+ '.$info->[2].'
+ </fields>
+';
+
+ return $result;
+ }
+
+ sub transformData
+ {
+ my ($self, $data) = @_;
+
+ $data =~ s/&/&amp;/g;
+
+ return $data;
+ }
+
+ sub transformList
+ {
+ my ($self, $list, $tag) = @_;
+
+ my $result = '';
+ if (ref($list) eq 'ARRAY')
+ {
+ foreach (@{$list})
+ {
+ $result .= " <$tag>".$self->transformData($_->[0])
+ ."</$tag>\n";
+ }
+ }
+ else
+ {
+ foreach (split ',', $list)
+ {
+ s/;.*$//;
+ $result .= " <$tag>".$self->transformData($_)."</$tag>\n";
+ }
+ }
+ return $result;
+ }
+
+ sub encodeImage
+ {
+ my ($self, $file) = @_;
+ my $image = GCUtils::getDisplayedImage($file, $self->{options}->{defaultImage}, $self->{original});
+ (my $suffix = $image) =~ s/.*?\.([^.]*)$/$1/;
+ $suffix = 'jpeg' if $suffix eq 'jpg';
+ open PIC, "<$image" or return (undef,undef,undef);
+ my $data = do {local $/; <PIC>};
+ close PIC;
+ my $pictureId = Digest::MD5::md5_hex($data).'.'.$suffix;
+ my %infos;
+ $infos{id} = $pictureId;
+ $infos{format} = uc $suffix;
+ $infos{width} = 120;
+ $infos{height} = 160;
+ $infos{data} = MIME::Base64::encode_base64($data);
+ return \%infos;
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+
+ my $methodName = 'get'.$self->{model}->getName.'Item';
+
+ return $self->$methodName($item);
+ }
+
+ sub getGCfilmsItem
+ {
+ my ($self, $movie, $number) = @_;
+ my $result;
+
+ #(my $synopsis = $movie->{synopsis}) =~ s/<br>/\n/gm;
+ #(my $comments = $movie->{comment}) =~ s/<br>/\n/gm;
+
+ use integer;
+ my $rating = $movie->{rating} / 2;
+ no integer;
+
+ my $age = $movie->{age};
+ my $certification;
+
+ if ($age == 1)
+ {
+ $certification = 'U (USA)';
+ }
+ elsif ($age == 2)
+ {
+ $certification = 'G (USA)';
+ }
+ elsif ($age <= 5)
+ {
+ $certification = 'PG (USA)';
+ }
+ elsif ($age <= 13)
+ {
+ $certification = 'PG-13 (USA)';
+ }
+ elsif ($age <= 17)
+ {
+ $certification = 'R (USA)';
+ }
+
+ my $imageInfos = $self->encodeImage($movie->{image});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($movie->{date});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($movie->{title}).'</title>
+ <medium>'.$self->transformData($movie->{format}).'</medium>
+ <year>'.$year.'</year>
+ <certification>'.$certification.'</certification>
+ <genres>
+';
+ $result .= $self->transformList($movie->{genre}, 'genre');
+ $result .= ' </genres>
+ <nationalitys>
+ <nationality>'.$self->transformData($movie->{country}).'</nationality>
+ </nationalitys>
+ <casts>
+';
+ foreach (split ',', $movie->{actors})
+ {
+ $result .= " <cast><column>".$self->transformData($_)."</column></cast>\n";
+ }
+ $result .= ' </casts>
+ <directors>
+ <director>'.$self->transformData($movie->{director}).'</director>
+ </directors>
+ <languages>
+';
+ $result .= $self->transformList($movie->{audio}, 'language');
+ $result .= ' </languages>
+ <running-time>'.$self->transformData($movie->{time}).'</running-time>
+ <plot>'.$self->transformData($movie->{synopsis}).'</plot>
+ <rating>'.$rating.'</rating>
+ <comments>'.$self->transformData($movie->{comments}).'</comments>
+';
+ if (($movie->{borrower}) && ($movie->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCgamesItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ use integer;
+ my $rating = $item->{rating} / 2;
+ no integer;
+
+ my $imageInfos = $self->encodeImage($item->{boxpic});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($item->{released});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{name}).'</title>
+ <platform>'.$self->transformData($item->{platform}).'</platform>
+ <description>'.$self->transformData($item->{description}).'</description>
+ <year>'.$year.'</year>
+ <pur_date>'.$self->transformData($item->{added}).'</pur_date>
+ <genres>
+';
+ $result .= $self->transformList($item->{genre}, 'genre');
+ $result .= ' </genres>
+ <publishers>
+ <publisher>'.$self->transformData($item->{editor}).'</publisher>
+ </publishers>
+ <rating>'.$rating.'</rating>
+';
+ if (($item->{borrower}) && ($item->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+ if ($item->{completion} >= 100)
+ {
+ $result .= ' <completed>true</completed>
+';
+ }
+
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCbooksItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ use integer;
+ my $rating = $item->{rating} / 2;
+ no integer;
+
+ my $imageInfos = $self->encodeImage($item->{cover});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($item->{publication});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{title}).'</title>
+ <isbn>'.$self->transformData($item->{isbn}).'</isbn>
+ <series>'.$self->transformData($item->{serie}).'</series>
+ <edition>'.$self->transformData($item->{edition}).'</edition>
+ <binding>'.$self->transformData($item->{format}).'</binding>
+ <comments>'.$self->transformData($item->{description}).'</comments>
+ <pages>'.$self->transformData($item->{pages}).'</pages>
+ <pur_date>'.$self->transformData($item->{acquisition}).'</pur_date>
+ <pub_year>'.$year.'</pub_year>
+ <publisher>'.$self->transformData($item->{publisher}).'</publisher>
+ <authors>
+';
+ $result .= $self->transformList($item->{authors}, 'author');
+ $result .= ' </authors>
+ <languages>
+';
+ $result .= $self->transformList($item->{language}, 'language');
+ $result .= ' </languages>
+ <genres>
+';
+ $result .= $self->transformList($item->{genre}, 'genre');
+ $result .= ' </genres>
+ <rating>'.$rating.'</rating>
+';
+ if (($item->{borrower}) && ($item->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+ if ($item->{read})
+ {
+ $result .= ' <read>true</read>
+';
+ }
+
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCmusicsItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ use integer;
+ my $rating = $item->{rating} / 2;
+ no integer;
+
+ my $imageInfos = $self->encodeImage($item->{cover});
+ $self->{imagesInfos}->{$imageInfos->{id}} = $imageInfos;
+
+ my $year = GCPreProcess::extractYear($item->{release});
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{title}).'</title>
+ <medium>'.$self->transformData($item->{format}).'</medium>
+ <year>'.$year.'</year>
+ <label>'.$self->transformData($item->{label}).'</label>
+ <comments>'.$self->transformData($item->{comment}).'</comments>
+ <artists>
+';
+ $result .= $self->transformList($item->{artist}, 'artist');
+ $result .= ' </artists>
+ <genres>
+';
+ $result .= $self->transformList($item->{genre}, 'genre');
+ $result .= ' </genres>
+ <rating>'.$rating.'</rating>
+ <tracks>';
+ foreach (@{$item->{tracks}})
+ {
+ $result .= '
+ <track>
+ <column>'.$self->transformData($_->[1]).'</column>
+ <column>'.$self->transformData($item->{artist}).'</column>
+ <column>'.$self->transformData($_->[2]).'</column>
+ </track>'
+ }
+ $result .= '
+ </tracks>
+';
+
+
+ if (($item->{borrower}) && ($item->{borrower} ne 'none'))
+ {
+ $result .= ' <loaned>true</loaned>
+';
+ }
+ $result .= ' <cover>'.$imageInfos->{id}.'</cover>
+';
+
+ $result .= ' </entry>
+';
+
+ return $result;
+ }
+
+ sub getGCcoinsItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result;
+
+ my $frontInfos = $self->encodeImage($item->{front});
+ $self->{imagesInfos}->{$frontInfos->{id}} = $frontInfos;
+ my $backInfos = $self->encodeImage($item->{back});
+ $self->{imagesInfos}->{$backInfos->{id}} = $backInfos;
+
+ $result = ' <entry>
+ <title>'.$self->transformData($item->{name}).'</title>
+ <type>'.$self->transformData($item->{currency}).'</type>
+ <denomination>'.$self->transformData($item->{value}).'</denomination>
+ <year>'.$self->transformData($item->{year}).'</year>
+ <country>'.$self->transformData($item->{country}).'</country>
+ <set>'.(($item->{type} eq 'coin') ? 'true' : 'false').'</set>
+ <pur_date>'.$self->transformData($item->{added}).'</pur_date>
+ <pur_price>'.$self->transformData($item->{estimate}).'</pur_price>
+ <location>'.$self->transformData($item->{location}).'</location>
+ <comments>'.$self->transformData($item->{comments}).'</comments>
+ <obverse>'.$frontInfos->{id}.'</obverse>
+ <reverse>'.$backInfos->{id}.'</reverse>
+ </entry>
+';
+ return $result;
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ $result = ' <images>
+';
+ foreach (values %{$self->{imagesInfos}})
+ {
+ $result .= ' <image id="'.$_->{id}.'" format="'.$_->{format}.
+ '" width="'.$_->{width}.'" height="'.$_->{height}.'">'.
+ $_->{data}.'</image>';
+ }
+ $result .=' </images>
+ </collection>
+</tellico>
+';
+
+ return $result;
+ }
+
+ # postProcess
+ # Called after all processing. Use it if you need to perform extra stuff on the header.
+ # $header is a reference to the header string.
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # Your code here
+ # As header is a reference, it can be modified on place with $$header
+ }
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExport/GCExportXML.pm b/lib/gcstar/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..57236ee
--- /dev/null
+++ b/lib/gcstar/GCExport/GCExportXML.pm
@@ -0,0 +1,287 @@
+package GCExport::GCExportXML;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ package GCExport::GCExporterXML;
+ use base qw(GCExport::GCExportBaseClass);
+
+ use File::Basename;
+ use GCUtils 'glob';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field) = @_;
+
+ $value = $self->SUPER::transformValue($value, $field);
+ $value =~ s/&(\W)/&amp;$1/g;
+ $value =~ s/"/&#34;/g;
+ #"
+ $value =~ s/'/&#39;/g;
+ #'
+ return $value;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "XML";
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+
+ return "";
+ }
+
+ sub needsUTF8
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ $self->{modelsFiles} = '';
+
+ if ($self->{model}->getName)
+ {
+ $self->{modelsDir} = $ENV{GCS_SHARE_DIR}.'/xml_models/'.$self->{model}->getName;
+ foreach (glob $self->{modelsDir}.'/*')
+ {
+ next if $_ =~ /\/CVS$/;
+ (my $mod = basename($_)) =~ s/_/ /g;
+ $self->{modelsFiles} .= ','.$mod;
+ }
+ }
+
+ return [
+ {
+ name => 'models',
+ type => 'options',
+ label => 'Models',
+ default => 'UseModel',
+ valuesList => 'UseModel,UseFile'.$self->{modelsFiles}
+ },
+
+ {
+ name => 'templatefile',
+ type => 'file',
+ label => 'ModelFile',
+ default => ''
+ },
+
+ {
+ name => 'model',
+ type => 'long text',
+ label => 'ModelText',
+ default => '',
+ height => 100
+ },
+
+ ];
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 1;
+ }
+
+ sub preProcess
+ {
+ my $self = shift;
+
+ my $model;
+
+ if ($self->{options}->{models} eq 'UseModel')
+ {
+ $model = $self->{options}->{model};
+ }
+ else
+ {
+ my $file;
+ if ($self->{options}->{models} eq 'UseFile')
+ {
+ $file = $self->{options}->{templatefile};
+ }
+ else
+ {
+ (my $fileName = $self->{options}->{models}) =~ s/ /_/g;
+ $file = $self->{modelsDir}.'/'.$fileName;
+ $file =~ s/"//g;
+ #"
+ }
+ open FILE, $file;
+ #Read full file
+ $model = do { local $/; <FILE> };
+ close FILE;
+ }
+ $model =~ m{
+ \[HEADER\]\n?(.*?)\n?\[\/HEADER\].*?
+ \[ITEM\]\n?(.*?)\n?\[\/ITEM\].*?
+ \[FOOTER\]\n?(.*?)\n?\[\/FOOTER\]
+ }xms;
+ $self->{header} = $1;
+ $self->{item} = $2;
+ $self->{footer} = $3;
+ return 1;
+ }
+
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result = $self->{header};
+
+ $result =~ s/\$\{file\}/$self->{options}->{collection}/g;
+ $result =~ s/\$\{number\}/$number/g;
+
+ return $result."\n";
+ }
+
+ sub getItem
+ {
+ my ($self, $item, $number) = @_;
+ my $result = $self->{item};
+
+ while ($result =~ m/\[LOOP\s+(.*?)\]\n?(.*?)\n\s*\[\/LOOP\]/gms)
+ {
+ my $values = $self->transformValue($item->{$1}, $1);
+ my $motif = $2;
+ my $string;
+ foreach my $value(split /,/, $values)
+ {
+ $value =~ s/^\s*//;
+ (my $line = $motif) =~ s/\$\$/$value/gms;
+ $string .= $line;
+ }
+ $result =~ s/(\n?)\s*\[LOOP\s+$1\].*?\[\/LOOP\]/$1$string/gms;
+ }
+
+ while ($result =~ m/\[SPLIT\s+value=(.*?)\s+sep=(.)\]\n?(.*?)\n\s*\[\/SPLIT\]/gms)
+ {
+ my $values = $1;
+ $values = $item->{$values} if exists $item->{$values};
+ $values = $self->transformValue($values, $1);
+ my $sep = ${2};
+ my $motif = ${3};
+ my $i = 0;
+ foreach my $value(split /$sep/, $values)
+ {
+ $value =~ s/^\s*//;
+ $motif =~ s/\$$i/$value/gms;
+ $i++;
+ }
+ do {$motif =~ s/\s*\$[0-9]+//mgs;};
+ $result =~ s/(\n?)\s*\[SPLIT\s+value=\Q$1\E\s+sep=($sep)\].*?\[\/SPLIT\]/$1$motif/gms;
+ }
+
+ foreach (keys %$item)
+ {
+ my $value = $self->transformValue($item->{$_}, $_);
+ $result =~ s/\$\{$_\}/$value/g;
+ }
+
+ if ($item->{time})
+ {
+ my $min = 0;
+ my $time = $item->{time};
+ $min = ($1 * 60) + $2 if ($time =~ /([0-9]*)h\.?\s+([0-9]*)m/)
+ || ($time =~ /([0-9]*):([0-9]*)/);
+ $min = $1 if !$min && ($time =~ /([0-9]*)/);
+ $result =~ s/\$\{length\}/$min/g;
+ }
+
+ if ($item->{date})
+ {
+ my $year = 0;
+ $item->{date} =~ /([0-9]{4})/;
+ $year = $1;
+ $result =~ s/\$\{year\}/$year/g;
+ }
+
+ $result =~ s/\$\{.*?\}//g;
+
+ return $result."\n";
+ }
+
+ sub getFooter
+ {
+ my $self = shift;
+ my $result = $self->{footer};
+
+ return $result."\n";
+ }
+
+ # postProcess
+ # Called after all processing. Use it if you need to perform extra stuff on the header.
+ # $header is a reference to the header string.
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # Your code here
+ # As header is a reference, it can be modified on place with $$header
+ }
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExportImport.pm b/lib/gcstar/GCExportImport.pm
new file mode 100644
index 0000000..b73cdd3
--- /dev/null
+++ b/lib/gcstar/GCExportImport.pm
@@ -0,0 +1,526 @@
+package GCExportImport;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+{
+ package GCExportImportBase;
+
+ sub setLangName
+ {
+ my ($self, $langName) = @_;
+
+ $self->{langName} = $langName;
+ }
+
+ sub getLang
+ {
+ my ($self) = @_;
+ if (! $self->{langContainer})
+ {
+ my $langFile = $self->{moduleName};
+ my %tmpLang;
+ eval "use GCLang::".$self->{langName}."::$langFile\n";
+ eval "%tmpLang = %GCLang::".$self->{langName}."::".$langFile."::lang";
+ $self->{langContainer} = \%tmpLang;
+ }
+ return $self->{langContainer};
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return $self->getLang->{Name};
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ }
+
+ sub checkModule
+ {
+ my ($self, $module, $version) = @_;
+
+ eval "use $module";
+ ($self->{errors} .= "$module\n", return 0) if $@;
+ return 1 if !defined $version;
+ no strict 'refs';
+ ($self->{errors} .= "$module\n", return 0)
+ if (${$module.'::VERSION'} < $version);
+ return 1;
+ }
+
+ sub checkOptionalModule
+ {
+ my ($self, $module, $version) = @_;
+ # Save errors
+ my $errors = $self->{errors};
+ my $code = $self->checkModule($module, $version);
+ # And restore them so it won't impact detecting if the module is broken
+ $self->{errors} = $errors;
+ return $code;
+ }
+
+ sub hideFileSelection
+ {
+ return 0;
+ }
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ (my $moduleName = $class) =~ s/(GC..port)er/$1/;
+
+ my $self = {moduleName => $moduleName,
+ errors => ''};
+ bless($self, $class);
+ return $self;
+ }
+}
+
+use GCDialogs;
+
+{
+ package GCExportImportDialog;
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+
+ $self->{optionsFrame}->hide if ! $self->{nbOptions};
+ if (($self->{type} eq 'export') && (! $self->{module}->wantsSort))
+ {
+ $self->{sorter}->hide;
+ $self->{sortLabel}->hide;
+ $self->{order}->hide;
+ $self->{orderLabel}->hide;
+ }
+
+ if ($self->{module}->hideFileSelection)
+ {
+ $self->{file}->hide;
+ $self->{labelFile}->hide;
+ }
+
+ $self->resize(1,1);
+ my $ok = 0;
+ while (!$ok)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ if (($self->{module}->wantsFieldsSelection)
+ && (scalar @{$self->{fields}} == 0))
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{ImportExportFieldsEmpty});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+ next;
+ }
+ my $file = $self->{file}->getValue;
+ if ($file || ! $self->{module}->wantsFileSelection)
+ {
+ my %options = $self->getOptions;
+ $self->addOptions(\%options);
+ $options{model} = $self->{parent}->{model};
+ $options{file} = $file;
+ $options{lang} = $self->{parent}->{lang};
+ $options{fields} = $self->{fields};
+ $options{fieldsInfo} = $self->{parent}->{model}->{fieldsInfo};
+ $options{originalList} = $self->{parent}->{items};
+ $options{parent} = $self->{parent};
+
+ my ($info, $type) = $self->{module}->process(\%options);
+ $type ||= 'info';
+ if ($info)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ $type,
+ 'ok',
+ $info);
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+ }
+ $self->{parent}->setNbItems;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{ImportExportFileEmpty});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+
+ next;
+ }
+ }
+ $ok = 1;
+ }
+ $self->hide;
+ }
+
+ sub setModule
+ {
+ my ($self, $module) = @_;
+ $self->set_title($self->{title}." [".$module->getName."]");
+ if ($module->wantsDirectorySelection)
+ {
+ $self->{labelFile}->set_label($self->{parent}->{lang}->{FileChooserDirectory});
+ $self->{file}->setTitle($self->{parent}->{lang}->{FileChooserOpenDirectory});
+ $self->{file}->setType('select-folder', 0);
+ }
+ else
+ {
+ $self->{labelFile}->set_label($self->{parent}->{lang}->{ImportExportFile});
+ $self->{file}->setTitle($self->{parent}->{lang}->{FileChooserOpenFile});
+ $self->{file}->setType($self->{fileType}, $self->{withFilter});
+ }
+ $self->{file}->setPatternFilter($module->getFilePatterns)
+ if ($self->{type} eq 'import');
+
+ $module->setModel($self->{parent}->{model});
+ # sorter will only be created for export modules.
+ # It's initialized with the title field
+ if ($self->{sorter})
+ {
+ $self->{sorter}->setModel($self->{parent}->{model});
+ $self->{sorter}->setValue($self->{parent}->{model}->{commonFields}->{title});
+ $self->{sorter}->setValue($module->{options}->{sorter})
+ if exists $module->{options};
+ }
+ if ($self->{order})
+ {
+ $self->{order}->setValue(0);
+ $self->{order}->setValue($module->{options}->{order})
+ if exists $module->{options};
+ }
+ foreach ($self->{optionsTable}->get_children)
+ {
+ $self->{optionsTable}->remove($_);
+ $_->destroy;
+ }
+ my @optionsList = @{$module->getOptions};
+ $self->{optionsTable}->resize($#optionsList + 1, 3)
+ if $#optionsList >= 0;
+
+ $self->{module} = $module;
+ my %options;
+ my $option;
+ my $row = 0;
+ my @widgetSignals;
+ foreach $option (@optionsList)
+ {
+ my $label = $module->getLang->{$option->{label}};
+ if (!$label)
+ {
+ if ($self->{parent}->{model})
+ {
+ $label = $self->{parent}->{model}->getDisplayedText($option->{label});
+ }
+ else
+ {
+ $label = $self->{parent}->{lang}->{$option->{label}};
+ }
+ }
+ my $widget;
+ my @vExpand = ('fill');
+ my $type = $option->{type};
+ my $value = ((exists $module->{options}) ? $module->{options}->{$option->{name}} : $option->{default});
+ if ($type eq 'yesno')
+ {
+ $widget = new GCCheckBox($label);
+ $self->{optionsTable}->attach($widget, 0, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ if ($option->{changedCallback})
+ {
+ $widget->signal_connect('toggled' => $option->{changedCallback}, [$self,$widget]);
+ push @widgetSignals, [$widget, 'toggled'];
+ }
+ }
+ elsif ( ($type eq 'short text') ||
+ ($type eq 'long text') ||
+ ($type eq 'number') ||
+ ($type eq 'options') ||
+ ($type eq 'file') ||
+ ($type eq 'history text'))
+ {
+ my $labelWidget = GCLabel->new($label);
+ $self->{optionsTable}->attach($labelWidget, 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+
+ if ($type eq 'short text')
+ {
+ $widget = new GCShortText;
+ }
+ elsif ($type eq 'long text')
+ {
+ $widget = new GCLongText;
+ $widget->set_size_request(-1,$option->{height});
+ push @vExpand, 'expand';
+ }
+ elsif ($type eq 'number')
+ {
+ $widget = new GCNumeric($value, $option->{min}, $option->{max}, $option->{step});
+
+ }
+ elsif ($type eq 'file')
+ {
+ $widget = new GCFile($self, $label, 'open');
+ }
+ elsif ($type eq 'options')
+ {
+ $widget = new GCMenuList;
+ my @valuesList;
+ if (UNIVERSAL::isa( $option->{valuesList}, "HASH" ))
+ {
+ foreach $value(keys %{$option->{valuesList}})
+ {
+ my $item = {
+ value => $value,
+ displayed => $option->{valuesList}->{$value}
+ };
+ $item->{displayed} = $module->getLang->{$item->{displayed}}
+ if ($module->getLang->{$item->{displayed}});
+ push @valuesList, $item;
+ }
+ }
+ else
+ {
+ my @values;
+ @values=split m/,/,$option->{valuesList} if(scalar($option->{valuesList}));
+ @values=@{$option->{valuesList}} if (UNIVERSAL::isa( $option->{valuesList}, "ARRAY" ));
+ foreach $value(@values)
+ {
+ my $item = {
+ value => $value,
+ displayed => $value
+ };
+ $item->{displayed} = $module->getLang->{$item->{displayed}}
+ if ($module->getLang->{$item->{displayed}});
+ push @valuesList, $item;
+ }
+ }
+ $widget->setValues(\@valuesList);
+ if ($option->{changedCallback})
+ {
+ $widget->signal_connect('changed' => $option->{changedCallback}, [$self,$widget]);
+ push @widgetSignals, [$widget, 'changed'];
+ }
+ }
+ elsif ($type eq 'history text')
+ {
+ $widget = new GCHistoryText;
+ my @initValues = @{$option->{initValues}} if $option->{initValues};
+ $widget->setValues(\@initValues);
+ }
+ if ($option->{changedCallback})
+ {
+ $widget->signal_connect('changed' => $option->{changedCallback}, [$self,$widget]);
+ push @widgetSignals, [$widget, 'changed'];
+ }
+ if ($option->{buttonLabel})
+ {
+ my $button = Gtk2::Button->new($module->getLang->{$option->{buttonLabel}});
+ $button->signal_connect('clicked' => $option->{buttonCallback}, [$self,$widget]);
+ $self->{optionsTable}->attach($button, 2, 3, $row, $row + 1, 'fill', 'fill', 0, 0);
+ }
+ $self->{optionsTable}->attach($widget, 1, 2, $row, $row + 1, ['expand', 'fill'], \@vExpand, 0, 0);
+ }
+# elsif ($type eq 'colorSelection')
+# {
+# $widget = new Gtk2::HBox(0,0);
+# $widget->pack_start(new Gtk2::Label($label), 0,0,0);
+# my $entry = new Gtk2::Entry;
+# $entry->set_text($value);
+# $widget->pack_start($entry, 1,1,5);
+#
+# my $button = Gtk2::Button->new_from_stock('gtk-select-color');
+# $button->signal_connect('clicked' => sub {
+# my $dialog = new Gtk2::ColorSelectionDialog($label);
+# my $previous = Gtk2::Gdk::Color->parse($entry->get_text);
+# $dialog->colorsel->set_current_color($previous) if $previous;
+# my $response = $dialog->run;
+# if ($response eq 'ok')
+# {
+# my $color = $dialog->colorsel->get_current_color;
+# my $red = $color->red / 257;
+# my $blue = $color->blue / 257;
+# my $green = $color->green / 257;
+# my $colorString = sprintf ("#%X%X%X", $red, $blue, $green);
+# $entry->set_text($colorString);
+# }
+# $dialog->destroy;
+# });
+# $widget->pack_start($button, 0,0,0);
+# }
+ $widget->set_sensitive(0) if $option->{insensitive};
+ $widget->setValue($value);
+ $self->{parent}->{tooltips}->set_tip($widget,
+ $module->getLang->{$option->{tooltip}})
+ if $option->{tooltip};
+ $options{$option->{name}} = $widget;
+ $row++;
+ }
+
+ $options{withPictures} = new GCCheckBox($self->{parent}->{lang}->{ExportWithPictures});
+ if ($module->wantsImagesSelection)
+ {
+ $self->{optionsTable}->resize($row, 3);
+ my $value = ((exists $module->{options}) ? $module->{options}->{withPictures} : 1);
+ $options{withPictures}->set_active($value);
+ $self->{optionsTable}->attach($options{withPictures}, 0, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $row++;
+ $options{withPictures}->show;
+ }
+ else
+ {
+ $options{withPictures}->set_active(0);
+ }
+
+ if ($module->wantsFieldsSelection)
+ {
+ $self->{optionsTable}->resize($row, 3);
+ $self->{fieldsSelection} = new Gtk2::Button($self->{fieldsButtonLabel});
+ $self->{parent}->{tooltips}->set_tip($self->{fieldsSelection},
+ $self->{fieldsTip});
+ $self->{optionsTable}->attach($self->{fieldsSelection},
+ 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $self->{fieldsSelection}->signal_connect('clicked' => sub {
+ $self->{fields} = $self->{fieldsDialog}->getSelectedIds
+ if $self->{fieldsDialog}->show;
+ });
+ $row++;
+ }
+
+ $self->{nbOptions} = $row;
+ $self->{options} = \%options;
+ $self->{optionsFrame}->show_all;
+ foreach my $pair(@widgetSignals)
+ {
+ $pair->[0]->signal_emit($pair->[1])
+ }
+
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my %result;
+
+ foreach (keys %{$self->{options}})
+ {
+ my $value;
+ my $widget = $self->{options}->{$_};
+ $result{$_} = $widget->getValue;
+ }
+
+ return %result;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $type) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $okLabel;
+ #$okLabel = $parent->{lang}->{'Menu'.ucfirst($type)};
+ $okLabel = ($type eq 'import') ? 'gtk-convert' : 'gtk-revert-to-saved';
+ $okLabel =~ s/_//g;
+
+ my $self = $class->SUPER::new($parent,
+ $title,
+ $okLabel
+ );
+
+ $self->{parent} = $parent;
+ $self->{title} = $title;
+ $self->{lang} = $parent->{lang};
+ $self->{fields} = [];
+ $self->{type} = $type;
+
+ $self->{optionsFrame} = new GCGroup($parent->{lang}->{OptionsTitle});
+ $self->{optionsTable} = new Gtk2::Table(0,3);
+ $self->{optionsTable}->set_border_width($GCUtils::halfMargin);
+ $self->{optionsTable}->set_col_spacings($GCUtils::margin);
+ $self->{optionsTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{optionsFrame}->addWidget($self->{optionsTable});
+
+ #$self->{fileVbox} = new Gtk2::VBox(0,0);
+
+ #my $sep = new Gtk2::HSeparator;
+ #my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{dataFrame} = new GCGroup($parent->{lang}->{ImportExportData});
+ $self->{dataTable} = new Gtk2::Table(1,2);
+ $self->{dataTable}->set_border_width($GCUtils::halfMargin);
+ $self->{dataTable}->set_col_spacings($GCUtils::margin);
+ $self->{dataTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{dataFrame}->addWidget($self->{dataTable});
+
+ $self->{labelFile} = new GCLabel($parent->{lang}->{ImportExportFile});
+ #$hbox->pack_start($labelFile,0,0,5);
+
+ $self->{fileType} = ($type eq 'import') ? 'open' : 'save';
+ $self->{withFilter} = ($self->{type} eq 'import') ? 1 : 0;
+ $self->{file} = new GCFile($self,
+ $parent->{lang}->{FileChooserOpenFile},
+ $self->{fileType},
+ $self->{withFilter});
+
+ #$hbox->pack_start($self->{file},1,1,5);
+
+ #$self->{fileVbox}->pack_start($sep, 0, 0, 2);
+ #$self->{fileVbox}->pack_start($hbox, 0, 0, 10);
+
+ $self->vbox->set_homogeneous(0);
+ $self->vbox->pack_start($self->{optionsFrame},1,1,0);
+ $self->vbox->pack_start($self->{dataFrame},0,0,0);
+ #$self->vbox->pack_start($self->{fileVbox}, 0, 0, 0);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCExtract.pm b/lib/gcstar/GCExtract.pm
new file mode 100644
index 0000000..fb0c251
--- /dev/null
+++ b/lib/gcstar/GCExtract.pm
@@ -0,0 +1,150 @@
+package GCExtract;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCExtractDialog;
+
+ use base qw 'Gtk2::Dialog';
+
+ sub show
+ {
+ my $self = shift;
+ return if $self->{cancelled};
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ foreach (@{$self->{extractedArray}})
+ {
+ $self->{info}->{$_} = ''
+ if (! $self->{$_.'Cb'}->get_active);
+ $self->{panel}->$_($self->{info}->{$_}->{value})
+ if $self->{info}->{$_} && $self->{info}->{$_}->{value};
+ }
+ }
+ $self->hide;
+ }
+
+ sub setInfo
+ {
+ my ($self, $infoExtractor, $panel) = @_;
+ my $info = $infoExtractor->getInfo;
+ if (!defined $info)
+ {
+ $self->{cancelled} = 1;
+ return;
+ }
+ $self->{cancelled} = 0;
+ ($self->{info}, $self->{panel}) = ($info, $panel);
+ foreach (@{$self->{extractedArray}})
+ {
+ next if ! $self->{$_};
+ if ($info->{$_})
+ {
+ $self->{$_}->set_text($info->{$_}->{displayed});
+ $self->{$_}->set_selectable(1);
+ }
+ else
+ {
+ $self->{$_}->set_text('-');
+ $self->{$_}->set_selectable(0);
+ }
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model, $infoExtractor) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{ExtractTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ 'gtk-cancel' => 'cancel'
+ );
+ bless($self, $class);
+
+ $self->{extractedArray} = $infoExtractor->getFields;
+ #['length', 'size', 'type', 'audioEncoding'];
+
+ my $table = new Gtk2::Table(4,2);
+ $table->set_col_spacings(10);
+ $table->set_row_spacings(10);
+ $table->set_border_width(10);
+
+ my $i = 0;
+ foreach (@{$self->{extractedArray}})
+ {
+ (my $capsField = $_) =~ s/^(.)/\U$1\E/;
+ $self->{$_.'Cb'} = new Gtk2::CheckButton($model->getDisplayedLabel($_).$parent->{lang}->{Separator});
+ $self->{$_.'Cb'}->set_active(1);
+ $self->{$_} = new Gtk2::Label;
+ $table->attach($self->{$_.'Cb'}, 0, 1, $i, $i+1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{$_}, 1, 2, $i, $i+1, 'fill', 'fill', 0, 0);
+ $i++;
+ }
+
+ $self->vbox->pack_start($table,1,1,0);
+
+ $self->{importButton} = new Gtk2::Button($parent->{lang}->{ExtractImport});
+ $self->add_action_widget($self->{importButton}, 'ok');
+
+ $self->{parent} = $parent;
+ return $self;
+ }
+}
+
+use GCExportImport;
+
+{
+ package GCItemExtracter;
+ use base 'GCExportImportBase';
+
+ sub getInfo
+ {
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $fileName, $panel, $model) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $fileSize = -s $fileName;
+
+ my $self = {fileName => $fileName,
+ fileSize => $fileSize,
+ parent => $parent,
+ panel => $panel,
+ model => $model};
+
+ bless($self, $class);
+
+ return $self;
+ }
+}
+
+
+1;
diff --git a/lib/gcstar/GCExtract/GCExtractFilms.pm b/lib/gcstar/GCExtract/GCExtractFilms.pm
new file mode 100644
index 0000000..fbcd9f5
--- /dev/null
+++ b/lib/gcstar/GCExtract/GCExtractFilms.pm
@@ -0,0 +1,476 @@
+package GCExtract::GCExtractFilms;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExtract;
+
+{
+ package GCExtract::GCfilmsExtracter;
+ use base 'GCItemExtracter';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(@_);
+ bless ($self, $class);
+
+ return $self;
+ }
+
+ sub readInt
+ {
+ my ($self, $size) = @_;
+ my $buf;
+
+ $size = 4 if !$size;
+
+ read $self->{file},$buf,$size;
+ return unpack "i",$buf;
+ }
+
+ sub getAviInfo
+ {
+ my $self = shift;
+
+ my $info = {};
+
+ my @audioCodecs;
+ $audioCodecs[0x0001] = 'PCM';
+ $audioCodecs[0x0002] = 'ADPCM';
+ $audioCodecs[0x0030] = 'Dolby AC2';
+ $audioCodecs[0x0050] = 'MPEG';
+ $audioCodecs[0x0055] = 'MP3';
+ $audioCodecs[0x0092] = 'Dolby AC3 SPDIF';
+ $audioCodecs[0x2000] = 'Dolby AC3';
+ $audioCodecs[0x2001] = 'Dolby DTS';
+ $audioCodecs[0x2002] = 'WAVE';
+ $audioCodecs[0x2003] = 'WAVE';
+ $audioCodecs[0x2004] = 'WAVE';
+ $audioCodecs[0x2005] = 'WAVE';
+ $audioCodecs[0x674F] = 'Ogg Vorbis',
+ $audioCodecs[0x6750] = 'Ogg Vorbis',
+ $audioCodecs[0x6751] = 'Ogg Vorbis',
+ $audioCodecs[0x676F] = 'Ogg Vorbis',
+ $audioCodecs[0x6770] = 'Ogg Vorbis',
+ $audioCodecs[0x6771] = 'Ogg Vorbis',
+
+ my $chunkName;
+ seek $self->{file},8,0;
+ read $self->{file},$chunkName,8;
+ return $info if ($chunkName ne 'AVI LIST');
+ seek $self->{file},4,1;
+ read $self->{file},$chunkName,8;
+
+ $self->readInt;
+ my $dwMicroSecPerFrame = $self->readInt;
+ my $dwMaxBytesPerSec = $self->readInt;
+ my $dwReserved1 = $self->readInt;
+ my $dwFlags = $self->readInt;
+ my $dwTotalFrames = $self->readInt;
+ my $dwInitialFrames = $self->readInt;
+ my $dwStreams = $self->readInt;
+ my $dwSuggestedBufferSize = $self->readInt;
+ $info->{width} = $self->readInt;
+ $info->{height} = $self->readInt;
+ my $dwScale = $self->readInt;
+ my $dwRate = $self->readInt;
+ my $dwStart = $self->readInt;
+ my $dwLength = $self->readInt;
+
+ $info->{length} = ($dwTotalFrames * $dwMicroSecPerFrame) / 60000000;
+ $info->{length} = GCUtils::round($info->{length});
+
+ my $buff;
+ my ($gotVids, $gotAuds) = (0,0);
+ while (! eof($self->{file}))
+ {
+ read $self->{file},$chunkName,4;
+ if ($chunkName eq 'strl')
+ {
+ seek $self->{file},8,1;
+ read $self->{file},$buff,4;
+ if ($buff eq 'vids')
+ {
+ read $self->{file},$info->{type},4;
+ $gotVids = 1;
+ }
+ elsif ($buff eq 'auds')
+ {
+ read $self->{file},$info->{audioEncoding},4;
+ $info->{audioEncoding} =~ s/^.*?\w*\W*?$/$1/g;
+ if (!$info->{audioEncoding})
+ {
+ read $self->{file},$chunkName,4 while ($chunkName ne 'strf');
+ seek $self->{file},4,1;
+ my $codec;
+ read $self->{file}, $codec, 2;
+ $codec = unpack "v",$codec;
+ $codec = $audioCodecs[$codec];
+ seek $self->{file}, 2, 1;
+ my $hz = $self->readInt;
+ $info->{audioEncoding} = $codec if $codec;
+ $info->{audioEncoding} .= " ($hz Hz)" if $hz;
+ }
+ $gotAuds = 1;
+ }
+ last if $gotVids && $gotAuds;
+ }
+ last if ($chunkName eq 'movi');
+ }
+
+ return {} if ($buff ne 'vids') && ($buff ne 'auds');
+
+ return $info;
+ }
+
+ sub getMovAtom
+ {
+ my ($self, $wanted, $subAtom) = @_;
+
+ my $copy = $subAtom;
+
+ my ($header, $type, $length);
+ my $atom = 0;
+
+ if ($subAtom)
+ {
+ while ($copy)
+ {
+ $header = substr($copy, 0, 8, '');
+ ($length, $type) = unpack("Na4", $header);
+ last if $type eq $wanted;
+ substr($copy, 0 , $length - 8, '');
+ }
+ if ($copy)
+ {
+ $atom = substr($copy, 0 , $length - 8, '');
+ }
+ }
+ else
+ {
+ while (!eof ($self->{file}))
+ {
+ read $self->{file}, $header, 8;
+ ($length, $type) = unpack("Na4", $header);
+ last if $type eq $wanted;
+ seek $self->{file},$length - 8, 1;
+ }
+ if ($self->{file})
+ {
+ read $self->{file}, $atom, $length - 8;
+ }
+ }
+
+ return $atom;
+ }
+
+ sub getMovInfo
+ {
+ #Inspired from Video::Info::Quicktime_PL
+
+ my $self = shift;
+
+ my $info = {};
+
+ seek $self->{file},0,0;
+
+ my $header;
+
+ my $atom = $self->getMovAtom('moov');
+
+
+ if ($atom)
+ {
+ while (length($atom) > 0)
+ {
+ my ($sublen) = unpack("Na4", substr( $atom, 0, 4, '') );
+ my ($subatom) = substr($atom, 0, $sublen-4, '');
+ my($type) = substr($subatom, 0, 4, '');
+
+ if ($type eq 'mvhd')
+ {
+ my $timeScale = unpack( "Na4", substr($subatom,12,4));
+ my $duration = unpack( "Na4", substr($subatom,16,4));
+ $info->{length} = GCUtils::round($duration / ($timeScale * 60));
+ }
+ elsif ($type eq 'trak')
+ {
+ my $tkhd = $self->getMovAtom('tkhd', $subatom);
+ my $mdia = $self->getMovAtom('mdia', $subatom);
+ next if !$mdia;
+ my $minf = $self->getMovAtom('minf', $mdia);
+ next if !$minf;
+ my $vmhd = $self->getMovAtom('vmhd', $minf);
+ my $smhd = $self->getMovAtom('smhd', $minf);
+ if ($vmhd || $smhd)
+ {
+ my $stbl = $self->getMovAtom('stbl', $minf);
+ my $stsd = $self->getMovAtom('stsd', $stbl);
+
+ if ($vmhd)
+ {
+ my $width = unpack("Na4", substr($tkhd,74,4));
+ my $height = unpack("Na4", substr($tkhd,78,4));
+ ($info->{width}, $info->{height}) = ($width, $height);
+ ($info->{type} = substr($stsd,12,8)) =~ s/\W(.*?)\W/$1/g;
+ }
+ else
+ {
+ ($info->{audioEncoding}= substr($stsd,12,8)) =~ s/\W(.*?)\W/$1/g;
+ }
+ }
+ }
+ }
+ }
+ return $info;
+ }
+
+ sub getMpgInfo
+ {
+ #Inspired from MPEG::Info
+
+ my $self = shift;
+
+ my @frameRates = (
+ 0,
+ 24000/1001,
+ 24,
+ 25,
+ 30000/1001,
+ 30,
+ 50,
+ 60000/1001,
+ 60,
+ );
+
+ my $info = {};
+ $info->{type} = 'MPEG';
+ $info->{audioEncoding} = 'MPEG';
+
+ my $magic;
+ my $numMagic = unpack("N",$self->{magic});
+ while (!eof($self->{file}) && $numMagic != 0x000001b3)
+ {
+ read $self->{file},$magic,4;
+ $numMagic = unpack("N",$magic);
+ seek $self->{file},-3, 1;
+ }
+ seek $self->{file},3, 1;
+ my $size;
+ read $self->{file},$size,3;
+
+ $info->{width} = ((unpack "n",substr($size,0,2)) >> 4);
+ $info->{height} = ((unpack "n",substr($size,1,2)) & 0x0fff);
+
+ my $fps;
+ read $self->{file},$fps,1;
+ $fps = $frameRates[ord($fps) & 0x0f];
+
+ my ($buff1, $buff2);
+ read $self->{file}, $buff1, 2;
+ $buff1 = unpack 'n', $buff1;
+ $buff1 <<= 2;
+ read $self->{file}, $buff2, 1;
+ $buff2 = unpack 'C', $buff2;
+ $buff2 >>=6;
+ my $bitRate = ( ( $buff1 | $buff2 ) * 400);
+
+ $info->{length} = GCUtils::round((($self->{fileSize} * 8 ) / $bitRate) / 60) if $bitRate;
+
+ return $info;
+ }
+
+ sub findOgmPage
+ {
+ #Inspired from Ogg::Vorbis::Header::PurePerl
+
+ my $self = shift;
+ my $char;
+ my $curStr = '';
+
+ my $i = 0;
+ while (read($self->{file}, $char, 1))
+ {
+ $curStr = $char . $curStr;
+ $curStr = substr($curStr, 0, 4);
+ if ($curStr eq 'SggO')
+ {
+ seek $self->{file}, 8, 1;
+ my $serial = $self->readInt(4);
+ return $serial;
+ }
+ }
+ return -1;
+ }
+
+ sub findLastOgmPage
+ {
+ my $self = shift;
+ my $buff;
+ my $curStr = '';
+
+ seek $self->{file}, -5, 2;
+
+ my $i = 0;
+ while (read($self->{file}, $buff, 4))
+ {
+ if ($buff eq 'OggS')
+ {
+ seek $self->{file}, 2, 1;
+ my $granulePos = $self->readInt;
+ return $granulePos;
+ }
+ seek $self->{file}, -5, 1;
+ }
+ return -1;
+ }
+
+ sub getOgmInfo
+ {
+ my $info = {};
+ my $self = shift;
+
+ my $buff;
+ my ($gotAudio, $gotVideo) = (0,0);
+ seek $self->{file}, 0, 0;
+ my $serial = 0;
+ my $videoSerial = -1;
+ my $fps;
+ my $iteration = 0;
+ while ($serial != -1)
+ {
+ $serial = $self->findOgmPage;
+
+ seek $self->{file}, 13, 1;
+ read $self->{file}, $buff, 8;
+ if ($buff =~ /^video/)
+ {
+ read $self->{file}, $info->{type}, 4;
+ my $size = $self->readInt;
+ my $timeUnit = $self->readInt(8);
+ my $spu = $self->readInt(8);
+ $fps = (10000000.0 * $spu) / $timeUnit;
+ my $defaultLen = $self->readInt;
+ my $bufferSize = $self->readInt;
+ my $bbp = $self->readInt;
+ $info->{width} = $self->readInt;
+ $info->{height} = $self->readInt;
+
+ $gotVideo = 1;
+ $videoSerial = $serial;
+ }
+ elsif ($buff =~ /vorbis/)
+ {
+ $info->{audioEncoding} = 'Vorbis';
+ seek $self->{file}, 3, 1;
+ my $hz = $self->readInt;
+ $info->{audioEncoding} .= " ($hz Hz)" if $hz;
+ $gotAudio = 1;
+ }
+ else
+ {
+ last if $iteration > 5;
+ }
+ last if $gotAudio && $gotVideo;
+ $iteration++;
+ }
+ if ($gotVideo)
+ {
+ my $biggestGranulePos = $self->findLastOgmPage;
+ $info->{length} = GCUtils::round(($biggestGranulePos / $fps) / 60);
+ }
+
+ return $info;
+ }
+
+ sub getInfo
+ {
+ my $self = shift;
+
+ open FILE, '<'.$self->{fileName};
+ binmode FILE;
+
+ my $info = {};
+
+ $self->{file} = \*FILE;
+ my $magic;
+ $self->{magic} = $magic;
+ read FILE,$magic,4;
+ my $numMagic = unpack("N",$magic);
+
+ if ($magic eq 'RIFF')
+ {
+ $info = $self->getAviInfo;
+ }
+ elsif ($magic eq 'OggS')
+ {
+ $info = $self->getOgmInfo;
+ }
+ elsif (($numMagic == 0x000001ba) || ($numMagic == 0x000001b3))
+ {
+ $info = $self->getMpgInfo;
+ }
+ else
+ {
+ my $magic2;
+ read FILE,$magic2,4;
+ if ($magic2 =~ /(moov|notp|wide|ftyp)/)
+ {
+ $info = $self->getMovInfo;
+ }
+ }
+
+ close FILE;
+ my $result;
+
+ $result->{time} = {displayed => $info->{length}, value => $info->{length}};
+ $result->{video} = {displayed => $info->{type}, value => $info->{type}};
+ my $currentAudio = $self->{panel}->audio;
+ if ($info->{audioEncoding})
+ {
+ $currentAudio->[0]->[1] = $info->{audioEncoding};
+ $result->{audio}->{value} = $currentAudio;
+ $result->{audio}->{displayed} = $info->{audioEncoding};
+ }
+ if ($info->{width} && $info->{height})
+ {
+ my $comment = $self->{panel}->comment;
+ $comment .= "\n" if $comment && ($comment !~ /\n$/m);
+ $result->{comment}->{displayed} =
+ $self->{model}->getDisplayedText('ExtractSize').$self->{parent}->{lang}->{Separator}.
+ $info->{width}.'*'.$info->{height};
+ $result->{comment}->{value} = $comment . $result->{comment}->{displayed};
+ }
+
+ return $result;
+ }
+
+ sub getFields
+ {
+ return ['time', 'video', 'audio', 'comment'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCExtract/GCExtractMusics.pm b/lib/gcstar/GCExtract/GCExtractMusics.pm
new file mode 100644
index 0000000..1a56b68
--- /dev/null
+++ b/lib/gcstar/GCExtract/GCExtractMusics.pm
@@ -0,0 +1,370 @@
+package GCExtract::GCExtractMusics;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExtract;
+
+use GCDialogs;
+{
+ package GCExtractMusicsResultsDialog;
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ my $response = $self->run;
+ my $idx = ($self->{results}->get_selected_indices)[0];
+ $self->hide;
+ return -1 if $response ne 'ok';
+ return $idx;
+ }
+
+ sub setData
+ {
+ my ($self, @cddbData) = @_;
+ my @listData;
+ foreach(@cddbData)
+ {
+ push @listData, [$_->{genre}, $_->title, $_->artist, $_->year];
+ }
+ @{$self->{results}->{data}} = @listData;
+ $self->{results}->select(0);
+ $self->{results}->columns_autosize;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $model->getDisplayedText('ResultsDialog'));
+ $self->{parent} = $parent;
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{results} = new Gtk2::SimpleList(
+ $model->getDisplayedText('Genre') => 'text',
+ $model->getDisplayedText('Title') => 'text',
+ $model->getDisplayedText('Artist') => 'text',
+ $model->getDisplayedText('Release') => 'text',
+ );
+
+ $self->{results}->set_rules_hint(1);
+ $self->{results}->set_headers_clickable(1);
+ for my $i (0..3)
+ {
+ my $column = $self->{results}->get_column($i);
+ $column->set_resizable(1);
+ $column->set_sort_column_id($i);
+ }
+ $self->{results}->signal_connect(row_activated => sub {
+ $self->response('ok');
+ });
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width($GCUtils::margin);
+ $scrollPanelList->add($self->{results});
+
+ $self->vbox->pack_start($scrollPanelList,1,1,0);
+
+ $self->set_default_size(-1,300);
+ return $self;
+ }
+}
+
+{
+ package GCExtract::GCmusicsExtracter;
+ use base 'GCItemExtracter';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(@_);
+ bless ($self, $class);
+
+ $self->{hasMP3Info} = $self->checkModule('MP3::Info');
+ $self->{hasMP3Tag} = $self->checkModule('MP3::Tag');
+ $self->{hasOggVorbisHeader} = $self->checkModule('Ogg::Vorbis::Header::PurePerl');
+ $self->{hasNetFreeDB} = $self->checkModule('Net::FreeDB');
+ # Even if previous check fails, we want to use it for tracks feature
+ $self->{errors} = 0;
+
+ $self->{fields} = ['title', 'artist', 'release', 'genre', 'running', 'tracks'];
+ return $self;
+ }
+
+ sub resetTracks
+ {
+ my $self = shift;
+ $self->{tracks} = [];
+ $self->{totalTime} = 0;
+ $self->{currentTrack} = 0;
+ $self->{firstTrack} = '';
+ }
+
+ sub addTrack
+ {
+ my ($self, $title, $time, $number) = @_;
+ $self->{currentTrack}++;
+ $self->{totalTime} += $time;
+ $number = $self->{currentTrack} if !defined $number;
+ push @{$self->{tracks}},
+ [$number, $title, $self->secondsToString($time)];
+ }
+
+ sub getTracks
+ {
+ my $self = shift;
+ return $self->{tracks};
+ }
+
+ sub secondsToString
+ {
+ my ($self, $time) = @_;
+ return int($time / 60) .':'. sprintf '%02d', ($time %60);
+ }
+
+ sub getTotalTime
+ {
+ my $self = shift;
+ return $self->secondsToString($self->{totalTime});
+ }
+
+ sub getM3UInfo
+ {
+ my ($self) = @_;
+ my $file = $self->{file};
+ my $info = {};
+ while (<$file>)
+ {
+ chomp;
+ s/\r//;
+ if (/^#/)
+ {
+ next if ! /^#EXTINF:(.*)/;
+ my @values = split /,/, $1;
+ $self->addTrack($values[1], $values[0]);
+ }
+ else
+ {
+ $self->{firstTrack} = $_
+ if !$self->{firstTrack};
+ }
+ }
+ $info->{tracks} = $self->getTracks;
+ $info->{running} = $self->getTotalTime;
+ return $info;
+ }
+
+ sub getPLSInfo
+ {
+ my ($self) = @_;
+ my $file = $self->{file};
+ my $info = {};
+ my @tracks;
+ while (<$file>)
+ {
+ chomp;
+ s/\r//;
+ next if ! /(File|Title|Length)(\d+)=(.*)$/;
+ $tracks[$2]->{$1} = $3;
+ $tracks[$2]->{Number} = $2;
+ }
+ foreach (@tracks)
+ {
+ next if !$_->{Title};
+ $self->addTrack($_->{Title}, $_->{Length}, $_->{Number});
+ }
+
+ $info->{tracks} = $self->getTracks;
+ $info->{running} = $self->getTotalTime;
+ $self->{firstTrack} = $tracks[1]->{File};
+ return $info;
+ }
+
+ sub getFreeDB
+ {
+ my @genres = qw(blues classical country data folk jazz newage reggae rock soundtrack misc);
+ my ($self) = @_;
+ my $file = $self->{fileName};
+ my $info = {};
+ return $info if ! -e $file;
+ return $info if ! $self->{hasNetFreeDB};
+
+ my $freedb = Net::FreeDB->new;
+ my $discdata = $freedb->getdiscdata($file);
+ return if !$discdata;
+ my $cddb_file_object;
+ my @results;
+
+ foreach (@genres)
+ {
+ my $tmpCddb = $freedb->read($_, $discdata->{ID});
+ if ($tmpCddb)
+ {
+ $tmpCddb->{genre} = $tmpCddb->genre || $_;
+ push @results, $tmpCddb;
+ }
+ }
+
+ if ($#results == -1)
+ {
+ return;
+ }
+ elsif ($#results == 0)
+ {
+ $cddb_file_object = $results[0];
+ }
+ else
+ {
+ my $dialog = new GCExtractMusicsResultsDialog(
+ $self->{parent},
+ $self->{model}
+ );
+ $dialog->setData(@results);
+ my $selected = $dialog->show;
+ $dialog->destroy;
+ return if $selected == -1;
+ $cddb_file_object = $results[$selected];
+ }
+
+ foreach my $track ($cddb_file_object->tracks)
+ {
+ $self ->addTrack($track->title,$track->length,$track->number);
+ }
+
+ $info->{tracks} = $self->getTracks;
+ $info->{running} = $self->getTotalTime;
+ $info->{title} = $cddb_file_object->title;
+ $info->{artist} = $cddb_file_object->artist;
+ $info->{release} = $cddb_file_object->year;
+ $info->{genre} = $cddb_file_object->{genre};
+
+ return $info;
+ }
+
+ sub addFirstTrackInfo
+ {
+ my ($self, $info) = @_;
+
+ if ($^O =~ /win32/i)
+ {
+ $self->{firstTrack} =~ s|\\|/|g;
+ $self->{fileName} =~ /^(.{2})/;
+ my $drive = $1;
+ $self->{firstTrack} = $drive.$self->{firstTrack}
+ if $self->{firstTrack} =~ m|^/|;
+ }
+
+ if ($self->{firstTrack} =~ /mp3$/i)
+ {
+ if ($self->{hasMP3Info})
+ {
+ MP3::Info::use_mp3_utf8(1);
+ my $song = MP3::Info::get_mp3tag($self->{firstTrack});
+ $info->{title} = $song->{ALBUM};
+ $info->{artist} = $song->{ARTIST};
+ $info->{release} = $song->{YEAR};
+ $info->{genre} = $song->{GENRE};
+ }
+ elsif ($self->{hasMP3Tag})
+ {
+ my $song = MP3::Tag->new($self->{firstTrack});
+ (undef, undef, $info->{artist}, $info->{title}) = $song->autoinfo;
+ }
+ }
+ elsif ($self->{firstTrack} =~ /ogg$/i)
+ {
+ if ($self->{hasOggVorbisHeader})
+ {
+ my $song = Ogg::Vorbis::Header::PurePerl->new($self->{firstTrack});
+ $info->{title} = ($song->comment('album'))[0];
+ $info->{artist} .= $_.', ' foreach $song->comment('artist');
+ $info->{artist} =~ s/, $//;
+ ($info->{release} = ($song->comment('date'))[0]) =~ s|^(\d{4})-(\d{2})-(\d{2}).*$|$3/$2/$1|;
+ $info->{genre} .= $_.', ' foreach $song->comment('genre');
+ $info->{genre} =~ s/, $//;
+ }
+ }
+ }
+
+ sub getInfo
+ {
+ my $self = shift;
+ my $info = {};
+ $self->resetTracks;
+
+ if ((!$self->{fileName}) || ($self->{fileName} =~ /\/dev\//))
+ {
+ if (!$self->{fileName})
+ {
+ $self->{fileName} = $self->{parent}->{options}->cdDevice;
+ }
+ $info = $self->getFreeDB;
+ }
+ else
+ {
+
+ open FILE, '<'.$self->{fileName};
+ binmode FILE;
+
+ $self->{file} = \*FILE;
+ my $header = <FILE>;
+
+ $info = $self->getM3UInfo
+ if ($self->{fileName} =~ /m3u$/) || ($header =~ /^#EXTM3U/);
+ $info = $self->getPLSInfo
+ if ($self->{fileName} =~ /pls$/) || ($header =~ /^\[playlist\]/);
+ close FILE;
+ }
+
+ $self->addFirstTrackInfo($info);
+
+ return if !defined $info;
+ my $result;
+ my $firstTrackName = $info->{tracks}->[0]->[1];
+ $result->{tracks} = {displayed => $firstTrackName, value => $info->{tracks}};
+ foreach (@{$self->{fields}})
+ {
+ next if /^tracks$/;
+ $result->{$_} = {displayed => $info->{$_}, value => $info->{$_}};
+ }
+ return $result;
+ }
+
+ sub getFields
+ {
+ my $self = shift;
+ return $self->{fields};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCGenres.pm b/lib/gcstar/GCGenres.pm
new file mode 100644
index 0000000..8f89e24
--- /dev/null
+++ b/lib/gcstar/GCGenres.pm
@@ -0,0 +1,404 @@
+package GCGenres;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCGenresGroupsDialog;
+ use base "Gtk2::Dialog";
+ use utf8;
+
+ sub initValues
+ {
+ use locale;
+
+ my $self = shift;
+ my $keepPrevious = shift;
+
+ my %directory;
+
+ if ($keepPrevious)
+ {
+ foreach my $line(@{$self->{categories}->{data}})
+ {
+ $directory{$line->[0]} = $line->[1];
+ }
+ }
+ else
+ {
+ foreach (keys %{$self->{convertor}->{groups}})
+ {
+ $directory{$_} = join ',', @{$self->{convertor}->{groups}->{$_}};
+ }
+ }
+
+ @{$self->{categories}->{data}} = ();
+
+ my @keys = sort keys %directory;
+ @keys = reverse @keys if $self->{reverse};
+ foreach (@keys)
+ {
+ my @infos = [$_, $directory{$_}];
+ push @{$self->{categories}->{data}}, @infos;
+ }
+ $self->{categories}->select(0);
+
+ }
+
+ sub generateString
+ {
+ my $self = shift;
+ my $genresString;
+
+ foreach (@{$self->{categories}->{data}})
+ {
+ $genresString .= $_->[0];
+ $genresString .= '|'.$_->[1].';';
+ }
+ $genresString =~ s/.$//;
+ return $genresString;
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ my $genresString = $self->generateString;
+
+ $self->{options}->genres($genresString);
+ $self->{convertor}->loadValues;
+ $self->{options}->save;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ if ($self->run eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ my @idx = $self->{categories}->get_selected_indices;
+
+ splice @{$self->{categories}->{data}}, $idx[0], 1;
+
+ $self->{categories}->select((($idx[0] - 1) > 0) ? ($idx[0] - 1) : 0);
+ }
+
+ sub add
+ {
+ my $self = shift;
+
+ unshift @{$self->{categories}->{data}}, ['',''];
+ }
+
+ sub editCurrent
+ {
+ my $self = shift;
+
+ my @idxtmp = $self->{categories}->get_selected_indices;
+ my $idx = $idxtmp[0];
+ my $line = $self->{categories}->{data}->[$idx];
+
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{GenresModify},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $table = new Gtk2::Table(3,2,0);
+
+ my $labelCategory = new Gtk2::Label($self->{parent}->{lang}->{GenresCategoryName});
+ $table->attach($labelCategory, 0, 1, 0, 1, 'fill', 'fill', 5, 5);
+ my $category = new Gtk2::Entry;
+ $category->set_text($line->[0]);
+ my $hbox1 = new Gtk2::HBox(0,0);
+ $hbox1->pack_start($category,1,1,0);
+ $table->attach($hbox1, 1, 2, 0, 1, 'fill', 'fill', 5, 5);
+
+ my $labelMembers = new Gtk2::Label($self->{parent}->{lang}->{GenresCategoryMembers});
+ $table->attach($labelMembers, 0, 1, 1, 2, 'fill', 'fill', 5, 5);
+ my $members = new Gtk2::Entry;
+ $members->set_text($line->[1]);
+ my $hbox2 = new Gtk2::HBox(0,0);
+ $hbox2->pack_start($members,1,1,0);
+ $table->attach($hbox2, 1, 2, 1, 2, 'fill', 'fill', 5, 5);
+
+ my $labelFoo = new Gtk2::Label('');
+ my $labelBar = new Gtk2::Label('');
+ $table->attach($labelFoo, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $table->attach($labelBar, 1, 2, 2, 3, 'expand', 'expand', 0, 0);
+
+ $dialog->set_default_size(500,1);
+
+ $dialog->vbox->pack_start($table,1,1,0);
+ $dialog->vbox->show_all;
+
+ if ($dialog->run eq 'ok')
+ {
+ splice @{$self->{categories}->{data}}, $idx, 1, [$category->get_text, $members->get_text];
+ }
+
+ $dialog->destroy;
+ }
+
+ sub load
+ {
+ my $self = shift;
+
+ my $response = $self->{loadDialog}->run;
+ if ($response eq 'ok')
+ {
+ my $fileName = $self->{loadDialog}->get_filename;
+ $self->{convertor}->loadValues(undef, $fileName);
+ $self->initValues;
+ }
+ $self->{loadDialog}->hide;
+ }
+
+ sub export
+ {
+ my $self = shift;
+
+ my $response = $self->{exportDialog}->run;
+ if ($response eq 'ok')
+ {
+ my $fileName = $self->{exportDialog}->get_filename;
+ $self->{convertor}->saveValues($self->generateString, $fileName);
+ $self->initValues;
+ }
+ $self->{exportDialog}->hide;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ @{$self->{categories}->{data}} = ();
+ }
+
+ sub sort
+ {
+ my $self = shift;
+
+ $self->{reverse} = 1 - $self->{reverse};
+
+ $self->{categories}->get_column(0)->set_sort_indicator(1);
+ $self->{categories}->get_column(0)->set_sort_order($self->{reverse} ? 'descending' : 'ascending');
+ $self->initValues(1);
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{GenresTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ bless ($self, $class);
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(600,400);
+
+ $self->{reverse} = 0;
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{categories} = new Gtk2::SimpleList($parent->{lang}->{GenresCategoryName} => "text",
+ $parent->{lang}->{GenresCategoryMembers} => "text");
+ $self->{categories}->set_column_editable(0, 1);
+ $self->{categories}->set_column_editable(1, 1);
+ $self->{categories}->set_rules_hint(1);
+ $self->{categories}->get_column(0)->signal_connect('clicked' => sub {
+ $self->sort;
+ });
+ $self->{categories}->get_column(0)->set_sort_indicator(1);
+ $self->{categories}->get_column(0)->set_clickable(1);
+ for my $i (0..1)
+ {
+ $self->{categories}->get_column($i)->set_resizable(1);
+ }
+ $self->{order} = 1;
+ $self->{sort} = -1;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{categories});
+
+ my $vboxButtons = new Gtk2::VBox(0,0);
+ my $addButton = Gtk2::Button->new_from_stock('gtk-add');
+ $addButton->signal_connect('clicked' => sub {
+ $self->add;
+ });
+ my $removeButton = Gtk2::Button->new_from_stock('gtk-remove');
+ $removeButton->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+
+ my $clearButton = Gtk2::Button->new_from_stock('gtk-clear');
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clear;
+ });
+
+ my $editButton = Gtk2::Button->new_from_stock('gtk-properties');
+ $editButton->signal_connect('clicked' => sub {
+ $self->editCurrent;
+ });
+ my $openButton = Gtk2::Button->new_from_stock('gtk-open');
+ $openButton->signal_connect('clicked' => sub {
+ $self->load;
+ });
+ my $exportButton = Gtk2::Button->new_from_stock('gtk-save-as');
+ $exportButton->signal_connect('clicked' => sub {
+ $self->export;
+ });
+
+ $vboxButtons->pack_start($addButton,0,0,5);
+ $vboxButtons->pack_start($removeButton,0,0,5);
+ $vboxButtons->pack_start($clearButton,0,0,5);
+ $vboxButtons->pack_start($editButton,0,0,5);
+ $vboxButtons->pack_start($openButton,0,0,5);
+ $vboxButtons->pack_start($exportButton,0,0,5);
+
+ $hbox->pack_start($scrollPanelList,1,1,10);
+ $hbox->pack_start($vboxButtons,0,0,10);
+
+ $self->vbox->pack_start($hbox,1,1,10);
+
+ $self->{convertor} = new GCGenresConvertor($self->{options});
+
+ $self->{loadDialog} = new GCFileChooserDialog($self->{lang}->{GenresLoad}, $self, 'open', 1);
+ $self->{loadDialog}->set_pattern_filter((['*.genres', '*.genres']));
+ $self->{loadDialog}->set_filename($ENV{GCS_SHARE_DIR}.'/genres/');
+
+ $self->{exportDialog} = new GCFileChooserDialog($self->{lang}->{GenresExport}, $self, 'save');
+
+ return $self;
+ }
+}
+
+{
+ package GCGenresConvertor;
+
+ sub new
+ {
+ my ($proto, $options) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {};
+ bless ($self, $class);
+
+ $self->{options} = $options;
+ $self->loadValues($options->genres);
+
+ return $self;
+ }
+
+ sub loadValues
+ {
+ my ($self, $values, $file) = @_;
+
+ $self->{groups} = {};
+ $self->{genres} = {};
+
+ my @groups;
+
+ if ($file)
+ {
+ open FG, "< $file" or return -1;
+ binmode( FG, ':utf8' );
+ foreach(<FG>)
+ {
+ chomp;
+ s/(.*?)\W*$/$1/;
+ push (@groups,$_);
+ }
+ close FG;
+ }
+ else
+ {
+ $values = $self->{options}->genres unless $values;
+ @groups = split /;/, $values;
+ }
+
+ foreach my $group(@groups)
+ {
+ my @details = split /\|/, $group;
+ my $groupName = $details[0];
+ my @groupList;
+ foreach my $genre(split /,/,$details[1])
+ {
+ push @groupList, $genre;
+ $self->{genres}->{uc $genre} = $groupName;
+ }
+ $self->{genres}->{uc $groupName} = $groupName;
+ $self->{groups}->{$groupName} = \@groupList;
+ }
+ }
+
+ sub saveValues
+ {
+ my ($self, $value, $file) = @_;
+
+ open FG, "> $file" or return -1;
+ my @values = split /;/, $value;
+
+ foreach (@values)
+ {
+ print FG "$_\n";
+ }
+ close FG;
+ }
+
+ sub convert
+ {
+ my ($self, $genre) = @_;
+
+ my $ucGenre = uc $genre;
+
+ return $genre if ! exists $self->{genres}->{$ucGenre};
+ return $self->{genres}->{$ucGenre};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm b/lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm
new file mode 100644
index 0000000..f2f9af4
--- /dev/null
+++ b/lib/gcstar/GCGraphicComponents/GCBaseWidgets.pm
@@ -0,0 +1,4023 @@
+package GCBaseWidgets;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+#use GCBorrowings;
+use Encode;
+
+
+use strict;
+
+our @videoExtensions = ('.aaf','.3gp','.asf','.avi','.flv','.m1v','.m2v','.m4v','.mkv','.mov',
+ '.mp4','.mpeg','.mpg','.mpe','.mxf','.nsv','.ogg','.ogv','.rm','.swf','.wmv',
+ '.iso');
+
+our @ebookExtensions = ('.txt','.htm','.html','.azw','.opf','.tr2','.tr3','.aeh','.fb2','.chm',
+ '.pdf','.ps','.djvu','.lit','.pdb','.dnl','.xeb','.ceb','.lbr','.prc',
+ '.mobi','.epub','.lrf','.lrx','.pdg','.doc','.odt','.cbr','.cbz','.djvu');
+
+our @audioExtensions = ('.m3u','.pls','.asx','.wax','.wvx','.b4s','.kpl','.ram','.smil','.iso',
+ '.cue','.bin','.mp3','.ogg','.oga','.flac');
+
+sub createWidget
+{
+ my ($parent, $info, $comparison) = @_;
+ my $widget;
+ my $withComparisonLabel = 1;
+
+ if ($info->{type} eq 'short text')
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('text', $parent->{lang});
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCShortText;
+ }
+ }
+ elsif ($info->{type} eq 'number')
+ {
+ #If we want to have values that are less to the specified one,
+ #we use max as default to be sure everything will be returned
+ #in that case.
+ my $default = $info->{min};
+ $default = $info->{max}
+ if $comparison =~ /^l/;
+ if (exists $info->{min})
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('number',
+ $parent->{lang},
+ $info->{min},
+ $info->{max},
+ $info->{step});
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCNumeric($default,
+ $info->{min},
+ $info->{max},
+ $info->{step});
+ }
+ }
+ else
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('numeric text', $parent->{lang});
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCCheckedText('0-9.');
+ }
+ }
+ }
+ elsif ($info->{type} eq 'checked text')
+ {
+ $widget = new GCCheckedText($info->{format});
+ }
+ elsif (($info->{type} eq 'history text')
+ || (($info->{type} =~ /list/)
+ && ($info->{history} ne 'false')))
+ {
+ $widget = new GCHistoryText;
+ }
+ elsif ($info->{type} eq 'options')
+ {
+ $widget = new GCMenuList;
+ $widget->setValues($parent->{model}->getValues($info->{values}), $info->{separator});
+ }
+ elsif ($info->{type} eq 'yesno')
+ {
+ $widget = new GCCheckBoxWithIgnore($parent);
+ $withComparisonLabel = 0;
+ }
+ elsif ($info->{type} eq 'date')
+ {
+ if ($comparison eq 'range')
+ {
+ $widget = new GCRange('date', $parent->{lang}, undef, undef, undef, $parent);
+ $widget->setWidth(16);
+ $withComparisonLabel = 0;
+ }
+ else
+ {
+ $widget = new GCDate($parent->{window}, $parent->{lang}, 1,
+ $parent->{options}->dateFormat);
+ }
+ }
+ else
+ {
+ $widget = new GCShortText;
+ }
+
+ return ($widget, $withComparisonLabel);
+}
+
+{
+ package GCGraphicComponent;
+
+ use base 'Exporter';
+ our @EXPORT = qw($somethingChanged);
+ our $somethingChanged = 0;
+
+ sub expand
+ {
+ }
+
+ sub lock
+ {
+ }
+
+ sub getMainParent
+ {
+ my $self = shift;
+ return if ! $self->{parent};
+ my $tmpWidget = $self;
+ $tmpWidget = $tmpWidget->{parent} while $tmpWidget && (! $tmpWidget->isa('GCFrame'));
+ $self->{mainParent} = $tmpWidget;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 0;
+ }
+
+ sub cleanMarkup
+ {
+ my ($self, $text, $encodeSubset) = @_;
+ $text =~ s|<br ?/?>|\n|g;
+ if ($encodeSubset)
+ {
+ # Encode only the characters set_markup has issues with
+ $text =~ s|&|&amp;|g;
+ $text =~ s|<|&lt;|g;
+ $text =~ s|>|&gt;|g;
+ }
+ else
+ {
+ $text = GCUtils::encodeEntities($text)
+ }
+ return $text;
+ }
+
+ sub selectAll
+ {
+ }
+
+ sub getTagFromSpan
+ {
+ my ($self, $desc) = @_;
+ my @result = (); #('background' => $self->{background});
+ my @keyvalues = split / /, $desc;
+ foreach (@keyvalues)
+ {
+ /([^=]*)=(.*)/;
+ my $key = $1;
+ my $value = $2;
+ $value =~ s/('|")//g;
+ #"'
+ next if $key =~ /=/;
+ push @result, ($key, $value);
+ }
+ return @result;
+ }
+
+ sub valueToDisplayed
+ {
+ # 1st parameter is self
+ shift;
+ # Here we don't change the value;
+ return shift;
+ }
+
+ sub hasChanged
+ {
+ my $self = shift;
+
+ return $self->{hasChanged};
+ }
+
+ sub setChanged
+ {
+ my $self = shift;
+ $self->{hasChanged} = 1;
+ $somethingChanged = 1;
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ }
+
+ sub setHeight
+ {
+ my ($self, $height) = @_;
+ }
+
+ sub resetChanged
+ {
+ my $self = shift;
+ $self->{hasChanged} = 0;
+ }
+
+ sub activateStateTracking
+ {
+ # We do nothing by default
+ # Other widget should connect a signal handler or something similar
+ # when the content has been changed
+ }
+
+ sub getLinkedValue
+ {
+ }
+ sub setLinkedValue
+ {
+ }
+
+ sub setLinkedComponent
+ {
+ my ($self, $linked) = @_;
+ $self->{linkedComponent} = $linked;
+ }
+}
+
+{
+ package GCPseudoHistoryComponent;
+ #
+ # This is an abstract package handling a little history
+ #
+ sub initHistory
+ {
+ my ($self, $listType) = @_;
+ $self->{history} = {};
+
+ # listType contains the type of the original field:
+ # 0: No list
+ # >0: Multiple list (number of columns)
+ $self->{listType} = $listType;
+
+ $self->{history}->{0} = {'' => 1};
+ for(my $i = 1; $i < $listType; $i++)
+ {
+ $self->{history}->{$i} = {'' => 1};
+ }
+ $self->{listType} = $listType;
+ }
+
+ sub addHistory
+ {
+ my $self = shift;
+
+ my $value = shift;
+ my $i;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach (@$value)
+ {
+ $i = 0;
+ foreach my $item(@$_)
+ {
+ $self->{history}->{$i}->{$item} = 1;
+ $i++;
+ }
+ }
+ }
+ else
+ {
+ # The separator used was ; instead of ,
+ $value =~ s/;/,/g if $value !~ /,/;
+ my @values = split m/,/, $value;
+ foreach (@values)
+ {
+ my @items = split m/;/;
+ $i = 0;
+ foreach my $item(@items)
+ {
+ $self->{history}->{$i}->{$item} = 1;
+ $i++;
+ }
+ }
+ }
+ }
+
+ sub setDropDown
+ {
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ my @array;
+
+
+ if ($self->{listType} < 1)
+ {
+ @array = sort keys %{$self->{history}->{0}};
+ }
+ else
+ {
+ foreach (sort keys %{$self->{history}})
+ {
+ my @tmpArray = sort keys %{$self->{history}->{$_}};
+ push @array, \@tmpArray;
+ }
+ }
+ return \@array;
+ }
+
+ sub setValues
+ {
+ my ($self, $values) = @_;
+ if ($self->{listType} == 0)
+ {
+ $self->{history} = {};
+ $self->{history}->{0}->{$_} = 1 foreach (@$values);
+ }
+ else
+ {
+ $self->{history} = {};
+ for (my $i = 0; $i < $self->{listType}; $i++)
+ {
+ $self->{history}->{$i}->{$_} = 1 foreach (@{$values->[$i]});
+ }
+ }
+ }
+}
+
+{
+ package GCLinkedComponent;
+ @GCLinkedComponent::ISA = ('GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $linked) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = {linked => $linked};
+ bless ($self, $class);
+ $linked->setLinkedComponent($self);
+ return $self;
+ }
+
+ sub setValue
+ {
+ my $self = shift;
+ $self->setChanged;
+ return $self->{linked}->setLinkedValue(@_);
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{linked}->getLinkedValue(@_);
+ }
+
+ sub resetChanged
+ {
+ my $self = shift;
+ $self->{hasChanged} = 0;
+ return $self->{linked}->resetChanged(@_);
+ }
+
+ sub hide
+ {
+ my $self = shift;
+ $self->{linked}->setLinkedActivated(0);
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->{linked}->setLinkedActivated(1);
+ }
+}
+
+{
+ package GCShortText;
+
+ use Glib::Object::Subclass
+ Gtk2::Entry::
+ ;
+
+ @GCShortText::ISA = ('Gtk2::Entry', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ return if $self->{readOnly};
+ $self->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+ $self->select_region(0, length($self->getValue));
+ $self->grab_focus;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->get_text;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->set_text($value);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->set_width_chars($value);
+ }
+
+ sub setReadOnly
+ {
+ my $self = shift;
+ $self->set_editable(0);
+ $self->{readOnly} = 1;
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+ return if $self->{readOnly};
+ #$self->can_focus(!$locked);
+ $self->set_editable(!$locked);
+ }
+}
+
+our $hasSpellChecker;
+BEGIN {
+ eval 'use Gtk2::Spell';
+ if ($@)
+ {
+ $hasSpellChecker = 0;
+ }
+ else
+ {
+ $hasSpellChecker = 1;
+ }
+}
+{
+ package GCLongText;
+
+
+ use Glib::Object::Subclass
+ Gtk2::ScrolledWindow::
+ ;
+
+ @GCLongText::ISA = ('Gtk2::ScrolledWindow', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+
+ $self->{text} = new Gtk2::TextView;
+ $self->{text}->set_editable(1);
+ $self->{text}->set_wrap_mode('word');
+ $self->set_border_width(0);
+ $self->set_shadow_type('in');
+ $self->set_policy('automatic', 'automatic');
+ #$self->set_size_request(-1,80);
+
+ $self->add($self->{text});
+ $self->{spellChecker} = 0;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{text}->get_buffer->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub setSpellChecking
+ {
+ my ($self, $activate, $lang) = @_;
+ return if ! $GCGraphicComponents::hasSpellChecker;
+ if ($activate)
+ {
+ $lang ||= $ENV{LANG};
+ if ($self->{spellChecker})
+ {
+ return if $lang eq $self->{lang};
+ $self->setSpellChecking(0)
+ }
+ eval {
+ $self->{spellChecker} = Gtk2::Spell->new_attach($self->{text});
+ $self->{spellChecker}->set_language($lang);
+ $self->{lang} = $lang;
+ };
+ if ($@)
+ {
+ $self->setSpellChecking(0);
+ }
+ }
+ else
+ {
+ $self->{spellChecker}->detach if $self->{spellChecker};
+ $self->{spellChecker} = 0;
+ }
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $buffer = $self->{text}->get_buffer;
+ my $text = $buffer->get_text($buffer->get_start_iter,
+ $buffer->get_end_iter, 1);
+ #$text =~s/\n/<br\/>/g;
+ return $text;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ #$text =~s/<br\/>/\n/g;
+ $text = '' if !defined $text;
+ $self->{text}->get_buffer->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{text}->can_focus(!$locked);
+ }
+
+ sub setHeight
+ {
+ my ($self, $height) = @_;
+
+ # TODO Change height
+ }
+}
+
+{
+ package GCHistoryText;
+
+
+ use Glib::Object::Subclass
+ Gtk2::Combo::
+ ;
+
+ @GCHistoryText::ISA = ('Gtk2::Combo', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ $self->{history} = {'' => 1};
+
+ # Settings for auto-completion
+ $self->{completionModel} = Gtk2::ListStore->new('Glib::String');
+ $self->{completion} = Gtk2::EntryCompletion->new;
+ $self->{completion}->set_model($self->{completionModel});
+ $self->{completion}->set_text_column(0);
+ $self->entry->set_completion($self->{completion});
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->entry->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+ $self->entry->select_region(0, -1);
+ $self->entry->grab_focus;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my @children = $self->get_children;
+ return $children[0]->get_text if $children[0];
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ my @children = $self->get_children;
+ $children[0]->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ ($self->get_children)[0]->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ ($self->get_children)[0]->can_focus(!$locked);
+ ($self->get_children)[1]->set_sensitive(!$locked);
+ }
+
+ sub addHistory
+ {
+ my $self = shift;
+ my $value = (scalar @_) ? shift : $self->getValue;
+ my $noUpdate = shift;
+ $value =~ s/^\s*//;
+ if (!exists $self->{history}->{$value})
+ {
+ $self->{history}->{$value} = 1;
+ if (!$noUpdate)
+ {
+ $self->setDropDown(sort keys %{$self->{history}});
+ }
+ }
+ }
+
+ sub setDropDown
+ {
+ my $self = shift;
+ my @values = (scalar @_) ? @_ : sort keys %{$self->{history}};
+ my $previousValue = $self->getValue;
+
+ # Update history list
+ $self->set_popdown_strings(@values);
+
+ # Restore value as it is lost when updating list
+ $self->setValue($previousValue);
+
+ # Update auto-completion list
+ $self->{completionModel}->clear;
+ foreach (@values)
+ {
+ my $iter = $self->{completionModel}->append;
+ $self->{completionModel}->set($iter,
+ 0 => $_);
+ }
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ my @array = sort keys %{$self->{history}};
+ return \@array;
+ }
+
+ sub setValues
+ {
+ my ($self, $values) = @_;
+ $self->{history} = {};
+ $self->setDropDown(@$values);
+ $self->{history}->{$_} = 1 foreach (@$values);
+ }
+
+ sub setActivate
+ {
+ my $value
+ }
+
+ sub popup
+ {
+ my $self = shift;
+ ($self->get_children)[1]->grab_focus;
+ ($self->get_children)[1]->signal_emit('activate');
+ }
+}
+
+{
+ package GCNumeric;
+
+
+ use Glib::Object::Subclass
+ Gtk2::SpinButton::
+ ;
+
+ @GCNumeric::ISA = ('Gtk2::SpinButton', 'GCRatingWidget', 'GCGraphicComponent');
+
+ use GCWidgets;
+ use GCLang;
+
+ sub new
+ {
+ my ($proto, $default, $min, $max, $step, $format) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self;
+
+ if (($format eq 'text') || (!$format))
+ {
+ # Standard numeric field
+ $step = 1 if !$step;
+ my $pageStep = 10 * $step;
+
+ my $decimals = 0;
+ $decimals = length($1) if $step =~ /\.(.*)$/;
+
+ my $accel = 0;
+ my $values = ($max - $min) / $step;
+ $accel = 0.2 if $values > 100;
+ $accel = 0.5 if $values > 500;
+ $accel = 1.0 if $values > 2000;
+ $default = 0 if $default eq '';
+ my $adj = Gtk2::Adjustment->new($default, $min, $max, $step, $pageStep, 0) ;
+ $self = $class->SUPER::new($adj, $accel, $decimals);
+ $self->{default} = $default;
+ $self->{step} = $step;
+ $self->{pageStep} = $pageStep;
+ $self->{accel} = $accel;
+ $self->{format} = 'text';
+ $self->set_numeric(1);
+ }
+ elsif ($format eq 'graphical')
+ {
+ # Graphical rating widget
+ $default = 0 if $default eq '';
+ $max = 10 if $max eq '';
+
+ $self = GCRatingWidget->new (maxStars=>$max, rating=>$default, direction=>GCLang::languageDirection($ENV{LANG}));
+ $self->{format} = 'graphical';
+ }
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ if ($self->{format} eq 'text')
+ {
+ return $self->get_text eq '';
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ return $self->get('rating') eq 0;
+ }
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+ if ($self->{format} eq 'text')
+ {
+ $self->select_region(0, length($self->getValue));
+ }
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $value;
+
+ if ($self->{format} eq 'text')
+ {
+ $value = $self->get_text;
+ $value =~ s/,/./;
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $value = $self->get('rating');
+ }
+
+ return $value;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+
+ if ($self->{format} eq 'text')
+ {
+ $text = $self->{default} if $text eq '';
+ $self->set_value($text);
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $text = $self->{default} if $text eq '';
+ $self->set_rating($text);
+ }
+ }
+
+ sub clear
+ {
+ my $self = shift;
+
+ if ($self->{format} eq 'text')
+ {
+ $self->set_value($self->{default});
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $self->set_rating($self->{default});
+ }
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ if ($self->{format} eq 'text')
+ {
+ $self->can_focus(!$locked);
+ my $step = ($locked ? 0 : $self->{step});
+ $self->set_increments($step, $self->{pageStep});
+ }
+ elsif ($self->{format} eq 'graphical')
+ {
+ $self->set(sensitive=>!$locked);
+ }
+ }
+}
+
+{
+ package GCCheckedText;
+
+ use Glib::Object::Subclass
+ Gtk2::Entry::
+ ;
+
+ @GCCheckedText::ISA = ('GCShortText');
+
+ sub new
+ {
+ my ($proto, $format) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ my $forbidden = qr/[^$format]/;
+ $self->signal_connect('insert-text' => sub {
+ # Remove forbidden characters
+ $_[1] =~ s/$forbidden//g;
+ () # this callback must return either 2 or 0 items.
+ });
+
+ return $self;
+ }
+}
+
+{
+ package GCRange;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCRange::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $type, $lang, $min, $max, $step, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ if ($type eq 'text')
+ {
+ $self->{from} = new GCShortText;
+ $self->{to} = new GCShortText;
+ }
+ elsif ($type eq 'numeric text')
+ {
+ new GCCheckedText('0-9.');
+ $self->{to} = new GCCheckedText('0-9.');
+ }
+ elsif ($type eq 'date')
+ {
+ $self->{from} = new GCDate($parent->{window}, $lang, 1,
+ $parent->{options}->dateFormat);
+ $self->{to} = new GCDate($parent->{window}, $lang, 1,
+ $parent->{options}->dateFormat);
+ }
+ else
+ {
+ $self->{from} = new GCNumeric($min, $min, $max, $step);
+ $self->{to} = new GCNumeric($max, $min, $max, $step);
+ }
+ $self->pack_start(Gtk2::Label->new($lang->{PanelFrom}), 0, 0, 12);
+ $self->pack_start($self->{from}, 1, 1, 0);
+ $self->pack_start(Gtk2::Label->new($lang->{PanelTo}), 0, 0, 12);
+ $self->pack_start($self->{to}, 1, 1, 0);
+
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{from}->activateStateTracking;
+ $self->{to}->activateStateTracking;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{from}->getValue.';'.$self->{to}->getValue;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ my @values = split m/;/, $value;
+ $self->{from}->setValue($values[0]);
+ $self->{to}->setValue($values[0]);
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{from}->setWidth($value / 2);
+ $self->{to}->setWidth($value / 2);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{from}->lock(!$locked);
+ $self->{to}->lock(!$locked);
+ }
+
+ sub signal_connect
+ {
+ my $self = shift;
+ $self->{from}->signal_connect(@_);
+ $self->{to}->signal_connect(@_);
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ $name =~ s/.*?::(.*)/$1/;
+ $self->{from}->$name(@_);
+ $self->{to}->$name(@_);
+ }
+}
+
+{
+ package GCDate;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCDate::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub selectValue
+ {
+ my $self = shift;
+ $self->{dialog} = new GCDateSelectionDialog($self->{mainParent})
+ if ! $self->{dialog};
+ $self->{dialog}->date($self->getRawValue);
+ if ($self->{dialog}->show)
+ {
+ $self->setValue($self->{dialog}->date);
+ }
+ $self->{parent}->showMe;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $lang, $reverseDate, $format) = @_;
+ $format ||= '%d/%m/%Y';
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->getMainParent;
+ $self->{reverseDate} = $reverseDate;
+ $self->{entry} = Gtk2::Entry->new; #_with_max_length(10);
+ $self->{entry}->set_width_chars(12);
+ $self->{button} = new Gtk2::Button($lang->{PanelDateSelect});
+ $self->{button}->signal_connect('clicked' => sub {
+ $self->selectValue;
+ });
+ $self->pack_start($self->{entry}, 1, 1, 0);
+ $self->pack_start($self->{button}, 0, 0, 0);
+
+ $self->{format} = $format;
+ #$self->{format} = '%d %B %Y';
+ return $self;
+ }
+
+ sub setFormat
+ {
+ my ($self, $format) = @_;
+ my $current = $self->getValue;
+ $self->{format} = $format;
+ $self->setValue($current);
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{entry}->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getCurrentDate
+ {
+ my $self = shift;
+
+ my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+ return sprintf('%02d/%02d/%4d', $mday, $mon+1, 1900+$year);
+ }
+
+
+ sub getRawValue
+ {
+ my $self = shift;
+ my $value = $self->{entry}->get_text;
+ $value = GCUtils::strToTime($value, $self->{format})
+ if $self->{format} && $value;
+ return $value;
+
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $value = $self->getRawValue;
+ return GCPreProcess::reverseDate($value) if $self->{reverseDate};
+ return $value;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ $text = GCPreProcess::restoreDate($text) if $self->{reverseDate};
+ if ($text eq 'current')
+ {
+ $text = $self->getCurrentDate;
+ $self->setChanged;
+ }
+ $text = GCUtils::timeToStr($text, $self->{format}) if $self->{format};
+ $self->{entry}->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{entry}->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{entry}->can_focus(!$locked);
+ $self->{button}->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCFile;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCFile::ISA = ('Gtk2::HBox', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ use File::Basename;
+
+ sub selectValue
+ {
+ my $self = shift;
+
+ my $dialog = GCFileChooserDialog->new($self->{title},
+ $self->{mainParent},
+ $self->{type},
+ $self->{withFilter});
+ $dialog->set_filename($self->getValue);
+ $dialog->set_pattern_filter($self->{patterns})
+ if $self->{patterns};
+ my $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ $self->setValue($dialog->get_filename);
+ }
+ $dialog->hide;
+ $self->{parent}->showMe;
+ }
+
+ sub setPatternFilter
+ {
+ my ($self, $patterns) = @_;
+ $self->{patterns} = $patterns;
+ }
+
+ sub setType
+ {
+ my ($self, $type, $withFilter) = @_;
+
+ if (($type ne $self->{type}) || ($withFilter != $self->{withFilter}))
+ {
+ $self->{dialog}->destroy
+ if $self->{dialog};
+ $self->{dialog} = undef;
+ $self->{type} = $type;
+ $self->{withFilter} = $withFilter;
+ }
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->{title} = $title;
+ if ($self->{dialog})
+ {
+ $self->{dialog}->setTitle($title);
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $title, $type, $withFilter, $defaultValue, $allowContextMenu, $fieldType) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ $self->{parent} = $parent;
+ $self->getMainParent;
+
+ $title ||= $self->{parent}->{lang}->{PanelSelectFileTitle};
+ $self->{title} = $title;
+ $type ||= 'open';
+ $self->{type} = $type;
+ $withFilter = 0 if !$withFilter;
+ $self->{withFilter} = $withFilter;
+
+ $self->{entry} = Gtk2::Entry->new;
+
+ $self->{button} = new GCButton($self->{parent}->{lang}->{PanelSelectFileTitle});
+
+ # For video/ebook/audio files, set file pattern filters
+ if (($fieldType eq 'video') || ($fieldType eq 'ebook') || ($fieldType eq 'audio'))
+ {
+ $self->setPatternFilter([$self->{parent}->{lang}->{FileVideoFiles}, \@videoExtensions])
+ if ($fieldType eq 'video');
+ $self->setPatternFilter([$self->{parent}->{lang}->{FileEbookFiles}, \@ebookExtensions])
+ if ($fieldType eq 'ebook');
+ $self->setPatternFilter([$self->{parent}->{lang}->{FileAudioFiles}, \@audioExtensions])
+ if ($fieldType eq 'audio');
+ $self->{withFilter} = 1;
+ }
+
+ $self->{button}->signal_connect('clicked' => sub {
+ $self->selectValue;
+ });
+
+ if ($allowContextMenu)
+ {
+ my @subMenuFileChoose;
+ $subMenuFileChoose[0] = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{ContextChooseFile});
+ $subMenuFileChoose[0]->signal_connect("activate" , sub {$self->selectValue});
+ $subMenuFileChoose[1] = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{ContextChooseFolder});
+ $subMenuFileChoose[1]->signal_connect("activate" , sub {
+ $self->{type} = 'select-folder';
+ $self->{title} = $parent->{lang}->{ContextChooseFolder};
+ $self->selectValue;
+ });
+ $self->{button}->setContextMenu(\@subMenuFileChoose);
+ $self->{button}->enableContextMenu;
+ }
+
+ $self->pack_start($self->{entry}, 1, 1, 0);
+
+ if ($defaultValue)
+ {
+ $self->{defaultButton} = GCButton->newFromStock('gtk-undo', 0, $parent->{lang}->{PanelRestoreDefault});
+ $parent->{tooltips}->set_tip($self->{defaultButton},
+ $parent->{lang}->{PanelRestoreDefault}.$parent->{lang}->{Separator}.$defaultValue)
+ if $parent->{tooltips};
+ $self->pack_start($self->{defaultButton}, 0, 0, 0);
+ $self->{defaultButton}->signal_connect('clicked' => sub {
+ $self->setValue($defaultValue);
+ });
+ }
+
+ # Add the 'select file' button only if the field is not a url field
+ $self->pack_start($self->{button}, 0, 0, 0)
+ if ($fieldType ne 'url');
+
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{entry}->signal_connect('changed' => sub {;
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{entry}->get_text;
+ }
+
+ sub setValue
+ {
+ my ($self, $text) = @_;
+ $self->{entry}->set_text($text);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{entry}->set_width_chars($value);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{entry}->can_focus(!$locked);
+ $self->{button}->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCUrl;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCUrl::ISA = ('GCFile');
+
+ sub selectValue
+ {
+ my $self = shift;
+ my $url = $self->getValue;
+ return if !$url;
+ $self->{opener}->launch($url, 'url');
+ }
+
+ sub new
+ {
+ my ($proto, $opener) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(undef, '', 'url');
+ $self->{opener} = $opener;
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ package GCButton;
+
+ use Glib::Object::Subclass
+ Gtk2::Button::
+ ;
+
+ @GCButton::ISA = ('Gtk2::Button', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub newFromStock
+ {
+ my ($proto, $stock, $nolabel, $label) = @_;
+ my $class = ref($proto) || $proto;
+
+ $nolabel = 0 if ($^O =~ /win32/i);
+
+ my $self = $class->SUPER::new_from_stock($stock);
+
+ if ($nolabel)
+ {
+ my $tmpWidget = $self;
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->destroy;
+ }
+ elsif ($label)
+ {
+ my $tmpWidget = $self;
+ $tmpWidget = $tmpWidget->child while ! $tmpWidget->isa('Gtk2::HBox');
+ ($tmpWidget->get_children)[1]->set_label($label);
+ }
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->setChanged;
+ return $value;
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->set_size_request($value, -1);
+ }
+ sub setContextMenu
+ {
+ my ($self, $menu) = @_;
+ $self->{popupContextMenu}=new Gtk2::Menu if !$self->{popupContextMenu};
+ for my $i(0..$#{$self->{popupContextMenu}->{items}})
+ {
+ $self->{popupContextMenu}->remove($self->{popupContextMenu}->{items}->[$i]);
+ $self->{popupContextMenu}->{items}->[$i]->destroy;
+ }
+ delete $self->{popupContextMenu}->{items};
+ for my $i(0..$#$menu)
+ {
+ $self->{popupContextMenu}->{items}->[$i]=$menu->[$i];
+ $self->{popupContextMenu}->append($self->{popupContextMenu}->{items}->[$i]);
+ }
+ $self->{popupContextMenu}->show_all;
+ }
+ sub enableContextMenu
+ {
+ my ($self,$button) = @_;
+ #TODO enabled context for one button mouses
+ $button=3 if !$button;
+ $self->{contextMenuSignalHandler}=$self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne $button;
+ $self->{popupContextMenu}->popup(undef, undef, undef, undef, $event->button, $event->time);
+ return 0;
+ }) if !$self->{contextMenuSignalHandler};
+ }
+ sub disableContextMenu
+ {
+ my $self = shift;
+ if($self->{contextMenuSignalHandler})
+ {
+ $self->signal_handler_disconnect($self->{contextMenuSignalHandler});
+ delete $self->{contextMenuSignalHandler};
+ }
+ }
+}
+
+{
+ package GCUrlButton;
+
+ use Glib::Object::Subclass
+ Gtk2::Button::
+ ;
+
+ @GCUrlButton::ISA = ('GCButton', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label, $opener) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+ $self->{opener}=$opener;
+ $self->{defaultLabel} = $label;
+ $self->{clicSignalHandler}=$self->signal_connect('clicked' => sub {
+ $self->{opener}->launch($self->{url}, 'url');
+ });
+
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ return $self->{value};
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $self->setChanged;
+ my @urls=split ';',$value;
+ if(scalar(@urls)>1)
+ {
+ my (@menu,$i,$url);
+ foreach my $urlName(@urls)
+ {
+ $urlName =~ /^(.*?)##(.*)$/;
+ my $name=$2;
+ my $menuItem=Gtk2::MenuItem->new_with_label($name);
+ $menuItem->signal_connect("activate" ,sub {
+ $self->{opener}->launch($_[1], 'url')
+ },$1);
+ push @menu,$menuItem;
+ }
+ $self->{url} ='';
+ $self->setContextMenu(\@menu);
+ $self->enableContextMenu(1);
+ $self->lock(0);
+ #$self->signal_handler_block($self->{clicSignalHandler});
+ $self->setLabel($self->{defaultLabel});
+ }
+ else
+ {
+ if ($value =~ /^(.*?)##(.*)$/)
+ {
+ $self->{url} = $1;
+ $self->setLabel($2);
+ }
+ else
+ {
+ $self->{url} = $value;
+ $self->setLabel($self->{defaultLabel});
+ }
+ $self->lock(!$self->{url});
+ $self->disableContextMenu;
+ #$self->signal_handler_unblock($self->{clicHandler});
+ }
+ $self->{value} = $value;
+ }
+
+ sub setLabel
+ {
+ my ($self, $label) = @_;
+ $self->set_label($label);
+ }
+}
+
+{
+ package GCCheckBox;
+
+ use Glib::Object::Subclass
+ Gtk2::CheckButton::
+ ;
+
+ @GCCheckBox::ISA = ('Gtk2::CheckButton', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+
+ $self->signal_connect('toggled' => sub {
+ $self->setChanged;
+ });
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return 1 if ($self->get_active);
+ return 0;
+ }
+
+ sub getValueAsText
+ {
+ my $self = shift;
+ return 'true' if ($self->get_active);
+ return 'false';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->set_active($value);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue(0);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCCheckBoxWithIgnore;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCCheckBoxWithIgnore::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(0,0);
+ bless ($self, $class);
+
+ $self->{check}->[0] = new Gtk2::RadioButton(undef,$parent->{lang}->{CheckUndef});
+ $self->{group} = $self->{check}->[0]->get_group;
+ $self->{check}->[1] = new Gtk2::RadioButton($self->{group},$parent->{lang}->{CheckNo});
+ $self->{check}->[2] = new Gtk2::RadioButton($self->{group},$parent->{lang}->{CheckYes});
+
+ $self->pack_start($self->{check}->[0], 0, 0, 10);
+ $self->pack_start($self->{check}->[1], 0, 0, 10);
+ $self->pack_start($self->{check}->[2], 0, 0, 10);
+
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+
+ foreach (@{$self->{check}})
+ {
+ $_->signal_connect('toggled' => sub {
+ $self->setChanged;
+ });
+ }
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->{check}->[0]->get_active;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $i = 0;
+ foreach (@{$self->{check}})
+ {
+ last if $self->{check}->[$i]->get_active;
+ $i++;
+ }
+ $i--;
+ return $i;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->{check}->[$value + 1]->set_active(1);
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue(-1);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+}
+
+{
+ package GCMultipleList;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCMultipleList::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $parent, $number, $labels, $withHistory, $readonly, $useFiles,$types) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(0,0);
+
+ $self->{number} = $number;
+ $self->{readonly} = $readonly;
+ $self->{withHistory} = $withHistory;
+
+ my $hboxActions = new Gtk2::HBox(0,0);
+
+ my @histories;
+ my @listColumns;
+ my $i;
+ for $i (0..($number - 1))
+ {
+ push @histories, {'' => 1};
+ push @listColumns, ($labels->[$i] => 'text');
+ next if $readonly;
+ if ($useFiles)
+ {
+ $self->{entries}->[$i] = GCFile->new($parent);
+ $self->{entries}->[$i]->{entry}->signal_connect('activate' => sub {
+ $self->addValues;
+ });
+ }
+ else
+ {
+ if($types && $types->[$i] eq 'date')
+ {
+ $self->{entries}->[$i] = GCDate->new($parent, $parent->{lang}, 1,$parent->{options}->dateFormat);
+ $self->{entries}->[$i]->{entry}->signal_connect('activate' => sub {
+ $self->addValues;
+ $self->{entries}->[0]->grab_focus;
+ });
+ $self->{withHistoryField}->[$i]=0;
+ }
+ elsif ($withHistory && (!$types || $types->[$i] eq 'history'))
+ {
+ $self->{entries}->[$i] = GCHistoryText->new;
+ $self->{entries}->[$i]->entry->signal_connect('activate' => sub {
+ my $widget = $self->{entries}->[$i];
+ if ($widget->getValue)
+ {
+ $self->addValues;
+ # FIXME. It seems this does nothing:
+ $self->{entries}->[0]->grab_focus;
+ }
+ $widget->entry->signal_stop_emission_by_name('activate');
+ });
+ $self->{withHistoryField}->[$i]=1;
+ }
+ else
+ {
+ $self->{entries}->[$i] = GCShortText->new;
+ $self->{entries}->[$i]->signal_connect('activate' => sub {
+ $self->addValues;
+ $self->{entries}->[0]->grab_focus;
+ });
+ $self->{withHistoryField}->[$i]=0 if $withHistory;
+ }
+ }
+ $self->{entries}->[$i]->setWidth(12);
+ $hboxActions->pack_start($self->{entries}->[$i], 1, 1, 6);
+ }
+
+ $self->{histories} = [\@histories];
+
+ $self->{box} = new Gtk2::VBox(0,0);
+
+ # If list belongs to an expander, set box size to a reasonable size
+ $self->{box}->{signalHandler} = $self->{box}->signal_connect('size-allocate' => sub {
+ if (($self->{realParent}) && ($self->{realParent}->isa('GCExpander')))
+ {
+ my $width = $self->allocation->width - ( 2 * $GCUtils::margin) ;
+ $self->{box}->set_size_request(($width >= -1) ? $width : -1 , -1);
+ return 0;
+ }
+ });
+
+ $self->{list} = new Gtk2::SimpleList(@listColumns);
+ for $i (0..($number - 1))
+ {
+ $self->{list}->set_column_editable($i, 1);
+ }
+ $self->{list}->unset_rows_drag_source;
+ $self->{list}->unset_rows_drag_dest;
+ $self->{list}->set_reorderable(1);
+ #($self->{list}->get_column(0)->get_cell_renderers)[0]->set('wrap-mode' => 'word');
+
+ for $i (0..($number - 1))
+ {
+ $self->{list}->get_column($i)->set_resizable(1);
+ }
+ my $scroll = new Gtk2::ScrolledWindow;
+ $scroll->set_policy ('automatic', 'automatic');
+ $scroll->set_shadow_type('etched-in');
+ $scroll->set_size_request(-1, 120);
+ $scroll->add($self->{list});
+ $self->{box}->pack_start($scroll, 1, 1, 2);
+ if (!$readonly)
+ {
+ $self->{addButton} = GCButton->newFromStock('gtk-add', 0);
+ $self->{addButton}->signal_connect('clicked' => sub {
+ $self->addValues;
+ });
+ $self->{removeButton} = GCButton->newFromStock('gtk-remove', 0);
+ $hboxActions->pack_start($self->{addButton}, 0, 0, 6);
+ $hboxActions->pack_start($self->{removeButton}, 0, 0, 6);
+ }
+ else
+ {
+ $self->{removeButton} = GCButton->newFromStock('gtk-remove', 0);
+ $self->{clearButton} = GCButton->newFromStock('gtk-clear', 0);
+ $self->{clearButton}->signal_connect('clicked' => sub {
+ $self->clear;
+ });
+ $hboxActions->pack_start($self->{removeButton}, 1, 0, 6);
+ $hboxActions->pack_start($self->{clearButton}, 1, 0, 6);
+ }
+ $self->{box}->pack_start($hboxActions, 0, 0, 6)
+ if $readonly < 2;
+
+ $self->{removeButton}->signal_connect('clicked' => sub {
+ my @idx = $self->{list}->get_selected_indices;
+ my $selected = $idx[0];
+ splice @{$self->{list}->{data}}, $selected, 1;
+ $selected-- if ($selected >= scalar(@{$self->{list}->{data}}));
+ $selected = 0 if $selected < 0 ;
+ $self->{list}->select($selected);
+ });
+
+ $self->{list}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ((!$self->{readonly}) && ($key eq 'Delete'))
+ {
+ $self->{removeButton}->activate;
+ return 1;
+ }
+ # Let key be managed by Gtk2
+ return 0;
+ });
+
+
+ $self->pack_start($self->{box},1,$self->{readonly},0);
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{list}->get_model->signal_connect('row-inserted' => sub {
+ $self->setChanged;
+ });
+ $self->{list}->get_model->signal_connect('row-deleted' => sub {
+ $self->setChanged;
+ });
+ $self->{list}->get_model->signal_connect('row-changed' => sub {
+ $self->setChanged;
+ });
+ }
+
+ sub expand
+ {
+ my $self = shift;
+ $self->set_child_packing($self->{box},1,1,0,'start');
+ }
+
+ sub addValues
+ {
+ my ($self, @values) = @_;
+ if (!$self->{readonly})
+ {
+ for my $i (0..($self->{number} - 1))
+ {
+ $values[$i] = $self->{entries}->[$i]->getValue if !$values[$i];
+ $self->{entries}->[$i]->addHistory($values[$i])
+ if $self->{withHistory} && $self->{withHistoryField}->[$i];
+ $self->{entries}->[$i]->clear;
+ }
+ }
+ # Check that at least one value is not empty
+ my $isEmpty = 1;
+ for my $val (@values)
+ {
+ if ($val)
+ {
+ $isEmpty = 0;
+ last;
+ }
+ }
+ if (!$isEmpty)
+ {
+ push @{$self->{list}->{data}}, \@values;
+ $self->{list}->select($#{$self->{list}->{data}});
+ my $path = $self->{list}->get_selection->get_selected_rows;
+ $self->{list}->scroll_to_cell($path) if $path;
+ }
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ my $formated = shift;
+
+ if ($formated)
+ {
+ return GCPreProcess::multipleList($self->{list}->{data}, $self->{number});
+ }
+ else
+ {
+ # As data in list is a tied array, we need to copy all the values
+ my @value;
+ foreach (@{$self->{list}->{data}})
+ {
+ push @value, [];
+ foreach my $col(@$_)
+ {
+ push @{$value[-1]}, $col;
+ }
+ }
+ return \@value;
+ }
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ if (ref($value) eq 'ARRAY')
+ {
+ @{$self->{list}->{data}} = @{$value};
+ }
+ else
+ {
+ # The separator used was ; instead of ,
+ $value =~ s/;/,/g if $value !~ /,/;
+ @{$self->{list}->{data}} = ();
+ my @values = split m/,/, $value;
+ foreach my $entry (@values)
+ {
+ my @items = split m/;/, $entry;
+ s/^\s*// foreach(@items);
+ push @{$self->{list}->{data}}, \@items;
+ }
+ }
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+ return if $self->{readonly};
+ $self->{addButton}->set_sensitive(!$locked);
+ $self->{removeButton}->set_sensitive(!$locked);
+ foreach (@{$self->{entries}})
+ {
+ $_->lock($locked);
+ }
+ }
+
+ sub addHistory
+ {
+ my $self = shift;
+ my $value = (scalar @_) ? shift : $self->getValue;
+ my $noUpdate = shift;
+
+ return if $self->{readonly};
+ my $i;
+ my $item;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach (@$value)
+ {
+ $i = 0;
+ foreach $item(@$_)
+ {
+ $self->{entries}->[$i]->addHistory($item, $noUpdate) if $self->{withHistoryField}->[$i];
+ $i++;
+ }
+ }
+ }
+ else
+ {
+ # The separator used was ; instead of ,
+ $value =~ s/;/,/g if $value !~ /,/;
+ my @values = split m/,/, $value;
+ foreach (@values)
+ {
+ my @items = split m/;/;
+ $i = 0;
+ foreach my $item(@items)
+ {
+ $self->{entries}->[$i]->addHistory($item, $noUpdate) if $self->{withHistoryField}->[$i];
+ $i++;
+ }
+ #push @{$self->{list}->{data}}, \@items;
+ }
+ }
+ }
+
+ sub setDropDown
+ {
+ my $self = shift;
+
+ my $i = 0;
+ foreach (@{$self->{entries}})
+ {
+ $_->setDropDown if $self->{withHistoryField}->[$i];
+ $i++;
+ }
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ return [] if $self->{readonly};
+ my @array;
+ my $i=0;
+ foreach (@{$self->{entries}})
+ {
+ my $val=[];
+ $val=$_->getValues if ($self->{withHistoryField}->[$i++]);
+ push @array, $val;
+ }
+ # = sort keys %{$self->{history}};
+ return \@array;
+ }
+
+ sub setValues
+ {
+ my ($self, $values) = @_;
+ return if $self->{readonly};
+ my $i = 0;
+ foreach (@$values)
+ {
+ $self->{entries}->[$i]->setValues($_) if ($self->{withHistoryField}->[$i]);
+ $i++;
+ }
+ }
+}
+
+
+{
+ package GCItemImage;
+
+ use Glib::Object::Subclass
+ Gtk2::Image::
+ ;
+
+ @GCItemImage::ISA = ('Gtk2::Image', 'GCGraphicComponent');
+
+ use File::Spec;
+ use File::Basename;
+
+ sub new
+ {
+ my ($proto, $options, $parent, $fixedSize, $width, $height) = @_;
+ my $class = ref($proto) || $proto;
+# my $self = Gtk2::Image->new_from_file($parent->{defaultImage});
+ my $self = Gtk2::Image->new;
+ $self->{options} = $options;
+ #$self->{defaultImage} = $defaultImage;
+ $self->{parent} = $parent;
+ $self->{displayedImage} = '';
+ $self->{fixedSize} = $fixedSize;
+ bless ($self, $class);
+ if ($width && $height)
+ {
+ $self->{width} = $width;
+ $self->{height} = $height;
+ }
+ else
+ {
+ $self->{width} = 120;
+ $self->{height} = 160;
+ }
+ $self->{immediate} = 0;
+ return $self;
+ }
+
+ sub setImmediate
+ {
+ my ($self) = @_;
+ $self->{immediate} = 1;
+ }
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{trackState} = 1;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub setValue
+ {
+ my ($self, $displayedImage, $placer) = @_;
+ $self->{displayedImage} = $displayedImage;
+ $self->setChanged if $self->{trackState};
+ if ($self->{immediate})
+ {
+ $self->setPicture;
+ }
+ else
+ {
+ Glib::Source->remove($self->{timer})
+ if $self->{timer};
+ $self->{timer} = Glib::Timeout->add(100, sub {
+ $self->setPicture;
+ $placer->placeImg if $placer;
+ return 0;
+ });
+ }
+ }
+
+ sub setPicture
+ {
+ my $self = shift;
+ $self->{timer} = 0;
+ my $displayedImage = GCUtils::getDisplayedImage($self->{displayedImage},
+ $self->{parent}->{defaultImage},
+ $self->{options}->file);
+ my $pixbuf;
+ eval
+ {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($displayedImage);
+ };
+ if ($@)
+ {
+ $displayedImage = $self->{parent}->{defaultImage};
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($displayedImage);
+ }
+ $self->{realImage} = $displayedImage;
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf, $self->{width}, $self->{height});
+ $self->set_from_pixbuf($pixbuf);
+ $self->set_size_request($self->{width}, $self->{height}) if $self->{fixedSize};
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{displayedImage};
+ }
+
+ sub getFile
+ {
+ my $self = shift;
+ return $self->{realImage};
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{width} = $value;
+ }
+
+ sub setHeight
+ {
+ my ($self, $value) = @_;
+ $self->{height} = $value;
+ }
+
+ sub getSize
+ {
+ my $self = shift;
+ my $pixbuf = $self->get_pixbuf;
+ return ($pixbuf->get_width, $pixbuf->get_height);
+ }
+}
+
+
+our $hasGnome2VFS;
+BEGIN {
+ eval 'use Gnome2::VFS';
+ if ($@)
+ {
+ $hasGnome2VFS = 0;
+ }
+ else
+ {
+ $hasGnome2VFS = 1;
+ Gnome2::VFS->init();
+ }
+}
+
+{
+ package GCImageButton;
+
+ use Glib::Object::Subclass
+ Gtk2::Button::
+ ;
+
+ @GCImageButton::ISA = ('Gtk2::Button', 'GCGraphicComponent');
+
+ use File::Basename;
+ use Encode;
+
+ sub animateImg
+ {
+ my ($self, $from, $to) = @_;
+ my $pixbuf1 = Gtk2::Gdk::Pixbuf->new_from_file($from);
+ $pixbuf1 = GCUtils::scaleMaxPixbuf($pixbuf1, $self->{img}->{width}, $self->{img}->{height});
+ my $pixbuf2 = Gtk2::Gdk::Pixbuf->new_from_file($to);
+ $pixbuf2 = GCUtils::scaleMaxPixbuf($pixbuf2, $self->{img}->{width}, $self->{img}->{height});
+ my $height = $pixbuf2->get_height;
+ my $width = $pixbuf2->get_width;
+ foreach my $i(0..20)
+ {
+ Glib::Timeout->add(30*$i, sub {
+ my $pixbufA = $pixbuf1->copy;
+ my $pixbufB = $pixbuf2->copy;
+ $pixbufA->composite($pixbufB, 0, 0, int($width - (($i/20)*$width)), $height, 0, 0, 1, 1, 'nearest', 255);
+ $self->{img}->set_from_pixbuf($pixbufB);
+ });
+ }
+ }
+
+ sub setImg
+ {
+ my ($self, $value) = @_;
+ $self->{img}->setValue($value, $self);
+ }
+
+ sub placeImg
+ {
+ my ($self) = @_;
+ my ($picWidth, $picHeight) = $self->{img}->getSize;
+ my ($buttonWidth, $buttonHeight) = ($self->allocation->width, $self->allocation->height);
+ my $x = ($buttonWidth - $picWidth - $GCUtils::margin)/ 2;
+ my $y = ($buttonHeight -$picHeight - $GCUtils::margin)/ 2;
+
+ # Don't allow negative positions, can happen when button has not been allocated a width/height yet
+ $x = 0 if ($x < 0);
+ $y = 0 if ($y < 0);
+
+ $self->{layout}->move($self->{img}, $x, $y);
+ }
+
+ sub changeState
+ {
+ my $self = shift;
+ if ($self->{trackState})
+ {
+ if ($self->{flipped})
+ {
+ $self->{linkedComponent}->setChanged;
+ }
+ else
+ {
+ $self->setChanged;
+ }
+ }
+ }
+
+ sub clearImage
+ {
+ my $self = shift;
+
+ $self->changeState;
+ $self->{mainParent}->checkPictureToBeRemoved($self->{imageFile});
+ $self->setValueWithParent('');
+ }
+
+ sub changeImage
+ {
+ my ($self, $fileName) = @_;
+ return 0 if $self->{locked};
+ if (!$fileName)
+ {
+ my $imageDialog = GCFileChooserDialog->new($self->{parent}->{lang}->{PanelImageTitle}, $self->{mainParent}, 'open');
+ $imageDialog->setWithImagePreview(1);
+
+ my $currentFile = $self->{img}->getValue;
+ if ($currentFile)
+ {
+ $imageDialog->set_filename($currentFile);
+ }
+ else
+ {
+ $imageDialog->set_filename($self->{previousDirectory});
+ }
+ my $response = $imageDialog->run;
+ $fileName = $imageDialog->get_filename;
+ $imageDialog->destroy;
+
+ $self->{parent}->showMe;
+ if ($response eq 'ok')
+ {
+ $self->{previousDirectory} = dirname($fileName);
+ $self->setChanged if $self->{trackState};
+ }
+ else
+ {
+ return;
+ }
+ }
+
+ my $ref = ($self->{flipped} ? $self->{backPic} : $self->{imageFile});
+ if ($fileName ne $ref)
+ {
+ $self->{mainParent}->checkPictureToBeRemoved($ref);
+ $self->changeState;
+ }
+ my $image = $self->{mainParent}->transformPicturePath($fileName);
+ $self->setValueWithParent($image);
+ return;
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return $self->getValue eq '';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->setChanged if $self->{trackState};
+ $self->setActualValue($value);
+ }
+
+ sub setValueWithParent
+ {
+ my ($self, $value, $keepWatcher) = @_;
+
+ $self->setActualValue($value, $keepWatcher, $self->{flipped});
+ if ($self->{isCover} && !$self->{flipped})
+ {
+ $self->{mainParent}->{items}->updateSelectedItemInfoFromPanel(0, [$self->{name}]);
+ $self->{hasChanged} = 0 if $self->{parent} eq $self->{mainParent}->{panel} && !$keepWatcher;
+ }
+ }
+
+ sub setActualValue
+ {
+ my ($self, $value, $keepWatcher, $flipped) = @_;
+ Glib::Source->remove($self->{fileWatcher})
+ if $self->{fileWatcher} && !$keepWatcher;
+ if ($flipped)
+ {
+ $self->{backPic} = $value;
+ }
+ else
+ {
+ $self->{imageFile} = $value;
+ }
+ $self->setImg($value);
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ if ($self->{flipped})
+ {
+ return $self->{imageFile};
+ }
+ return $self->{img}->getValue;
+ }
+
+ sub setLinkedActivated
+ {
+ my ($self, $value) = @_;
+ $self->flipImage(1) if $self->{flipped};
+ $self->{flipActivated} = $value;
+ }
+
+ sub flipImage
+ {
+ my ($self, $noButton) = @_;
+ my $newLabel;
+ if ($self->{flipped})
+ {
+ $self->setImg($self->{imageFile});
+ $self->{frontFlipImage}->show if !$noButton;
+ $self->{backFlipImage}->hide;
+ #$self->animateImg($self->{backPic}, $self->{imageFile});
+ }
+ else
+ {
+ $self->setImg($self->{backPic});
+ $self->{backFlipImage}->show if !$noButton;
+ $self->{frontFlipImage}->hide;
+ #$self->animateImg($self->{imageFile}, $self->{backPic});
+ }
+ $self->{flipped} = !$self->{flipped};
+ }
+
+ sub setLinkedValue
+ {
+ my ($self, $linkedValue) = @_;
+ $self->setChanged if $self->{trackState};
+ $self->{backPic} = $linkedValue;
+ $self->setImg($linkedValue) if $self->{flipped};
+ }
+
+ sub getLinkedValue
+ {
+ my ($self, $linkedValue) = @_;
+ return $self->{backPic};
+ }
+
+ sub setLinkedComponent
+ {
+ my ($self, $linked) = @_;
+ $self->{linkedComponent} = $linked;
+
+ $self->{flipActivated} = 1;
+ $self->{frontFlipImage} = Gtk2::Image->new_from_file($ENV{GCS_SHARE_DIR}.'/overlays/flip.png');
+ $self->{frontFlipImage}->set_no_show_all(1);
+ $self->{backFlipImage} = Gtk2::Image->new_from_file($ENV{GCS_SHARE_DIR}.'/overlays/flip2.png');
+ $self->{backFlipImage}->set_no_show_all(1);
+ my $pixbuf = $self->{frontFlipImage}->get_pixbuf;
+ my ($picWidth, $picHeight) = ($pixbuf->get_width, $pixbuf->get_height);
+
+ $self->{addedFlipButton} = 0;
+ $self->signal_connect('enter' => sub {
+ return if ! $self->{flipActivated};
+ if (!$self->{addedFlipButton})
+ {
+ $self->{flipX} = $self->{width} - $picWidth - $GCUtils::margin;
+ $self->{flipY} = $self->{height} - $picHeight - $GCUtils::margin;
+ $self->{layout}->put($self->{frontFlipImage},
+ $self->{flipX},
+ $self->{flipY});
+ $self->{layout}->put($self->{backFlipImage},
+ $self->{flipX},
+ $self->{flipY});
+ $self->{addedFlipButton} = 1;
+ }
+ if ($self->{flipped})
+ {
+ $self->{backFlipImage}->show;
+ }
+ else
+ {
+ $self->{frontFlipImage}->show;
+ }
+ });
+ $self->signal_connect('leave' => sub {
+ $self->{frontFlipImage}->hide;
+ $self->{backFlipImage}->hide;
+ });
+ $self->signal_connect('button-release-event' => sub {
+ return 0 if ! $self->{flipActivated};
+ my ($button, $event) = @_;
+ my ($x, $y) = $event->get_coords;
+ if (($x > $self->{flipX}) && ($y > $self->{flipY}))
+ {
+ $self->flipImage;
+ $self->set_sensitive(0);
+ $self->released;
+ $self->set_sensitive(1);
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ $self->signal_connect('key-press-event' => sub {
+ return 0 if ! $self->{flipActivated};
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+
+ if (($key eq 'f') || ($key eq 'BackSpace'))
+ {
+ $self->flipImage;
+ return 1;
+ }
+ return 0;
+ });
+
+ $self->signal_connect('query_tooltip' => sub {
+ my ($window, $x, $y, $keyboard_mode, $tip) = @_;
+ return if $self->{settingTip};
+ $self->{settingTip} = 1;
+ if ($self->{flipActivated} && ($x > $self->{flipX}) && ($y > $self->{flipY}))
+ {
+ $self->{tooltips}->set_tip($self, $self->{flipped} ?
+ $self->{parent}->{lang}->{ContextImgFront} :
+ $self->{parent}->{lang}->{ContextImgBack});
+ }
+ else
+ {
+ $self->{tooltips}->set_tip($self, $self->{tip});
+ }
+ $self->{settingTip} = 0;
+ return 0;
+ });
+
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->setValue('');
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $img, $isCover, $default) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $default = 'view' if !$default;
+
+ $self->{layout} = new Gtk2::Fixed;
+ $self->{layout}->put($img, 0, 0);
+ $self->add($self->{layout});
+
+ $self->{img} = $img;
+ $self->{default} = $default;
+ #$self->set_size_request(130,170);
+ $self->{width} = -1;
+ $self->{height} = -1;
+ $self->{imageFile} = $img->getValue;
+
+ # True if this is the cover used in image mode
+ $self->{isCover} = $isCover;
+
+ $self->{parent} = $parent;
+ $self->getMainParent;
+ $self->{tooltips} = $self->{mainParent}->{tooltips};
+
+ $self->{tip} = ($default eq 'open') ? $parent->{lang}->{PanelImageTipOpen} : $parent->{lang}->{PanelImageTipView};
+ $self->{tip} .= $parent->{lang}->{PanelImageTipMenu};
+ $self->{tooltips}->set_tip($self, $self->{tip});
+
+ $self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+ $self->createContextMenu();
+ $self->{imgContext}->popup(undef, undef, undef, undef, $event->button, $event->time);
+ return 0;
+ });
+
+ $self->signal_connect('clicked' => sub {
+ $self->changeImage if $self->{default} eq 'open';
+ $self->showImage if $self->{default} eq 'view';
+ return 1;
+ });
+
+ #Drag and drop a picture on a button
+ $self->drag_dest_set('all', ['copy','private','default','move','link','ask']);
+ my $target_list = Gtk2::TargetList->new();
+ my $atom1 = Gtk2::Gdk::Atom->new('text/uri-list');
+ my $atom2 = Gtk2::Gdk::Atom->new('text/plain');
+ $target_list->add($atom1, 0, 0);
+ $target_list->add($atom2, 0, 0);
+ if ($^O =~ /win32/i)
+ {
+ my $atom2 = Gtk2::Gdk::Atom->new('DROPFILES_DND');
+ $target_list->add($atom2, 0, 0);
+ }
+ $self->drag_dest_set_target_list($target_list);
+ $self->signal_connect(drag_data_received => sub {
+ my ($widget, $context, $widget_x, $widget_y, $data, $info,$time) = @_;
+ my @files = split /\n/, $data->data;
+ my $fileName = $files[0];
+ if ($fileName =~ /^http/)
+ {
+ $fileName = $self->{mainParent}->downloadPicture($fileName);
+ }
+ else
+ {
+ $fileName = Glib::filename_from_uri $fileName;
+ $fileName = decode('utf8', $fileName);
+ $fileName =~ s|^file://?(.*)\W*$|$1|;
+ $fileName =~ s|^/*|| if ($^O =~ /win32/i);
+ $fileName =~ s/.$//ms;
+ $fileName =~ s/%20/ /g;
+ }
+ $self->changeImage($fileName);
+ });
+
+ $self->{previousDirectory} = '';
+ $self->{flipped} = 0;
+ $self->{flipActivated} = 0;
+
+ return $self;
+ }
+
+ sub createContextMenu
+ {
+ my $self = shift;
+
+ my $parent;
+ $parent = $self->{parent};
+
+ $self->{imgContext} = new Gtk2::Menu;
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ $self->{imgContext}->append(Gtk2::TearoffMenuItem->new());
+ }
+
+ $self->{itemOpen} = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{ContextChooseImage});
+ my $itemOpenImage = Gtk2::Image->new_from_stock('gtk-open', 'menu');
+ $self->{itemOpen}->set_image($itemOpenImage);
+ # This item will be deactivated if the component is locked
+ $self->{itemOpen}->set_sensitive(!$self->{locked});
+ $self->{itemOpen}->signal_connect("activate" , sub {
+ $self->changeImage;
+ });
+ $self->{imgContext}->append($self->{itemOpen});
+ $self->{itemShow} = Gtk2::ImageMenuItem->new_from_stock('gtk-zoom-100',undef);
+ $self->{itemShow}->signal_connect("activate" , sub {
+ $self->showImage;
+ });
+ # Disable for default image
+ $self->{itemShow}->set_sensitive(0) if $self->isDefaultImage();
+ $self->{imgContext}->append($self->{itemShow});
+
+ if ($self->{linkedComponent})
+ {
+ $self->{itemFlip} = Gtk2::MenuItem->new($self->{flipped} ?
+ $parent->{lang}->{ContextImgFront} :
+ $parent->{lang}->{ContextImgBack});
+ $self->{itemFlip}->signal_connect("activate" , sub {
+ $self->flipImage;
+ });
+ $self->{imgContext}->append($self->{itemFlip});
+ }
+
+ $self->{itemClear} = Gtk2::ImageMenuItem->new_from_stock('gtk-clear',undef);
+ # This item will be deactivated if the component is locked
+ $self->{itemClear}->set_sensitive(!$self->{locked});
+ $self->{itemClear}->signal_connect("activate" , sub {
+ $self->clearImage;
+ });
+ $self->{imgContext}->append($self->{itemClear});
+ # Disable for default image
+ $self->{itemClear}->set_sensitive(0) if $self->isDefaultImage();
+ $self->{imgContext}->show_all;
+
+ my $itemOpenWith = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{ContextOpenWith});
+ $self->{menuOpenWith} = Gtk2::Menu->new;
+
+ if ($hasGnome2VFS && ($parent->{options}->programs eq 'system' || $parent->{options}->imageEditor eq ''))
+ {
+ # Get applications for mime types corresponding with image
+
+ # Get all editors/viewers for jpeg file format
+ my $mimeTest = Gnome2::VFS::Mime::Type->new ("image/jpeg");
+ my @mimeList = $mimeTest->get_short_list_applications;
+
+ # Add applications to open with list
+ foreach (@mimeList)
+ {
+ my $launchApp = $_;
+ my $item = Gtk2::MenuItem->new_with_mnemonic($launchApp->get_name);
+ $item->signal_connect ('activate' => sub {
+ $self->openWith($launchApp);
+ });
+ $self->{menuOpenWith}->append($item);
+ }
+
+ #Gnome2::VFS -> shutdown();
+ }
+ elsif ($parent->{options}->programs eq 'system' || $parent->{options}->imageEditor eq '')
+ {
+ # Can't parse applications, so use system default app
+ my $item = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{ContextImageEditor});
+
+ my $command;
+ $command = ($^O =~ /win32/i) ? ''
+ : ($^O =~ /macos/i) ? '/usr/bin/open'
+ : $ENV{GCS_SHARE_DIR}.'/helpers/xdg-open';
+
+ # Not sure if this is correct, haven't tested with Windows:
+ if ($^O =~ /win32/i)
+ {
+ $command = '"'.$command.'"' if $command;
+ }
+
+ $item->signal_connect ('activate' => sub {
+ $self->openWithImageEditor($command);
+ });
+
+ $self->{menuOpenWith}->append($item);
+ }
+ else
+ {
+ # Use user defined app
+ my $item = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{ContextImageEditor});
+ $item->signal_connect ('activate' => sub {
+ $self->openWithImageEditor($parent->{options}->imageEditor);
+ });
+
+ $self->{menuOpenWith}->append($item);
+ }
+
+
+ $itemOpenWith->set_submenu($self->{menuOpenWith});
+
+ # Disable for default image
+ $itemOpenWith->set_sensitive(0) if $self->isDefaultImage();
+
+ $self->{imgContext}->append($itemOpenWith);
+ $self->{imgContext}->show_all;
+
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->{trackState} = 1;
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->{locked} = $locked;
+ }
+
+ sub showImage
+ {
+ my $self = shift;
+ $self->{mainParent}->launch($self->{img}->getValue, 'image');
+ }
+
+ sub isDefaultImage
+ {
+ my ($self) = @_;
+
+ if ($self->{img}->getFile eq $self->{parent}->{defaultImage})
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ sub openWith
+ {
+ my ($self, $app) = @_;
+ my $cmd;
+ my $escFileName;
+
+ # Ultra hacky workaround, because $app->{launch} segfaults. See http://bugzilla.gnome.org/show_bug.cgi?id=315049
+ # Probably should change to gvfs when perl modules are available
+
+ if ($app->{command} =~ m/(\w*)/)
+ {
+ $cmd = $1;
+ }
+
+ $escFileName = $self->{img}->getFile;
+ $escFileName =~ s/\ /%20/g;
+ $self->editPicture("$cmd file://$escFileName");
+ }
+
+ sub openWithImageEditor
+ {
+ my ($self, $editor) = @_;
+ my $file = $self->{img}->getFile;
+ $file =~ s|/|\\|g if ($^O =~ /win32/i);
+ $self->editPicture("$editor \"$file\"");
+ }
+
+ sub editPicture
+ {
+ my ($self, $commandLine) = @_;
+ my $file = $self->{img}->getFile;
+
+ my $flipped = $self->{flipped};
+ $self->{fileWatchDays} = -M $file;
+ $self->{fileWatcher} = Glib::Timeout->add(1000, sub {
+ my $currentDays = -M $file;
+ if ($currentDays < $self->{fileWatchDays})
+ {
+ $self->changeState;
+ # We remove it from the pixbuf cache in items view. Useful
+ # for detailed list to be sure it will be re-loaded
+ delete $self->{mainParent}->{itemsView}->{cache}->{$file}
+ if $self->{mainParent}->{itemsView}->{cache};
+ $self->setValueWithParent($self->{img}->getValue, 1, $flipped);
+ $self->{fileWatchDays} = $currentDays;
+ }
+ return 1;
+ });
+ $self->{mainParent}->launch($commandLine, 'program', 1);
+ }
+
+ sub setWidth
+ {
+ my ($self, $value) = @_;
+ $self->{width} = $value;
+ $self->set_size_request($value, $self->{height});
+ $self->{img}->setWidth($value - $GCUtils::margin);
+ }
+
+ sub setHeight
+ {
+ my ($self, $value) = @_;
+ $self->{height} = $value;
+ $self->set_size_request($self->{width}, $value);
+ $self->{img}->setHeight($value - $GCUtils::margin);
+ }
+
+}
+
+{
+ package GCMenuList;
+
+ use Glib::Object::Subclass
+ Gtk2::ComboBox::
+ ;
+
+ @GCMenuList::ISA = ('Gtk2::ComboBox', 'GCGraphicComponent');
+
+ our $separatorValue = 'GCSSeparator';
+
+ sub isEmpty
+ {
+ my $self = shift;
+
+ return 1 if ! defined $self->get_active_iter;
+ return ($self->{listModel}->get($self->get_active_iter))[1] eq '';
+ my $idx = $self->get_history;
+ $idx-- if $idx >= $self->{separatorPosition};
+ $idx = 0 if $idx < 0;
+ return $self->{'values'}->[$idx]->{displayed} eq '';
+ }
+
+ sub valueToDisplayed
+ {
+ my ($self, $value) = @_;
+
+ foreach (@{$self->{'values'}})
+ {
+ return $_->{displayed} if $_->{value} eq $value
+ }
+ return '';
+ }
+
+ sub getValue
+ {
+ my ($self, $formatted) = @_;
+ my $iter = $self->get_active_iter;
+ my $value = '';
+ $value = ($self->{listModel}->get($iter))[0] if $iter;
+ $value = $self->valueToDisplayed($value) if $formatted;
+ return $value;
+ }
+
+ sub getDisplayedValue
+ {
+ my $self = shift;
+ my $iter = $self->get_active_iter;
+ return ($self->{listModel}->get($iter))[1] if $iter;
+ return '';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $value = 0 if !$value;
+ my $i = 0;
+ if ($value)
+ {
+ foreach (@{$self->{values}})
+ {
+ last if $_->{value} eq $value;
+ $i++;
+ }
+ }
+ $i++ if $i >= $self->{separatorPosition};
+ $i-- if ($self->{default} == -1) && ($i >= $self->{count});
+ $self->set_active($i)
+ if ($i < scalar(@{$self->{values}}));
+ }
+
+ sub clear
+ {
+ my $self = shift;
+ $self->set_active(0);
+ }
+
+ sub lock
+ {
+ my ($self, $locked) = @_;
+
+ $self->set_sensitive(!$locked);
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+
+ my @values;
+ return $self->{values};
+ }
+
+ sub setValues
+ {
+ my ($self, $values, $separatorPosition, $preserveValue) = @_;
+ if ($self->{title})
+ {
+ $separatorPosition = 1;
+ unshift @$values, {value => -1, displayed => $self->{title}};
+ }
+ my $model = $self->{listModel};
+ my $previous = $self->getValue if $preserveValue;
+ $self->{values} = $values;
+ $self->{separatorPosition} = $separatorPosition || 9999;
+
+ $model->clear;
+ my $i = 0;
+ foreach (@$values)
+ {
+ if ($i == $self->{separatorPosition})
+ {
+ $model->set($model->append, 0 => $GCMenuList::separatorValue, 1 => '');
+ $i++;
+ }
+ $model->set($model->append,
+ 0 => $_->{value},
+ 1 => $_->{displayed});
+ $i++;
+ }
+
+ $self->{count} = $i;
+ $self->setValue($previous) if $preserveValue;
+ $self->set_active(0) if !$preserveValue;
+ }
+
+ sub setLastForDefault
+ {
+ my $self = shift;
+ $self->{default} = -1;
+ }
+
+ sub setTitle
+ {
+ my ($self, $title) = @_;
+ $self->{title} = $title;
+ }
+
+ sub new
+ {
+ my ($proto, $values, $separatorPosition) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->{listModel} = Gtk2::ListStore->new('Glib::String', 'Glib::String');
+ $self->set_model($self->{listModel});
+ my $renderer = Gtk2::CellRendererText->new;
+ $self->pack_start($renderer, 1);
+ $self->add_attribute($renderer, text => 1);
+ $self->set_row_separator_func(sub {
+ my ($model, $iter) = @_;
+ my @values = $model->get($iter, 0);
+ my $val = '';
+ $val = $values[0] if defined $values[0];
+ return $val eq $GCMenuList::separatorValue;
+ });
+
+ $self->setValues($values, $separatorPosition) if $values;
+ $self->{default} = 0;
+ $self->set_focus_on_click(1);
+ return $self;
+ }
+
+ sub activateStateTracking
+ {
+ my $self = shift;
+ $self->signal_connect('changed' => sub {
+ $self->setChanged;
+ });
+ }
+}
+
+{
+ package GCHeaderLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::Label::
+ ;
+
+ @GCHeaderLabel::ISA = ('Gtk2::Label', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->setText($label);
+ $self->set_alignment(0,1);
+
+ return $self;
+ }
+
+ sub setText
+ {
+ my ($self, $label) = @_;
+ $self->set_markup('<b>'.$label.'</b>');
+ }
+}
+
+{
+ package GCLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::Label::
+ ;
+
+ @GCLabel::ISA = ('Gtk2::Label', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label, $disableMarkup) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ $self->set_markup($label) unless $disableMarkup;
+ $self->set_label($label) if $disableMarkup;
+ $self->set_alignment(0,0.5);
+ return $self;
+ }
+}
+
+{
+ package GCColorLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::EventBox::
+ ;
+
+ @GCColorLabel::ISA = ('Gtk2::EventBox', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ sub new
+ {
+ my ($proto, $color, $listType) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+
+ $listType = 0 if !$listType;
+ $self->modify_bg('normal', $color);
+ $self->{label} = Gtk2::Label->new;
+ $self->{label}->show;
+ $self->{hboxFill} = new Gtk2::HBox(0,0);
+ $self->{hboxFill}->pack_start($self->{label},1,1,0);
+ $self->add($self->{hboxFill});
+ $self->set_alignment(0,0.5);
+ $self->initHistory($listType);
+
+ return $self;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub setMarkup
+ {
+ my ($self, $text) = @_;
+
+ $self->{label}->set_markup($text);
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ (my $label = $self->{label}->get_label) =~ s/<.*?>(.*?)<\/.*?>/$1/g;
+ return $label;
+ }
+
+ sub setBgColor
+ {
+ my ($self, $color) = @_;
+ $self->modify_bg('normal', $color);
+ }
+
+ sub set_justify
+ {
+ my ($self, $value) = @_;
+ $self->{label}->set_justify($value);
+ $self->{label}->set_alignment(0.5,0) if $value eq 'center';
+ $self->{label}->set_alignment(1,0) if $value eq 'right';
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ $name =~ s/.*?::(.*)/$1/;
+ $self->{label}->$name(@_);
+ }
+}
+
+{
+ package GCColorLink;
+
+ use Glib::Object::Subclass
+ Gtk2::EventBox::
+ ;
+
+ @GCColorLink::ISA = ('GCColorLabel');
+
+ sub new
+ {
+ my ($proto, $color, $opener) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($color);
+ bless ($self, $class);
+ $self->{opener} = $opener;
+ $self->signal_connect('button-release-event' => sub {
+ my $value = $self->getValue;
+ return if !$value;
+ $self->{opener}->launch($value, 'url');
+ });
+ $self->signal_connect('enter-notify-event' => sub {
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('hand2'))
+ if $self->getValue;
+ });
+ #$self->window->set_cursor(Gtk2::Gdk::Cursor->new('watch'));
+ return $self;
+ }
+}
+
+{
+ package GCColorLongLabel;
+
+ use Glib::Object::Subclass
+ Gtk2::TextView::
+ ;
+
+ @GCColorLongLabel::ISA = ('Gtk2::TextView', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $color) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $self->set_editable(0);
+ $self->set_wrap_mode('word');
+ $self->{background} = $color;
+ $self->modify_base('normal', $color);
+ $self->modify_bg('normal', $color);
+ $self->set_border_width($GCUtils::halfMargin);
+
+ my $layout = $self->create_pango_layout('G');
+ my (undef, $rect) = $layout->get_pixel_extents;
+ $self->{em} = 1.5 * $rect->{height};
+
+
+ return $self;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub setMarkup
+ {
+ my ($self, $text) = @_;
+
+ #$text =~ s/&/&amp;/g;
+ if ($self->{resize})
+ {
+ $self->resize;
+ }
+ else
+ {
+ my $buffer = $self->get_buffer;
+ $self->get_buffer->set_text('');
+ $text =~ s|<span ([^>]*?)>([^<]*?)</span>|$2|;
+ if ($self->{spanTag})
+ {
+ $buffer->get('tag-table')->remove($self->{spanTag});
+ }
+ $self->{spanTag} = $buffer->create_tag('span', $self->getTagFromSpan($1));
+ $buffer->insert_with_tags_by_name ($buffer->get_start_iter, $text, 'span');
+ }
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ (my $label = $self) =~ s/<.*?>(.*?)<\/.*?>/$1/g;
+ return $label;
+ }
+
+}
+
+{
+ package GCColorTable;
+
+ use Glib::Object::Subclass
+ Gtk2::Table::
+ ;
+
+ @GCColorTable::ISA = ('Gtk2::Table', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ sub new
+ {
+ my ($proto, $columns, $labels, $headerStyle, $contentStyle, $topHeader) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(1, $columns);
+
+ bless ($self, $class);
+
+ $self->set_col_spacings(3);
+ $self->set_row_spacings(3);
+ $self->{number} = $columns;
+ $self->{style} = $contentStyle;
+ $self->{firstRow} = 0;
+ if ($topHeader)
+ {
+ $self->{firstRow}++;
+ my $top = new GCColorLabel($headerStyle->{bgColor});
+ $top->set_padding($GCUtils::halfMargin,$GCUtils::halfMargin);
+ $top->setMarkup('<span '.$headerStyle->{style}.'>'.$topHeader.'</span>');
+ $self->attach($top, 0, $columns, 0, 1, ['expand', 'fill'], 'fill', 0, 0);
+ }
+ my $i;
+ if ($columns > 1)
+ {
+ for $i(0..($columns - 1))
+ {
+ my $header = new GCColorLabel($headerStyle->{bgColor});
+ $header->set_padding($GCUtils::halfMargin,$GCUtils::halfMargin);
+ $header->setMarkup('<span '.$headerStyle->{style}.'>'.$labels->[$i].'</span>');
+ $self->attach($header, $i, $i + 1, $self->{firstRow}, $self->{firstRow} + 1, ['expand', 'fill'], 'fill', 0, 0);
+ }
+ $self->{firstRow}++;
+ }
+ $self->initHistory($columns);
+ return $self;
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+ $self->{value} = $value;
+
+ foreach (@{$self->{labels}})
+ {
+ $self->remove($_);
+ $_->destroy;
+ }
+
+ $self->{labels} = [];
+ my @lines;
+ if (ref($value) eq 'ARRAY')
+ {
+ @lines = @$value;
+ }
+ else
+ {
+ $value =~ s/^\s*//;
+ @lines = split m/,/, $value;
+ }
+ if ($#lines < 0)
+ {
+ $self->hide_all;
+ return;
+ }
+ my $i = $self->{firstRow};
+ $self->resize($#lines + 1 + $self->{firstRow}, $self->{number});
+ foreach (@lines)
+ {
+ my @cols;
+ if (ref($value) eq 'ARRAY')
+ {
+ @cols = @$_;
+ }
+ else
+ {
+ @cols = split m/;/, $_;
+ }
+ my $j = 0;
+ for my $col(@cols)
+ {
+ # TODO Optimize GCColorLongLabel. It offers a better display (no scrollbar)
+ # but it slows down the display.
+ my $label = new GCColorLabel($self->{style}->{bgColor});
+ $label->set_padding($GCUtils::halfMargin,$GCUtils::halfMargin);
+ #my $label = new GCColorLongLabel($self->{style}->{bgColor}, '2em');
+ $label->setMarkup('<span '.$self->{style}->{style}.'>'.$self->cleanMarkup($col, 1).'</span>');
+ $self->attach($label, $j, $j + 1, $i, $i + 1, ['expand', 'fill'], 'fill', 0, 0);
+ push @{$self->{labels}}, $label;
+ $j++;
+ }
+ $i++;
+ }
+ $self->show_all;
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+ return $self->{value};
+ }
+
+ sub setBgColor
+ {
+ my ($self, $color) = @_;
+ return;
+ }
+
+ sub set_justify
+ {
+ my ($self, $value) = @_;
+ return;
+ }
+
+}
+
+{
+ package GCColorText;
+
+ use Glib::Object::Subclass
+ Gtk2::ScrolledWindow::
+ ;
+
+ @GCColorText::ISA = ('Gtk2::ScrolledWindow', 'GCGraphicComponent', 'GCPseudoHistoryComponent');
+
+ sub new
+ {
+ my ($proto, $color, $height, $listType) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ $listType = 0 if !$listType;
+ $self->{text} = new Gtk2::TextView;
+ $self->{text}->set_editable(0);
+ $self->{text}->set_wrap_mode('word');
+ $self->{background} = $color;
+ $self->{text}->modify_base('normal', $color);
+ $self->{text}->modify_bg('normal', $color);
+ $self->{text}->set_border_width($GCUtils::halfMargin);
+ $self->set_border_width(0);
+ $self->set_shadow_type('none');
+ $self->set_policy('automatic', 'automatic');
+ $self->add($self->{text});
+ $self->initHistory($listType);
+
+ my $layout = $self->create_pango_layout('G');
+ my (undef, $rect) = $layout->get_pixel_extents;
+ $self->{em} = 1.5 * $rect->{height};
+
+ $self->setHeight($height) if $height;
+
+ return $self;
+ }
+
+ sub acceptMarkup
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ sub setMarkup
+ {
+ my ($self, $text) = @_;
+
+ if ($self->{resize})
+ {
+ $self->resize;
+ }
+ else
+ {
+ my $buffer = $self->{text}->get_buffer;
+ $self->{text}->get_buffer->set_text('');
+ $text =~ s|<span ([^>]*?)>([^<]*?)</span>|$2|;
+ if ($self->{spanTag})
+ {
+ $buffer->get('tag-table')->remove($self->{spanTag});
+ }
+ $self->{spanTag} = $buffer->create_tag('span', $self->getTagFromSpan($1));
+ $buffer->insert_with_tags_by_name ($buffer->get_start_iter, $text, 'span');
+ }
+ }
+
+ sub getValue
+ {
+ my $self = shift;
+
+ (my $label = $self->{text}) =~ s/<.*?>(.*?)<\/.*?>/$1/g;
+ return $label;
+ }
+
+ sub setHeight
+ {
+ my ($self, $height) = @_;
+ $height =~ s/^([0-9]+)em$/$1*$self->{em}/e;
+ $self->set_size_request(-1, $height);
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ $name =~ s/.*?::(.*)/$1/;
+ $self->{text}->$name(@_);
+ }
+}
+
+{
+ package GCColorExpander;
+
+ use Glib::Object::Subclass
+ Gtk2::Expander::
+ ;
+
+ @GCColorExpander::ISA = ('GCExpander');
+
+ sub new
+ {
+ my ($proto, $label, $bgColor, $fgStyle) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ $self->{label} = new GCColorLabel($bgColor);
+ $self->set_label_widget($self->{label});
+ $self->{fgStyle} = $fgStyle;
+
+ return $self;
+ }
+
+ sub setValue
+ {
+ my ($self, $label, $description) = @_;
+
+ $label = '<span '.$self->{fgStyle}.">$label</span>";
+
+ $self->{label}->set_markup($label);
+ if ($description)
+ {
+ $self->{description}->set_label($description);
+ $self->{description}->show;
+ }
+ else
+ {
+ $self->{description}->set_label('');
+ $self->{description}->hide;
+ }
+
+
+ }
+}
+
+{
+ package GCDialogHeader;
+
+ use Glib::Object::Subclass
+ Gtk2::HBox::
+ ;
+
+ @GCDialogHeader::ISA = ('Gtk2::HBox', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $text, $imageStock, $logosDir) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+
+ $self->{label} = new Gtk2::Label;
+ $self->{label}->set_markup("<span size='large' weight='bold'>$text</span>");
+ $self->{label}->set_alignment(0,0.5);
+
+ if (-f $logosDir.$imageStock.'.png')
+ {
+ $self->{image} = Gtk2::Image->new_from_file($logosDir.$imageStock.'.png');
+ $self->pack_start($self->{image},0,1,5);
+ }
+
+ $self->pack_start($self->{label},0,1,5);
+
+ return $self;
+ }
+}
+
+{
+ package GCImageBox;
+
+ use Glib::Object::Subclass
+ Gtk2::VBox::
+ ;
+
+ @GCImageBox::ISA = ('Gtk2::VBox', 'GCGraphicComponent');
+
+ sub new_from_file
+ {
+ my ($proto, $imageFile, $label) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+
+ my $image = Gtk2::Image->new_from_file($imageFile);
+ $self->init($image, $label);
+
+ return $self;
+ }
+ sub new_from_stock
+ {
+ my ($proto, $stockId, $label) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+
+ my $image = Gtk2::Image->new_from_stock($stockId, 'large-toolbar');
+ $self->init($image, $label);
+
+ return $self;
+ }
+
+ sub init
+ {
+ my ($self, $image, $label) = @_;
+
+ $self->{label} = new Gtk2::Label($label);
+
+ $self->pack_start($image, 0, 0, 0);
+ $self->pack_start($self->{label}, 0, 0, 0);
+
+ $self->show_all;
+ }
+}
+
+{
+ package GCGroup;
+
+ use Glib::Object::Subclass
+ Gtk2::Frame::
+ ;
+
+ @GCGroup::ISA = ('Gtk2::Frame', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ bless ($self, $class);
+
+ $self->set_shadow_type('none');
+ $self->set_border_width($GCUtils::margin);
+ $self->{label} = new Gtk2::Label;
+ $self->{label}->set_padding(0,0);
+ #$label->set_border_width(0);
+ $self->setLabel($title);
+ $self->set_label_widget($self->{label});
+ $self->set_label_align(0,0);
+
+ $self->{marginBox} = new Gtk2::HBox(0,0);
+ $self->{marginBox}->set_border_width($GCUtils::halfMargin);
+ $self->add($self->{marginBox});
+
+ return $self;
+ }
+
+ sub setLabel
+ {
+ my ($self, $label) = @_;
+
+ $self->{label}->set_markup('<b>'.$label.'</b>');
+ }
+
+ sub addWidget
+ {
+ my ($self, $widget, $margin) = @_;
+ $margin = $GCUtils::halfMargin if !$margin;
+ $self->{marginBox}->pack_start($widget, 1, 1, $margin);
+ }
+
+ sub setPadding
+ {
+ my ($self, $value) = @_;
+
+ $self->{marginBox}->set_border_width($value);
+ }
+}
+
+{
+ package GCExpander;
+
+ use Glib::Object::Subclass
+ Gtk2::Expander::
+ ;
+
+ @GCExpander::ISA = ('Gtk2::Expander', 'GCGraphicComponent');
+
+ sub new
+ {
+ my ($proto, $label, $bold) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($label);
+
+ bless ($self, $class);
+ $self->{hbox} = new Gtk2::HBox(0,0);
+ $self->{label} = new Gtk2::Label($label);
+ $self->{label}->set_alignment(0,0.5);
+ $self->{label}->set_markup("<b>$label</b>")
+ if $bold;
+ $self->{description} = new Gtk2::Label;
+ $self->{description}->set_alignment(0,0);
+ eval {$self->{description}->set_line_wrap_mode('word');};
+ $self->{hbox}->pack_start($self->{label}, 0, 0, 0);
+ $self->{hbox}->pack_start($self->{description}, 1, 1, 0);
+ $self->set_label_widget($self->{hbox});
+ $self->{signalHandler} = undef;
+ return $self;
+ }
+
+ sub setMode
+ {
+ my ($self, $mode) = @_;
+ if ($mode eq 'asis')
+ {
+ $self->{description}->set_ellipsize('none');
+ $self->{description}->set_line_wrap(0);
+ if ($self->{signalHandler})
+ {
+ $self->signal_handler_disconnect($self->{signalHandler});
+ $self->{signalHandler} = undef;
+ $self->{description}->set_size_request(-1, -1);
+ }
+ }
+ else
+ {
+ $self->{signalHandler} = $self->signal_connect('size-allocate' => sub {
+ my $width = $self->allocation->width
+ - $self->{label}->allocation->width
+ - ( 4 * $GCUtils::margin);
+ $self->{description}->set_size_request(($width >= -1) ? $width : -1 , -1);
+ return 0;
+ });
+ if ($mode eq 'wrap')
+ {
+ $self->{description}->set_ellipsize('none');
+ $self->{description}->set_line_wrap(1);
+ }
+ else
+ {
+ $self->{description}->set_ellipsize('end');
+ $self->{description}->set_line_wrap(0);
+ }
+ }
+ }
+
+ sub setValue
+ {
+ my ($self, $label, $description) = @_;
+
+ $self->{label}->set_label($label);
+ if ($description)
+ {
+ $self->{description}->set_label($description);
+ $self->{description}->show;
+ }
+ else
+ {
+ $self->{description}->set_label('');
+ $self->{description}->hide;
+ }
+ }
+}
+
+{
+ package GCFieldSelector;
+
+ use Glib::Object::Subclass
+ Gtk2::ComboBox::
+ ;
+
+ @GCFieldSelector::ISA = ('GCMenuList');
+ our $anyFieldValue = 'GCAnyField';
+
+ sub valueToDisplayed
+ {
+ my ($self, $value) = @_;
+ return '';
+ }
+
+ sub setValue
+ {
+ my ($self, $value) = @_;
+
+ $self->{listModel}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if ($model->get_value($iter, 0) eq $value)
+ {
+ $self->set_active_iter($iter);
+ return 1;
+ }
+ return 0;
+ });
+ }
+
+ sub getValues
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub setValues
+ {
+ my ($self, $values, $separatorPosition, $preserveValue) = @_;
+ return;
+ }
+
+ sub new
+ {
+ my ($proto, $withImages, $model, $advancedFilter, $withAnyField, $withoutEmpty, $uniqueType) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = Gtk2::ComboBox->new;
+ bless($self, $class);
+ $self->{withImages} = $withImages;
+ $self->{advancedFilter} = $advancedFilter;
+ $self->{withAnyField} = $withAnyField;
+ $self->{withoutEmpty} = $withoutEmpty;
+ $self->{uniqueType} = $uniqueType;
+
+ $self->{listModel} = Gtk2::TreeStore->new('Glib::String', 'Glib::String');
+ $self->set_model($self->{listModel});
+ my $renderer = Gtk2::CellRendererText->new;
+ $self->pack_start($renderer, 1);
+ $self->add_attribute($renderer, text => 1);
+
+ $self->set_cell_data_func($renderer, sub {
+ my ($layout, $cell, $model, $iter) = @_;
+ my $sensitive = !$model->iter_has_child($iter);
+ $cell->set('sensitive', $sensitive);
+ });
+
+ $self->{default} = 0;
+ $self->set_focus_on_click(1);
+
+ $self->setModel($model) if $model;
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{listModel}->clear;
+ my $field;
+ my @fieldsInfo = @{$model->getDisplayedInfo};
+
+ if (! $self->{withoutEmpty})
+ {
+ $self->{listModel}->set($self->{listModel}->append(undef),
+ 0 => '',
+ 1 => '');
+ }
+ if ($self->{withAnyField})
+ {
+ $self->{listModel}->set($self->{listModel}->append(undef),
+ 0 => $anyFieldValue,
+ 1 => $model->getDisplayedText('AdvancedSearchAnyField'));
+ }
+
+ foreach my $group(@fieldsInfo)
+ {
+ my @fields;
+ foreach $field (@{$group->{items}})
+ {
+ my $id = $field->{id};
+ next if ($model->{fieldsInfo}->{$id}->{type} eq 'image') && (!$self->{withImages});
+ next if ($self->{advancedFilter}
+ && (
+ ($id eq $model->{commonFields}->{id})
+ || ($id eq $model->{commonFields}->{title})
+ || ($id eq $model->{commonFields}->{url})
+ )
+ );
+ next if ! $field->{label};
+ next if $self->{uniqueType} && ($self->{uniqueType} ne $model->{fieldsInfo}->{$id}->{type});
+ push @fields, $field;
+ }
+ if (scalar @fields)
+ {
+ my $groupIter = $self->{listModel}->append(undef);
+ $self->{listModel}->set($groupIter,
+ 0 => undef,
+ 1 => $group->{title});
+ foreach $field(sort {$a->{label} cmp $b->{label}} @fields)
+ {
+ my $fieldIter = $self->{listModel}->append($groupIter);
+ $self->{listModel}->set($fieldIter,
+ 0 => $field->{id},
+ 1 => $field->{label});
+ }
+ }
+ }
+ $self->{model} = $model;
+ }
+ sub activateStateTracking
+ {
+ my $self = shift;
+ }
+
+ # Create a widget suitable to enter a value according to current field type
+ # It will destroy the current widget if it exists
+ sub createEntryWidget
+ {
+ # $parent is the class that contains needed information
+ # $comparison is the kind of comparison. Mainly useful if it is 'range' to create 2 fields
+ # $currentWidget is the one we are replacing
+ my ($self, $parent, $comparison, $currentWidget) = @_;
+ my $value;
+ if ($currentWidget)
+ {
+ $value = $currentWidget->getValue;
+ $currentWidget->destroy;
+ }
+ my $widget;
+ my $field = $self->getValue;
+ my $info = $self->{model}->{fieldsInfo}->{$field};
+
+ # These ones are required for createWidget
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+ $self->{window} = $parent;
+
+ ($widget, undef) = GCBaseWidgets::createWidget($self, $info, $comparison);
+
+ if ($info->{type} eq 'history text')
+ {
+ $widget->setValues($parent->{parent}->{panel}->getValues($field));
+ }
+ elsif ($info->{type} eq 'single list')
+ {
+ $widget->setValues($parent->{parent}->{panel}->getValues($field)->[0]);
+ }
+ $widget->setValue($value);
+
+ return $widget;
+ }
+}
+
+{
+ package GCComparisonSelector;
+
+ use Glib::Object::Subclass
+ Gtk2::ComboBox::
+ ;
+
+ @GCComparisonSelector::ISA = ('GCMenuList');
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless($self, $class);
+ $self->setValues([
+ {value => 'contain', displayed => $parent->{lang}->{ModelFilterContain}},
+ {value => 'notcontain', displayed => $parent->{lang}->{ModelFilterDoesNotContain}},
+ {value => 'regexp', displayed => $parent->{lang}->{ModelFilterRegexp}},
+ {value => 'range', displayed => $parent->{lang}->{ModelFilterRange}},
+ {value => 'eq', displayed => '='},
+ {value => 'lt', displayed => '<'},
+ {value => 'le', displayed => '≤'},
+ {value => 'gt', displayed => '>'},
+ {value => 'ge', displayed => '≥'},
+ ]);
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCGraphicComponents/GCDoubleLists.pm b/lib/gcstar/GCGraphicComponents/GCDoubleLists.pm
new file mode 100644
index 0000000..c59cae1
--- /dev/null
+++ b/lib/gcstar/GCGraphicComponents/GCDoubleLists.pm
@@ -0,0 +1,564 @@
+package GCDoubleLists;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+use GCUtils;
+
+{
+ #Class that is used to let user select
+ #item from a list and order them.
+ package GCDoubleListWidget;
+
+ use base 'Gtk2::HBox';
+
+ sub init
+ {
+ my $self = shift;
+ $self->setListData($self->{dataHandler}->getData) if !$self->{initialized};
+ $self->{initialized} = 1;
+ }
+
+ sub compareItems
+ {
+ my ($self, $item1, $item2) = @_;
+ if ($self->{withPixbuf} && (ref $item1 eq 'ARRAY'))
+ {
+ return $item1->[1] cmp $item2->[1];
+ }
+ else
+ {
+ return $item1 cmp $item2;
+ }
+ }
+
+ sub moveFromTo
+ {
+ my ($self, $from, $to) = @_;
+ my $fromId = ($self->{$from}->get_selected_indices)[0];
+ my $fromItem = $self->{$from.'Array'}->[$fromId];
+ my $fromString;
+ if ($self->{withPixbuf})
+ {
+ $fromString = $fromItem->[1];
+ }
+ else
+ {
+ $fromString = $fromItem;
+ }
+ return if !$fromString;
+ my $toId = ($self->{$to}->get_selected_indices)[0];
+ my $toTotal = scalar @{$self->{$to.'Array'}};
+ $toId = $toTotal if $toId eq '';
+ $toId++ if $toId < $toTotal;
+ $toId = 0 if ($toId < 0);
+
+ if (($to eq 'unused') || (!$self->{permanent}->{$fromString}))
+ {
+ splice(@{$self->{$from}->{data}}, $fromId, 1);
+ splice(@{$self->{$from.'Array'}}, $fromId, 1);
+ }
+ if (($to eq 'used') || (!$self->{permanent}->{$fromString}))
+ {
+ splice(@{$self->{$to}->{data}}, $toId, 0, $fromItem);
+ splice(@{$self->{$to.'Array'}}, $toId, 0, $fromItem);
+ }
+
+ if ($to eq 'unused')
+ {
+ my @tmpSortedArray = sort
+ {$self->compareItems($a, $b)}
+ @{$self->{unusedArray}};
+ $self->{unusedArray} = \@tmpSortedArray;
+ @{$self->{unused}->{data}} = ();
+ my $i = 0;
+ $toId = 0;
+ foreach (@tmpSortedArray)
+ {
+ $toId = $i if $_ eq $fromString;
+ my @item = ($self->{withPixbuf} ? $_ : [$_]);
+ push @{$self->{unused}->{data}}, @item;
+ $i++;
+ }
+ }
+ $self->{$to}->select($toId);
+ $self->{$from}->select($fromId);
+ $self->{$from}->grab_focus;
+ }
+
+ sub moveDownUp
+ {
+ my ($self, $dir) = @_;
+ my $currentId = ($self->{used}->get_selected_indices)[0];
+ my $newId = $currentId + $dir;
+ return if ($newId < 0) || ($newId >= scalar @{$self->{usedArray}});
+ ($self->{usedArray}->[$currentId], $self->{usedArray}->[$newId])
+ = ($self->{usedArray}->[$newId], $self->{usedArray}->[$currentId]);
+ @{$self->{used}->{data}} = ();
+ foreach (@{$self->{usedArray}})
+ {
+ if ($self->{withPixbuf})
+ {
+ push @{$self->{used}->{data}}, $_;
+ }
+ else
+ {
+ push @{$self->{used}->{data}}, [$_];
+ }
+ }
+ $self->{used}->select($newId);
+ }
+
+ sub setListData
+ {
+ my ($self, $new) = @_;
+ my $initial = $self->{dataHandler}->getInitData;
+ $self->{initialized} = 1;
+ my %tmpMap;
+ if ($self->{withPixbuf})
+ {
+ $tmpMap{$_->[1]} = $_ foreach (@$initial);
+ }
+ else
+ {
+ $tmpMap{$_} = 1 foreach (@$initial);
+ }
+ $self->{usedArray} = $new;
+ my $label;
+ foreach (@$new)
+ {
+ my $label = ($self->{withPixbuf} ? $_->[1] : $_);
+ delete $tmpMap{$label} if !$self->{permanent}->{$label};
+ }
+ my @tmpArray = sort {$self->compareItems($a, $b)} keys %tmpMap;
+ if ($self->{withPixbuf})
+ {
+ my @unusedArray = map {$tmpMap{$_}} @tmpArray;
+ $self->{unusedArray} = \@unusedArray;
+ }
+ else
+ {
+ $self->{unusedArray} = \@tmpArray;
+ }
+ @{$self->{unused}->{data}} = ();
+
+ push @{$self->{unused}->{data}}, $_ foreach (@{$self->{unusedArray}});
+ @{$self->{used}->{data}} = ();
+ push @{$self->{used}->{data}}, $_ foreach (@{$self->{usedArray}});
+ }
+
+ sub setListFromIds
+ {
+ my ($self, $new) = @_;
+ my $count = scalar(@$new) - 1;
+ for my $i (0..$count)
+ {
+ $new->[$i] = $self->{fieldIdToName}->{$new->[$i]};
+ }
+ $self->setListData($new);
+ }
+
+ sub clearList
+ {
+ my $self = shift;
+
+ $self->setListData(());
+ }
+ sub fillList
+ {
+ my $self = shift;
+ my @array = grep !$self->{permanent}->{$_},
+ sort {$self->compareItems($a, $b)} @{$self->{dataHandler}->getInitData};
+ $self->setListData(\@array);
+ }
+
+ sub addToPermanent
+ {
+ my ($self, $id) = @_;
+ $self->{permanent}->{$id} = 1;
+ }
+
+ sub removeFromPermanent
+ {
+ my ($self, $id) = @_;
+ delete $self->{permanent}->{$id};
+ }
+
+ sub getUsedItems
+ {
+ my $self = shift;
+ return $self->{usedArray};
+ }
+
+ sub addBottomButtons
+ {
+ my ($self, $unusedButton, $usedButton) = @_;
+ $self->{vboxUnused}->pack_start($unusedButton, 0, 0, 0);
+ $self->{vboxUsed}->pack_start($usedButton, 0, 0, 0);
+
+ }
+
+ sub addRightButtons
+ {
+ my ($self, $button1, $button2) = @_;
+ $self->{vboxRight}->pack_start($button1, 0, 0, $GCUtils::halfMargin);
+ $self->{vboxRight}->pack_start($button2, 0, 0, $GCUtils::halfMargin);
+
+ }
+
+ sub setDataHandler
+ {
+ my ($self, $dataHandler) = @_;
+ $self->{dataHandler} = $dataHandler;
+ }
+
+ sub new
+ {
+ my ($proto, $withPixbuf, $unusedLabel, $usedLabel) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+
+ bless ($self, $class);
+
+ $self->{initialized} = 0;
+ $self->{withPixbuf} = $withPixbuf;
+ $self->{unusedLabel} = $unusedLabel;
+ $self->{usedLabel} = $usedLabel;
+
+ if ($withPixbuf)
+ {
+ $self->{unused} = new Gtk2::SimpleList(
+ '' => 'pixbuf',
+ $self->{unusedLabel} => 'text'
+ );
+ $self->{used} = new Gtk2::SimpleList(
+ '' => 'pixbuf',
+ $self->{usedLabel} => 'text'
+ );
+ }
+ else
+ {
+ $self->{unused} = new Gtk2::SimpleList(
+ $self->{unusedLabel} => "text"
+ );
+ $self->{used} = new Gtk2::SimpleList(
+ $self->{usedLabel} => "text"
+ );
+ }
+ $self->{scrollPanelUnused} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelUnused}->set_policy ('never', 'automatic');
+ $self->{scrollPanelUnused}->set_shadow_type('etched-in');
+ $self->{scrollPanelUnused}->add($self->{unused});
+ $self->{vboxUnused} = new Gtk2::VBox(0,0);
+ $self->{vboxUnused}->pack_start($self->{scrollPanelUnused}, 1, 1, 0);
+
+ my $vboxChange = new Gtk2::VBox(1,1);
+ my $tmpVbox = new Gtk2::VBox(0,0);
+ my $toRight = new Gtk2::Button('->');
+ $toRight->remove($toRight->child);
+ $toRight->add(Gtk2::Image->new_from_stock('gtk-go-forward', 'button'));
+ $toRight->signal_connect('clicked' => sub {
+ $self->moveFromTo('unused', 'used');
+ });
+ my $toLeft = new Gtk2::Button('<-');
+ $toLeft->remove($toLeft->child);
+ $toLeft->add(Gtk2::Image->new_from_stock('gtk-go-back', 'button'));
+ $toLeft->signal_connect('clicked' => sub {
+ $self->moveFromTo('used', 'unused');
+ });
+ $tmpVbox->pack_start($toRight,0,0,$GCUtils::margin);
+ $tmpVbox->pack_start($toLeft,0,0,$GCUtils::margin);
+ $vboxChange->pack_start($tmpVbox,1,0,0);
+
+ $self->{scrollPanelUsed} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelUsed}->set_policy ('never', 'automatic');
+ $self->{scrollPanelUsed}->set_shadow_type('etched-in');
+ $self->{scrollPanelUsed}->add($self->{used});
+ $self->{vboxUsed} = new Gtk2::VBox(0,0);
+ $self->{vboxUsed}->pack_start($self->{scrollPanelUsed}, 1, 1, 0);
+
+ $self->{unused}->signal_connect ('row-activated' => sub {
+ $self->moveFromTo('unused', 'used');
+ });
+ $self->{used}->signal_connect ('row-activated' => sub {
+ $self->moveFromTo('used', 'unused');
+ });
+
+ $self->{vboxRight} = new Gtk2::VBox(0,0);
+ my $toUp = new Gtk2::Button('^');
+ $toUp->remove($toUp->child);
+ $toUp->add(Gtk2::Image->new_from_stock('gtk-go-up', 'button'));
+ $toUp->signal_connect('clicked' => sub {
+ $self->moveDownUp(-1);
+ });
+ my $toDown = new Gtk2::Button('_');
+ $toDown->remove($toDown->child);
+ $toDown->add(Gtk2::Image->new_from_stock('gtk-go-down', 'button'));
+ $toDown->signal_connect('clicked' => sub {
+ $self->moveDownUp(1);
+ });
+ $self->{vboxRight}->pack_start($toUp, 0, 0, $GCUtils::margin);
+ $self->{vboxRight}->pack_start($toDown, 0, 0, $GCUtils::margin);
+
+ $self->pack_start(new Gtk2::HBox,0,0,$GCUtils::margin);
+ $self->pack_start($self->{vboxUnused},1,1,$GCUtils::halfMargin);
+ $self->pack_start($vboxChange,0,0,$GCUtils::halfMargin);
+ $self->pack_start($self->{vboxUsed},1,1,$GCUtils::halfMargin);
+ $self->pack_start($self->{vboxRight},0,0,$GCUtils::halfMargin);
+ $self->pack_start(new Gtk2::HBox,0,0,$GCUtils::quarterMargin);
+
+ $self->{scrollPanelUnused}->set_size_request(150,-1);
+ $self->{scrollPanelUsed}->set_size_request(150,-1);
+
+ return $self;
+ }
+}
+
+{
+ package GCFieldsSelectionWidget;
+
+ use base 'GCDoubleListWidget';
+
+ sub getInitData
+ {
+ my $self = shift;
+ my @array;
+ @array = keys %{$self->{fieldNameToId}};
+ return \@array;
+ }
+
+ sub getData
+ {
+ my $self = shift;
+
+ my @array;
+ foreach (@{$self->{selectedFields}})
+ {
+ push @array, $self->{fieldIdToName}->{$_};
+ }
+
+ return \@array;
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ my @array;
+ foreach (@{$list})
+ {
+ push @array, $self->{fieldNameToId}->{$_};
+ }
+ $self->{selectedFields} = \@array;
+ }
+
+ sub getSelectedIds
+ {
+ my $self = shift;
+ $self->saveList($self->getUsedItems);
+ return $self->{selectedFields};
+ }
+
+ sub loadFromFile
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{parent}->{lang}->{FieldsListOpen}, $self, 'open', 1);
+ $fileDialog->set_filename($self->{filename});
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ $self->{filename} = $fileDialog->get_filename;
+ open FILE, '<'.$self->{filename};
+ my $model = <FILE>;
+ chop $model;
+ if ($model eq $self->{model}->getName)
+ {
+ $self->clearList;
+ my @data;
+ while (<FILE>)
+ {
+ chop;
+ push @data, $self->{fieldIdToName}->{$_};
+ }
+ $self->setListData(\@data);
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{FieldsListError});
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+ }
+ close FILE;
+ }
+ $fileDialog->destroy;
+ }
+
+ sub saveToFile
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{parent}->{lang}->{FieldsListSave}, $self, 'save', 1);
+ $fileDialog->set_filename($self->{filename});
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ $self->{filename} = $fileDialog->get_filename;
+ open FILE, '>'.$self->{filename};
+ print FILE $self->{model}->getName, "\n" if $self->{model};
+ foreach (@{$self->{usedArray}})
+ {
+ print FILE $self->{fieldNameToId}->{$_}, "\n";
+ }
+ close FILE;
+ }
+ $fileDialog->destroy;
+ }
+
+ sub compareItems
+ {
+ my ($self, $item1, $item2) = @_;
+ use locale;
+ my @values1 = split $self->{separator}, $item1;
+ my @values2 = split $self->{separator}, $item2;
+ if ($values1[0] eq $values2[0])
+ {
+ return $values1[1] cmp $values2[1];
+ }
+ else
+ {
+ return $self->{groupsOrder}->{$values1[0]} <=> $self->{groupsOrder}->{$values2[0]};
+ }
+ }
+
+ sub addIgnoreField
+ {
+ my ($self, $ignoreField) = @_;
+ $self->{ignoreString} = $self->{parent}->{lang}->{FieldsListIgnore};
+ $self->{fieldNameToId}->{$self->{ignoreString}} = $ignoreField;
+ $self->{fieldIdToName}->{$ignoreField} = $self->{ignoreString};
+ $self->addToPermanent($self->{ignoreString});
+ }
+
+ sub removeIgnoreField
+ {
+ my ($self) = @_;
+ $self->removeFromPermanent($self->{ignoreString});
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $preList, $isIdList, $ignoreField) = @_;
+
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(
+ 0,
+ $parent->{lang}->{ImportExportFieldsUnused},
+ $parent->{lang}->{ImportExportFieldsUsed}
+ );
+ bless $self, $class;
+
+ $self->{parent} = $parent;
+
+ $self->{ignoreField} = $ignoreField;
+ $self->{lang} = $parent->{lang};
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->setDataHandler($self);
+ my $fillButton = new Gtk2::Button($parent->{lang}->{ImportExportFieldsFill});
+ $fillButton->set_border_width($GCUtils::margin);
+ $fillButton->signal_connect('clicked' => sub {
+ $self->fillList;
+ });
+ my $clearButton = new Gtk2::Button($parent->{lang}->{ImportExportFieldsClear});
+ $clearButton->set_border_width($GCUtils::margin);
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clearList;
+ });
+
+ $self->addBottomButtons($fillButton, $clearButton);
+
+ my $loadButton = new Gtk2::Button('open');
+ $self->{tooltips}->set_tip($loadButton,
+ $parent->{lang}->{FieldsListOpen});
+ $loadButton->remove($loadButton->child);
+ $loadButton->add(Gtk2::Image->new_from_stock('gtk-open', 'button'));
+ $loadButton->signal_connect('clicked' => sub {
+ $self->loadFromFile;
+ });
+ my $saveButton = new Gtk2::Button('save');
+ $self->{tooltips}->set_tip($saveButton,
+ $parent->{lang}->{FieldsListSave});
+ $saveButton->remove($saveButton->child);
+ $saveButton->add(Gtk2::Image->new_from_stock('gtk-save', 'button'));
+ $saveButton->signal_connect('clicked' => sub {
+ $self->saveToFile;
+ });
+
+ $self->addRightButtons($loadButton, $saveButton);
+
+ $self->{fieldNameToId} = {};
+ $self->{groupsOrder} = {};
+
+ my $model = $self->{parent}->{model};
+ if ($model)
+ {
+ my $groups = $model->getGroups;
+ $self->{separator} = $model->getDisplayedText('Separator');
+ while (my ($key, $value) = each %{$model->{fieldsInfo}})
+ {
+ next if !$value->{displayed};
+ my $displayed = $groups->{$value->{group}}->{displayed}
+ . $self->{separator}
+ . $value->{displayed};
+ $self->{fieldNameToId}->{$displayed} = $key;
+ $self->{fieldIdToName}->{$key} = $displayed;
+ }
+ my $order = 0;
+ foreach (@{$model->{groups}})
+ {
+ $self->{groupsOrder}->{$groups->{$_->{id}}->{displayed}} = $order++;
+ }
+ $self->{model} = $model;
+ }
+
+ if ($preList)
+ {
+ $self->setListData($preList) if !$isIdList;
+ $self->setListFromIds($preList) if $isIdList;
+ }
+ else
+ {
+ $self->fillList
+ }
+ $self->saveList(\@{$self->{usedArray}});
+
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport.pm b/lib/gcstar/GCImport.pm
new file mode 100644
index 0000000..2ff40d3
--- /dev/null
+++ b/lib/gcstar/GCImport.pm
@@ -0,0 +1,139 @@
+package GCImport;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use File::Basename;
+use GCUtils 'glob';
+
+use base 'Exporter';
+our @EXPORT = qw(@importersArray);
+
+our @importersArray;
+
+sub loadImporters
+{
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCImport/*.pm')
+ {
+ my $import = basename($_, '.pm')."\n";
+ next if $import =~ /GCImportBase/;
+ eval "use GCImport::$import";
+ (my $importer = $import) =~ s/^GCImport/GCImporter/;
+ my $obj;
+ eval "\$obj = new GCImport::$importer";
+ die "Fatal error with importer $import\n$@" if $@;
+ push @importersArray, $obj if ! $obj->{errors};
+ }
+}
+
+use Gtk2;
+use GCExportImport;
+
+
+{
+ package GCImportDialog;
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCImportDialog::ISA = ('GCExportImportDialog');
+
+ sub addOptions
+ {
+ my ($self, $options) = @_;
+ $options->{newList} = ($self->{newList}->get_active) ? 1 : 0;
+ $options->{parent} = $self->{parent};
+ }
+
+ sub setModule
+ {
+ my ($self, $module) = @_;
+
+ $self->SUPER::setModule($module);
+ $self->{currentList}->set_sensitive(scalar @{$module->getModels} == 0);
+ $self->{newList}->set_active(1);
+ if ($self->{parent}->{model})
+ {
+ foreach (@{$module->getModels})
+ {
+ if ($self->{parent}->{model}->getName eq $_)
+ {
+ $self->{currentList}->set_sensitive(1);
+ last;
+ }
+ }
+ }
+ if ($self->{fieldsDialog})
+ {
+ if ($module->wantsIgnoreField)
+ {
+ $self->{fieldsDialog}->addIgnoreField($self->{parent}->{ignoreString});
+ }
+ else
+ {
+ $self->{fieldsDialog}->removeIgnoreField;
+ }
+ }
+ }
+
+ sub setModel
+ {
+ my $self = shift;
+ $self->{fieldsDialog} = new GCFieldsSelectionDialog($self,
+ $self->{parent}->{lang}->{ImportFieldsTitle});
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $parent->{lang}->{ImportListTitle}, 'import');
+ bless ($self, $class);
+
+ my $vboxInsert = new Gtk2::VBox(0,0);
+ $vboxInsert->set_border_width(0);
+
+ $self->{newList} = new Gtk2::RadioButton(undef, $parent->{lang}->{ImportNewList});
+ $self->{currentList} = new Gtk2::RadioButton($self->{newList}->get_group, $parent->{lang}->{ImportCurrentList});
+
+# $vboxInsert->pack_start($self->{newList},1,1,0);
+# $vboxInsert->pack_start($self->{currentList},1,1,0);
+#
+# $self->vbox->pack_start(new Gtk2::HSeparator, 1, 1, 5);
+# $self->vbox->pack_start($vboxInsert,0,0,0);
+
+ $self->{dataTable}->resize(4, 2);
+ $self->{dataTable}->attach($self->{newList}, 0, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{currentList}, 0, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{labelFile}, 0, 1, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{dataTable}->attach($self->{file}, 1, 2, 3, 4, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{fieldsButtonLabel} = $parent->{lang}->{ImportFieldsTitle};
+ $self->{fieldsTip} = $parent->{lang}->{ImportFieldsTip};
+
+ return $self;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportAMC.pm b/lib/gcstar/GCImport/GCImportAMC.pm
new file mode 100644
index 0000000..c5d38c9
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportAMC.pm
@@ -0,0 +1,234 @@
+package GCImport::GCImportAMC;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterAMC;
+ use base qw(GCImport::GCImportBaseClass);
+
+ use File::Basename;
+ use File::Copy;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ $self->{fileId} = " AMC_X.Y Ant Movie Catalog 3.5.x www.buypin.com www.antp.be ";
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Ant Movie Catalog (.amc)";
+ }
+
+ sub getFilePatterns
+ {
+ return (['Ant Movie Catalog (.amc)', '*.amc']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ #Return current model name
+ sub getModelName
+ {
+ return 'GCfilms';
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub readBool
+ {
+ my $self = shift;
+
+ my $value;
+ read $self->{file}, $value, 1;
+ return unpack('C',$value);
+ }
+
+ sub readInt
+ {
+ my $self = shift;
+
+ my $value;
+ read $self->{file}, $value, 4;
+ $value = unpack('L',$value);
+ return undef if $value == 4294967295;
+ return $value;
+ }
+
+ sub readString
+ {
+ my $self = shift;
+ my $binary = shift;
+
+ my $length = $self->readInt;
+ my $string;
+
+ return '' if $length == 0;
+ read $self->{file}, $string, $length;
+
+ #$string =~ s/\n/<br\/>/gm if !$binary;
+ $string =~ s/\|/,/gm if !$binary;
+
+ return $string;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ open ITEMS, $file;
+ binmode ITEMS;
+ $self->{file} = \*ITEMS;
+
+ my $identifier;
+ read ITEMS, $identifier, length($self->{fileId});
+ ($self->{AMCVersion} = $identifier) =~ s/.*?AMC_(\d+)\.(\d+).*/$1.$2/;
+ my @versions = split m/\./, $self->{AMCVersion};
+ $self->{AMCMajorVersion} = $versions[0];
+ $self->{AMCMinorVersion} = $versions[1];
+
+ $self->readString; # name
+ $self->readString; # mail
+ if (($self->{AMCMinorVersion} <= 3) && ($self->{AMCMinorVersion} < 5))
+ {
+ $self->readString; # icq
+ }
+ $self->readString; # site
+ $self->readString; # description
+
+ my $baseDir = dirname($file);
+
+ my $i = 0;
+
+ while (! eof ITEMS)
+ {
+ $result[$i]->{identifier} = $self->readInt; #Id
+ $self->readInt; #Add date
+ $result[$i]->{rating} = $self->readInt;
+
+ if (($self->{AMCMinorVersion} >= 3) && ($self->{AMCMinorVersion} >= 5))
+ {
+ use integer;
+ $result[$i]->{rating} /= 10;
+ }
+
+ $result[$i]->{date} = $self->readInt;
+ $result[$i]->{time} = $self->readInt;
+ my $ vb = $self->readInt; #Video bitrate
+ my $ab = $self->readInt; #Audio bitrate
+ $result[$i]->{number} = $self->readInt;
+
+ $self->readBool; #Checked
+
+ $result[$i]->{place} = $self->readString; #Media label
+ $result[$i]->{format} = $self->readString;
+ $self->readString; #Source
+ $result[$i]->{borrower} = $self->readString;
+ $result[$i]->{borrower} = 'none' if ! $result[$i]->{borrower};
+ $result[$i]->{original} = $self->readString;
+ $result[$i]->{title} = $self->readString;
+ $result[$i]->{title} = $result[$i]->{original} if !$result[$i]->{title};
+
+ $result[$i]->{director} = $self->readString;
+ $self->readString; #Producer
+ $result[$i]->{country} = $self->readString;
+ $result[$i]->{genre} = [[$self->readString]];
+ $result[$i]->{actors} = $self->readString;
+ $result[$i]->{webPage} = $self->readString;
+ $result[$i]->{synopsis} = $self->readString;
+ $result[$i]->{comment} = $self->readString;
+ $result[$i]->{video} = $self->readString;
+ my $encodings = $self->readString; #Audio format
+ my $res = $self->readString; #Resolution
+ $self->readString; #Framerate
+ $result[$i]->{audio} = $self->readString;
+ if ($result[$i]->{audio})
+ {
+ my @encodings = split /,/,$encodings;
+ $result[$i]->{audio} =~ s/(^|,)([^;]*?)(,|$)/$1$2;$_$3/ foreach (@encodings);
+ $result[$i]->{audio} =~ s/, +/,/g;
+ $result[$i]->{audio} =~ s/; +/;/g;
+ }
+ $result[$i]->{subt} = [[$self->readString]];
+ $self->readString; #File size
+ $result[$i]->{image} = $self->readString;
+
+ my $picture = $self->readString(1);
+
+ if ($result[$i]->{image} =~ /^\..{3}/)
+ {
+ my $pictureName = $self->{options}->{parent}->getUniqueImageFileName($result[$i]->{image},
+ $result[$i]->{title});
+ open PIC, "> $pictureName";
+ binmode PIC;
+ print PIC $picture;
+ close PIC;
+ $result[$i]->{image} = $self->{options}->{parent}->transformPicturePath($pictureName);
+ }
+ else
+ {
+ if (! File::Spec->file_name_is_absolute($result[$i]->{image}))
+ {
+ $result[$i]->{image} = $baseDir . $result[$i]->{image};
+ }
+ #copy $result[$i]->{image}, $pictureName;
+ }
+
+ $i++;
+ }
+
+ close ITEMS;
+
+ return \@result;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..6233ed7
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,205 @@
+package GCImport::GCImportAlexandria;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterAlexandria;
+
+ use base qw(GCImport::GCImportBaseClass);
+ use File::Copy;
+ use Encode;
+ use GCUtils 'glob';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ $self->{errors} = '';
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Alexandria";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ return [
+ {
+ name => 'where',
+ type => 'options',
+ label => 'Where',
+ default => 'Default',
+ valuesList => 'Default,Specified'
+ }
+ ];
+ }
+
+ sub getFilePatterns
+ {
+ my $self = shift;
+
+ return ();
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCbooks'];
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+
+ return 'GCbooks';
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 0;
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 1;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+
+ return '';
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $directory) = @_;
+
+ my @result = ();
+
+ my @files;
+ $directory = $ENV{HOME}.'/.alexandria'
+ if $self->{options}->{where} eq 'Default';
+
+ foreach (glob "$directory/*")
+ {
+ if (-d $_)
+ {
+ my @array = glob "$_/*";
+ foreach my $file(glob "$_/*")
+ {
+ push @files, $file if $file =~ /yaml$/;
+ }
+ }
+ push @files, $_ if /yaml$/;
+ }
+
+ foreach (@files)
+ {
+ push @result, $self->getBook($_);
+ }
+
+ return \@result;
+ }
+
+ sub transformValue
+ {
+ my ($self, $value) = @_;
+
+ $value =~ s/^"(.*)"$/$1/;
+ $value =~ s/\\x([0-9a-fA-F]{2})/pack("H2",$1)/ge;
+ $value = decode('UTF-8', $value);
+
+ return $value;
+ }
+
+ sub getBook
+ {
+ my ($self, $file) = @_;
+
+ my %book;
+ open BOOK, "<$file";
+ binmode(BOOK, ':utf8');
+ # 1st line contain ruby information
+ my $line = <BOOK>;
+ my $current = '';
+ my $value = '';
+ foreach (<BOOK>)
+ {
+ next if /^#/;
+ if (/^([a-z_]*): (.*)$/)
+ {
+ $current = $1;
+ next if $current eq 'saved_ident';
+ # Tag conversion
+ $current = 'lendDate' if $current eq 'loaned_since';
+ $current = 'borrower' if $current eq 'loaned_to';
+ $book{$current} = $self->transformValue($2);
+ }
+ elsif (/^\s*- (.*)$/)
+ {
+ $book{$current} ||= [];
+ push @{$book{$current}}, [$self->transformValue($1)];
+ }
+ }
+ close BOOK;
+ #Some adjustments
+ $book{rating} *= 2;
+ $book{lendDate} =~ s|^([0-9]{4})-([0-9]{2})-([0-9]{2}).*$|$3/$2/$1|;
+ if ($book{loaned} eq 'false')
+ {
+ $book{borrower} = 'none';
+ $book{lendDate} = '';
+ }
+ delete $book{loaned};
+ #cover
+ $file =~ s/yaml$/cover/;
+ if (-e $file)
+ {
+ my $pic = $self->{options}->{parent}->getUniqueImageFileName('jpg', $book{title});
+ copy $file, $pic;
+ $book{cover} = $pic;
+ }
+ return \%book;
+ }
+
+}
+
+
+
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCImport/GCImportBase.pm b/lib/gcstar/GCImport/GCImportBase.pm
new file mode 100644
index 0000000..026be19
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportBase.pm
@@ -0,0 +1,217 @@
+package GCImport::GCImportBase;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCExportImport;
+
+{
+ package GCImport::GCImportBaseClass;
+
+ use base 'GCExportImportBase';
+ use File::Basename;
+ use File::Copy;
+
+ #Methods to be overriden in specific classes
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+
+ $self->{parsingError} = '';
+ $self->{modelAlreadySet} = 0;
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getFilePatterns
+ {
+ return (['*.*', '*.*']);
+ }
+
+ sub getSuffix
+ {
+ my $self = shift;
+ return '' if ! ($self->getFilePatterns)[0];
+ (my $pattern = ($self->getFilePatterns)[0]->[1]) =~ s/.*?([[:alnum:]]+)/$1/;
+ return $pattern;
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return [];
+ }
+
+ #Return current model name
+ sub getModelName
+ {
+ return 'GCfilms';
+ }
+
+ sub getOptions
+ {
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsIgnoreField
+ {
+ return 0;
+ }
+
+ sub wantsImagesSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 0;
+ }
+
+ # Returns true if the module should be hidden from
+ # the menu when a collection of an incompatible kind is open.
+ sub shouldBeHidden
+ {
+ return 0;
+ }
+
+ sub generateId
+ {
+ return 1;
+ }
+
+ sub getEndInfo
+ {
+ }
+
+ sub getItemsArray
+ {
+ }
+
+ #End of methods to be overriden
+
+ # If you need really specific processing, you can instead override the process method
+
+ sub process
+ {
+ my ($self, $options) = @_;
+ $self->{options} = $options;
+
+ $options->{parent}->{items}->updateSelectedItemInfoFromPanel;
+ my $alreadySaved = 0;
+ if ($options->{newList})
+ {
+ return if !$options->{parent}->checkAndSave;
+ $alreadySaved = 1;
+ $options->{parent}->setFile('');
+ }
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{ImportListTitle}.' ('.$options->{file}.')');
+ my @tmpArray = @{$self->getItemsArray($options->{file})};
+
+ if ($self->{parsingError})
+ {
+ $self->{options}->{parent}->restoreCursor;
+ return $self->getEndInfo;
+ }
+
+ my $realModel = $self->getModelName;
+
+ # Here we really know the model so we force a new list if needed
+ if (($options->{newList})
+ || ($options->{parent}->{model}->getName ne $realModel))
+ {
+ $options->{parent}->newList($realModel, $self->{modelAlreadySet}, $alreadySaved);
+ }
+
+ my $generateId = $self->generateId;
+ foreach (@tmpArray)
+ {
+ $options->{parent}->{items}->addItem($_, !$generateId, 1);
+ }
+ $options->{parent}->{items}->unselect;
+ $self->{options}->{parent}->restoreCursor;
+
+ $options->{parent}->checkPanelVisibility;
+ $options->{parent}->selectFirst;
+ $options->{parent}->markAsUpdated;
+ $options->{parent}->viewAllItems;
+ return $self->getEndInfo;
+ }
+
+ # This method could only be use if $self->{model} has been initialized
+ sub copyPictures
+ {
+ my ($self, $itemsArray, $file) = @_;
+ return if !$self->{model};
+ foreach my $item(@$itemsArray)
+ {
+ my $title = $item->{$self->{model}->{commonFields}->{title}};
+ foreach my $field(@{$self->{model}->{fieldsImage}})
+ {
+ (my $suffix = $item->{$field}) =~ s/.*?(\.[^.]*)$/$1/;
+ my $imageFile = $self->{options}->{parent}->getUniqueImageFileName($suffix, $title);
+ copy(GCUtils::getDisplayedImage($item->{$field}, '', $file),
+ $imageFile)
+ if $item->{$field};
+ $item->{$field} = $imageFile;
+ }
+ }
+ }
+
+ # 3 methods below are created to implement interface
+ # from GCFrame plugins could need to simulate if using
+ # some backends
+ sub preloadModel
+ {
+ my ($self, $model) = @_;
+ # Preload the model into the factory cache
+ $self->{modelsFactory}->getModel($model);
+ }
+
+ sub setCurrentModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $self->{modelsFactory}->getModel($model);
+ }
+
+ sub setCurrentModelFromInline
+ {
+ my ($self, $container) = @_;
+ $self->{model} = GCModelLoader->newFromInline($self, $container);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportCSV.pm b/lib/gcstar/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..efb3e5d
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportCSV.pm
@@ -0,0 +1,313 @@
+package GCImport::GCImportCSV;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterCSV;
+
+ use base qw(GCImport::GCImportBaseClass);
+ use Encode;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 1;
+ }
+
+ sub wantsIgnoreField
+ {
+ return 1;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ my $self = shift;
+
+ return "CSV";
+ }
+
+ sub getFilePatterns
+ {
+ return (['CSV (*.csv)', '*.csv']);
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $charsets = '';
+ my @charsetList = Encode->encodings(':all');
+ foreach (@charsetList)
+ {
+ $charsets .= $_.',';
+ }
+
+ my $pluginsList = $self->{model}->{parent}->{lang}->{PluginDisabled}.',';
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ $pluginsList .= $plugin->getName . ',';
+ }
+
+ my $searchFieldsList;
+ foreach (@{$self->{model}->getSearchFields})
+ {
+ $searchFieldsList->{$_} = $self->{model}->getDisplayedText($self->{model}->{fieldsInfo}->{$_}->{label});
+ }
+
+ return [
+ {
+ name => 'sep',
+ type => 'short text',
+ label => 'Separator',
+ default => ';'
+ },
+
+ {
+ name => 'charset',
+ type => 'options',
+ label => 'Charset',
+ valuesList => $charsets,
+ default => 'utf8',
+ },
+
+ {
+ name => 'withHeader',
+ type => 'yesno',
+ label => 'Header',
+ default => '1'
+ },
+
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+
+ {
+ name => 'searchfield',
+ type => 'options',
+ label => 'SearchField',
+ valuesList => $searchFieldsList,
+ default => $self->{model}->{commonFields}->{title}
+ },
+
+ {
+ name => 'first',
+ type => 'yesno',
+ label => 'UseFirst',
+ default => '1'
+ },
+
+ ];
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ # First we try to get the correct plugin
+ my $plugin;
+ my $titleField;
+ my $pluginEnabled;
+ $pluginEnabled = 1 if $self->{options}->{plugin}
+ && ($self->{options}->{plugin} ne $self->{options}->{lang}->{PluginDisabled});
+ if ($pluginEnabled)
+ {
+ $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $titleField = $self->{options}->{searchfield};
+
+ # Force values of search field if it's incompatible with current plugin
+ my $compatible = 1;
+ $compatible = grep /^$titleField$/, @{$plugin->getSearchFieldsArray}
+ if $titleField;
+ if (!$compatible)
+ {
+ # If it is not, we use the 1st compatible one
+ $titleField = $plugin->getSearchFieldsArray->[0];
+ }
+
+ }
+
+ open ITEMS, $file;
+ binmode(ITEMS, ':utf8')
+ if $self->{options}->{charset} eq 'utf8';;
+
+ my $sep = $self->{options}->{sep};
+ my $ignoreFirstLine = $self->{options}->{withHeader};
+
+ my $resultsDialog;
+ if ((!$self->{options}->{first}) && ($pluginEnabled))
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+
+ my $i = 0;
+
+ while (<ITEMS>)
+ {
+ if ($ignoreFirstLine)
+ {
+ $ignoreFirstLine = 0;
+ next;
+ }
+
+ chomp;
+ # Special characters are escaped
+ my @values = split m/\Q$sep\E/;
+
+ $result[$i] = {} if (!$pluginEnabled);
+
+ my $j = 0;
+ my $searchTitle = '';
+ foreach (@{$self->{options}->{fields}})
+ {
+ $values[$j] = decode($self->{options}->{charset}, $values[$j])
+ if $self->{options}->{charset} ne 'utf8';
+ $result[$i]->{$_} = $values[$j] if (!$pluginEnabled);
+ $searchTitle = $values[$j] if (($_ eq $titleField) && ($pluginEnabled));
+ $j++;
+ }
+
+ if (($pluginEnabled) && ($searchTitle ne ''))
+ {
+ $plugin->{title} = $searchTitle;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $titleField;
+
+ #Initialize what will be pushed in the array
+ my $info = {$titleField => $searchTitle};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$_.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber != 0)
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{first}))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ else
+ {
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($_, @items);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $info = $plugin->getItemInfo;
+ my $title = $info->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $info->{$field} = '' if $info->{$field} eq 'empty';
+ next if !$info->{$field};
+ ($info->{$field}) = $self->{options}->{parent}->downloadPicture($info->{$field}, $title);
+ }
+ $info->{comment} = $self->getLang->{CommentAuto}
+ . "\n"
+ . $self->getLang->{CommentSite}
+ . $plugin->getName()
+ . "\n"
+ . $self->getLang->{CommentTitle}
+ . $_
+ . "\n";
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+ foreach my $field(keys %$defaultInfo)
+ {
+ next if exists $info->{$field};
+ $info->{$field} = $defaultInfo->{$field};
+ }
+ my $j = 0;
+ foreach (@{$self->{options}->{fields}})
+ {
+ $values[$j] = decode($self->{options}->{charset}, $values[$j])
+ if $self->{options}->{charset} ne 'utf8';
+ $info->{$_} = $values[$j];
+ $j++;
+ }
+ }
+
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+
+ $i++;
+ }
+ close ITEMS;
+
+
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportDVDProfiler.pm b/lib/gcstar/GCImport/GCImportDVDProfiler.pm
new file mode 100644
index 0000000..6f47d7b
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportDVDProfiler.pm
@@ -0,0 +1,192 @@
+package GCImport::GCImportDVDProfiler;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterDVDProfiler;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use XML::Simple;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "DVDProfiler (.xml)";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getFilePatterns
+ {
+ return (['DVDProfiler (.xml)', '*.xml']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my $xml;
+ my $data;
+ # creer un objet
+ $xml = XML::Simple->new; # sans keyAttr les dvd seront dans une liste ou chaque dvd sera identifie par l'emplacement qu'il a dans cette liste
+ $data = $xml->XMLin ("$file");
+
+
+ my @result;
+ my $film;
+
+ foreach $film(@{$data->{DVD}}){
+ my $item;
+
+ $item->{title} = $film->{Title};
+ $item->{date} = $film->{ProductionYear};
+ $item->{time} = $film->{RunningTime}.' mn';
+ $item->{synopsis} = $film->{Overview};
+ ####### DIRECTOR #########
+ my $director;
+
+ if (ref ($film->{Credits}->{Credit}) eq "ARRAY") {
+ foreach $director(@{$film->{Credits}->{Credit}}){
+ if (($director->{CreditType}) eq 'Direction') {
+ $item->{director} .= $director->{FirstName}.' '.$director->{LastName}.', ';
+
+ }
+ }
+ }
+ else {
+ if (($film->{Credits}->{Credit}->{CreditType}) eq 'Direction') {
+ $item->{director} .= $film->{Credits}->{Credit}->{FirstName}.' '.$film->{Credits}->{Credit}->{LastName};
+ }
+ }
+ ###### END DIRECTOR ######
+
+ ####### ACTORS #########
+ my $actor;
+ if (ref ($film->{Actors}->{Actor}) eq "ARRAY") {
+ foreach $actor(@{$film->{Actors}->{Actor}}){
+ $item->{actors} .= $actor->{FirstName}.' '.$actor->{LastName}.' '.'('.$actor->{Role}.')'.', ';
+
+ }
+ }
+ else {
+ $item->{actors} .= $film->{Actors}->{Actor}->{'FirstName'}.' '.$film->{Actors}->{Actor}->{LastName}.' '.'('.$film->{Actors}->{Actor}->{Role}.')';
+ }
+ ###### END ACTORS ######
+
+ ####### AUDIO #########
+ my $audio;
+ if (ref ($film->{Audio}->{AudioFormat}) eq "ARRAY"){
+ foreach $audio(@{$film->{Audio}->{AudioFormat}}){
+ $item->{audio} .= $audio->{AudioLanguage}.', ';
+
+ }
+ }
+ else {
+ $item->{audio} .= $film->{Audio}->{AudioFormat}->{'AudioLanguage'};
+ }
+ ###### END AUDIO ######
+ ####### SUBT #########
+ my $subt;
+ if (ref ($film->{Subtitles}->{Subtitle}) eq "ARRAY"){
+ foreach $subt(@{$film->{Subtitles}->{Subtitle}}){
+ $item->{subt} .= $subt.', ';
+
+ }
+ }
+ else {
+ $item->{subt} = $film->{Subtitles}->{Subtitle};
+ }
+ ####### END SUBT #########
+ ####### TYPE #########
+ my $type;
+ if (ref ($film->{Genres}->{Genre}) eq "ARRAY"){
+ foreach $type(@{$film->{Genres}->{Genre}}){
+ $item->{type} .= $type.',';
+
+ }
+ }
+ else {
+ $item->{type} = $film->{Genres}->{Genre};
+ }
+ ####### END TYPE #########
+
+ #$item->{original} = $film->{Title};
+ #$item->{subt} = $film->{Subtitles}->{Subtitle};
+ #$item->{borrower} = $film->{Title};
+ #$item->{lendDate} = $film->{Title};
+ #$item->{history} = $film->{Title};
+ #$item->{seen} = $film->{Title};# non par defaut ?
+ #$item->{comment} = $film->{Title};
+ #$item->{image} = $film->{Title};
+ #$item->{country} = $film->{Title};
+ #$item->{number} = $film->{CollectionNumber};
+ #$item->{rating} = $film->{Title};# note par defaut
+ #$item->{format} = $film->{Title};#DVD par d�faut ?
+ #$item->{webPage} = $film->{Title};
+ #$item->{place} = $film->{Title};
+ $item->{director} =~ s/, $//;
+ $item->{actors} =~ s/, $//;
+ $item->{audio} =~ s/, $//;
+ $item->{subt} =~ s/, $//;
+ $item->{type} =~ s/, $//;
+ push @result, $item;
+ }
+ return \@result;
+
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCImport/GCImportFolder.pm b/lib/gcstar/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..10d9fd1
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportFolder.pm
@@ -0,0 +1,510 @@
+package GCImport::GCImportFolder;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterFolder;
+
+ use File::Find;
+ use File::Basename;
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCPlugins;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub wantsDirectorySelection
+ {
+ return 1;
+ }
+
+ sub shouldBeHidden
+ {
+ return 1;
+ }
+
+ sub getFilePatterns
+ {
+ return ();
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms', 'GCMusics'];
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $pluginsList;
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ push @$pluginsList,$plugin->getName;
+ }
+
+
+ return [
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+ {
+ name => 'multipleResult',
+ type => 'options',
+ label => 'MultipleResult',
+ tooltip => 'MultipleResultTooltip',
+ valuesList => 'Ask,AskEnd,AddWithoutInfo,DontAdd,TakeFirst',
+ default => 'Ask',
+ },
+ {
+ name => 'noResult',
+ type => 'options',
+ label => 'NoResult',
+ tooltip => 'NoResultTooltip',
+ valuesList => 'AddWithoutInfo,DontAdd', # TODO AskNewName AskNewPlugin at End
+ default => 'AddEmpty',
+ },
+ {
+ name => 'recursive',
+ type => 'yesno',
+ label => 'Recursive',
+ default => '1'
+ },
+
+ {
+ name => 'suffixes',
+ type => 'short text',
+ label => 'Suffixes',
+ tooltip => 'SuffixesTooltip',
+ default => '',
+ },
+
+ {
+ name => 'remove',
+ type => 'short text',
+ label => 'Remove',
+ tooltip => 'RemoveTooltip',
+ default => '',
+ },
+ {
+ name => 'removeWholeWord',
+ type => 'yesno',
+ label => 'RemoveWholeWord',
+ tooltip => 'RemoveTooltipWholeWord',
+ default => '1',
+ },
+ {
+ name => 'removeRegularExpr',
+ type => 'yesno',
+ label => 'RemoveRegularExpr',
+ tooltip => 'RemoveTooltipRegularExpr',
+ changedCallback => sub {
+ my ($self,$widget) =@_;
+ $widget->[0]->{options}->{removeWholeWord}->lock($self->getValue);
+ },
+ default => '0',
+ },
+ {
+ name => 'skipFileAlreadyInCollection',
+ type => 'options',
+ label => 'SkipFileAlreadyInCollection',
+ tooltip => 'SkipFileAlreadyInCollectionTooltip',
+ valuesList => 'SkipFileNo,SkipFileFullPath,SkipFileFileName,SkipFileFileNameAndUpdate',
+ default => 'SkipFileNo',
+ },
+ {
+ name => 'infoFromFileNameRegExp',
+ type => 'history text',
+ label => 'InfoFromFileNameRegExp',
+ tooltip => 'InfoFromFileNameRegExpTooltip',
+ initValues => ['',
+ '^$A\s*([[\(]part $x( of $y)?[)\]])?\s*([[\(]$Y[)\]])?\s*$',
+ '^$N\s+[^\w ]\s+S$SE$E\s+[^\w ]\s+$T\s+([[(]part $x( of $y)?[)\]])?\s*$',
+ ],
+ default => '',
+ },
+ ];
+
+
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ # Required by extracter to make this class acts as a panel
+ sub AUTOLOAD
+ {
+ return [];
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $directory) = @_;
+ my @result;
+ my @filesList;
+
+ #First we try to get the correct plugin
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $plugin->{bigPics} = $self->{options}->{parent}->{options}->bigPics;
+ my $titleField = $self->{model}->{commonFields}->{title};
+ my $fileField = $self->{model}->{commonFields}->{play};
+
+ # Required by extracter
+ $self->{lang} = $self->{options}->{lang};
+
+ (my $suffixes = $self->{options}->{suffixes}) =~ s/[,; ]/\|/g;
+ $suffixes =~ s/\*\.//g;
+ # Create list of files
+ if ($self->{options}->{recursive})
+ {
+ find(sub {
+ return if -d $File::Find::name;
+ return if ! /$suffixes$/;
+ my $name=Encode::decode_utf8($File::Find::name);
+ push @filesList, $name;
+ }, $directory);
+ }
+ else
+ {
+ foreach (glob "$directory/*")
+ {
+ next if -d $_;
+ next if ! /$suffixes$/;
+ push @filesList, $_;
+ }
+ }
+ my $resultsDialog;
+ # initialize choose good result dialog if needed
+ if (($self->{options}->{multipleResult} ne 'Ask') || ($self->{options}->{multipleResult} ne 'AskEnd'))
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+ #Initialize stuff to retrieve info from name with regexp
+ my $infoFromName;
+ if ($self->{options}->{infoFromFileNameRegExp} ne '')
+ {
+ my %knownParam=($titleField=>'T',alphabTitle=>'A',year=>'Y',season=>'S',episode=>'E',alphabSeries=>'N',number=>'x',totNumber=>'y');
+ my $orderStr= $self->{options}->{infoFromFileNameRegExp};
+ $orderStr=~ s/(?<!\$).//g;
+ # Search the order of $A $T ... in the user regexp
+ my %places;
+ foreach my $key (keys %knownParam) {
+ my $i=1+index $orderStr,$knownParam{$key};
+ $places{$i} = $key;
+ }
+ my $myRegExp=$self->{options}->{infoFromFileNameRegExp};
+ # avoid capturing something else than $T,$A ... make already present () not capturing
+ $myRegExp =~ s/(?<!\\)\(/(?:/g;
+ my $articles='(?:'.join('|',@{$self->{model}->{parent}->{articles}}).')\'?\b';
+ our $myRegExpArt=qr/^(.*?)(?:, ?($articles))?$/i;
+
+ $myRegExp =~ s/\$A/(.*?(?:, ?$articles)?)/g;
+ $myRegExp =~ s/\$N/(.*?(?:, ?$articles)?)/g;
+ $myRegExp =~ s/\$T/(.*?)/;
+ $myRegExp =~ s/\$Y/(\\d{2}|\\d{4}?)/;
+ $myRegExp =~ s/\$x/(\\d{1,2})/;
+ $myRegExp =~ s/\$y/(\\d{1,2})/;
+ $myRegExp =~ s/\$E/(\\d{1,4}?)/;
+ $myRegExp =~ s/\$S/(\\d{1,2}?)/;
+ sub deAlpha{
+ my $s;
+ $_[0] =~ $myRegExpArt;
+ $s=$1;
+ my $a=$2.' ' if $2 && (substr($2,-1) ne '\'');
+ $s=$a.$s if $a;
+ return $s;
+ }
+ # Check if regexp is good
+ my $pattern = shift;
+ my $test = eval { $myRegExp=qr/$myRegExp/i };
+ #print $myRegExp;
+ #
+ if ($@)
+ {
+ $myRegExp= qr/./ ;print $@;
+ }
+ my $i=2;
+ $infoFromName=sub {
+ my $n=$_[0] ;
+ $n=~ $myRegExp;
+ my %info; # TODO Can be more readable in Perl 5.10 by using named capturing
+ $info{$places{1}}=$1 if $1;$info{$places{2}}=$2 if $2;$info{$places{3}}=$3 if $3;$info{$places{4}}=$4 if $4;$info{$places{5}}=$5 if $5;
+ $info{$places{6}}=$6 if $6;$info{$places{7}}=$7 if $7;$info{$places{8}}=$8 if $8;$info{$places{9}}=$9 if $9;$info{$places{10}}=$10 if $10;
+ $info{$places{11}}=$11 if $11;$info{$places{12}}=$12 if $12;$info{$places{13}}=$13 if $13;$info{$places{14}}=$14 if $14;$info{$places{15}}=$15 if $15;
+ $info{$places{16}}=$16 if $16;$info{$places{17}}=$17 if $17;$info{$places{18}}=$18 if $18;$info{$places{19}}=$19 if $19;$info{$places{20}}=$20 if $20;
+
+ $info{$titleField}=deAlpha($info{alphabTitle}) if($info{alphabTitle});
+ $info{series}=deAlpha($info{alphabSeries}) if($info{alphabSeries});
+ return \%info;
+ }
+ }
+ # initialize regexp word to remove
+ my $removed =$self->{options}->{remove};
+ if(!$self->{options}->{removeRegularExpr})
+ {
+ $removed =~ s/[,; ]/\|/g;
+ if($self->{options}->{removeWholeWord})
+ {
+ $removed=~s/\|/\\b\|\\b/g ;
+ $removed='\b'.$removed.'\b';
+ }
+ }
+ # if we want to ignore files already in the list
+ # we initialize a hash with filenames to be fast !
+ my %fileNameKnown;
+ if($self->{options}->{skipFileAlreadyInCollection} ne 'SkipFileNo')
+ {
+ if($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFullPath')
+ {
+ foreach my $originalFilm(@{$self->{options}->{originalList}->{itemArray}})
+ {
+ $fileNameKnown{$originalFilm->{$fileField}}=$originalFilm;
+ }
+ }
+ else
+ {
+ foreach my $originalFilm(@{$self->{options}->{originalList}->{itemArray}})
+ {
+ $fileNameKnown{basename($originalFilm->{$fileField})}=$originalFilm;
+ }
+ }
+ }
+ my $hasFileWaiting=0;my $inWaitingQueue=0;
+ # Main loop on files entries
+ file: foreach my $file(@filesList)
+ {
+ if($file eq 'WaitingList')
+ {
+ $inWaitingQueue=1;
+ next file;
+ }
+ # Skip file already in the collection
+ next file if(($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFullPath') && (exists $fileNameKnown{$file}));
+ next file if(($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFileName') && (exists $fileNameKnown{basename($file)}));
+ if(($self->{options}->{skipFileAlreadyInCollection} eq 'SkipFileFileNameAndUpdate') && (exists $fileNameKnown{basename($file)}))
+ {
+ # if filename already in collection, and collection full path invalid : correct it
+ if (!(-e $fileNameKnown{basename($file)}->{$fileField}))
+ {
+ print "Path updated : ",$fileNameKnown{basename($file)}->{$fileField},"\n";
+ print " --> ",$file,"\n";
+ $fileNameKnown{basename($file)}->{$fileField}=$file;
+ }
+ next file;
+ }
+
+ # Get info from the file (avi, mp3, ...)
+ my $extracter = $self->{model}->getExtracter($self, $file, $self, $self->{model});
+ my $extracted = $extracter->getInfo;
+ # Add info from file
+ my $infoFromFile={$fileField => $file};
+ foreach my $field(keys %$extracted)
+ {
+ $infoFromFile->{$field} = $extracted->{$field}->{value};
+ }
+
+ # Test if subtitle is present
+ if ($self->{model}->getName eq 'GCfilms')
+ {
+ my @subtitlesExt=qw(sub srt);
+ my @subtitlesFiles;
+ my $startFileName=$file;
+ $startFileName=~s/\.[^.]*$//;
+ for my $ext(@subtitlesExt)
+ {
+ my $fileSubsName=$startFileName.'.'.$ext;
+ if(-e $fileSubsName)
+ {
+ #TODO Try to guess the language see cpan
+ my $lang=["Yes"];
+ push @subtitlesFiles,$lang;
+ }
+ }
+ $infoFromFile->{subt}=\@subtitlesFiles if (@subtitlesFiles);
+ }
+ my $infoFromFileName;
+ my $name = basename($file);
+ # Filter the name
+ # Remove suffix
+ $name =~ s/\.[^.]*$//;
+ # Try to apply regexp on filename
+ if ($self->{options}->{infoFromFileNameRegExp} ne '')
+ {
+ $infoFromFileName=&$infoFromName($name);
+ $name = $infoFromFileName->{$titleField} if ($infoFromFileName->{$titleField} ne '');
+ #TODO: Use this known info to search with plugin
+ }
+ # Remove everything between () {} []
+ $name =~ s/[\(\[\{].*?[\)\]\}]/ /g;
+ # Remove special characters
+ $name =~ s/[-\._,#@"']/ /g;
+ #'"
+ # Remove info from extracter for movies
+ if ($self->{model}->getName eq 'GCfilms')
+ {
+ my $info = $extracted->{video}->{value}.'|'.$extracted->{audio}->{value}->[0]->[1];
+ $info =~ s/ (.*?)//g;
+ $name =~ s/$info//g;
+ }
+ $name =~ s/$removed//gi;
+
+ # $name contains the title to search
+ $plugin->{title} = $name;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $titleField;
+
+ #Initialize what will be pushed in the array
+ my $infoPlugin = {$titleField => $name};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$name.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber == 0)
+ {
+ goto endPluginGetItemInfo if (($self->{options}->{noResult} eq 'AddEmpty'));
+ next file if (($self->{options}->{noResult} eq 'DontAdd'));
+ }
+ else
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{multipleResult} eq 'TakeFirst'))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ elsif($self->{options}->{multipleResult} eq 'AddWithoutInfo' )
+ {
+ goto endPluginGetItemInfo;
+ }
+ elsif($self->{options}->{multipleResult} eq 'DontAdd' )
+ {
+ next file;
+ }
+ elsif($self->{options}->{multipleResult} eq 'AskEnd' && !$inWaitingQueue)
+ {
+ # re push the filename at the end of the list, to be proceded
+ push @filesList,'WaitingList' if !$hasFileWaiting;
+ push @filesList,$file;
+ $hasFileWaiting=1;
+ next file;
+ }
+ else
+ {
+ # Ask the user to choose
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($name, @items);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $infoPlugin = $plugin->getItemInfo;
+ my $title = $infoPlugin->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $infoPlugin->{$field} = '' if $infoPlugin->{$field} eq 'empty';
+ next if !$infoPlugin->{$field};
+ ($infoPlugin->{$field}) = $self->{options}->{parent}->downloadPicture($infoPlugin->{$field}, $title);
+ }
+ $infoPlugin->{plugin} =$plugin->getName();
+ $infoPlugin->{comment} = $self->getLang->{CommentAuto}
+ . "\n"
+ . $self->getLang->{CommentSite}
+ . $plugin->getName()
+ . "\n"
+ . $self->getLang->{CommentTitle}
+ . $name
+ . "\n"
+ . $extracted->{comment}->{displayed};
+ }
+ endPluginGetItemInfo:
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+
+ my $info;
+ # TODO : ask the user for order, or even for order on each fields
+ my @order=($defaultInfo,$infoFromFile,$infoFromFileName,$infoPlugin);
+ for my $infoSource(@order)
+ {
+ foreach my $field(keys %$infoSource)
+ {
+ $info->{$field} =$infoSource->{$field} if $infoSource->{$field};
+ }
+ }
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportGCfilms.pm b/lib/gcstar/GCImport/GCImportGCfilms.pm
new file mode 100644
index 0000000..285e17d
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportGCfilms.pm
@@ -0,0 +1,190 @@
+package GCImport::GCImportGCfilms;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterGCfilms;
+ use base qw(GCImport::GCImportBaseClass);
+ use File::Basename;
+ use File::Copy;
+ use GCUtils;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ $self->{errors} = '';
+
+ #The fields as they were in GCfilms 6.1
+ # If name has changed in GCstar, the comment contains the original one
+ $self->{fields} = [
+ 'id',
+ 'title',
+ 'date',
+ 'time',
+ 'director',
+ 'country', # nat
+ 'genre', # type
+ 'image',
+ 'actors',
+ 'original', # orig
+ 'synopsis',
+ 'webPage', # url
+ 'seen',
+ 'format',
+ 'number',
+ 'place',
+ 'rating',
+ 'comment',
+ 'audio',
+ 'subt',
+ 'borrower',
+ 'lendDate',
+ 'borrowings', # history
+ 'age',
+ 'video',
+ 'serie', # collection
+ 'rank',
+ 'trailer',
+ ];
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "GCfilms (.gcf)";
+ }
+
+ sub getFilePatterns
+ {
+ return (['GCfilms (.gcf)', '*.gcf']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ return [
+ {
+ name => 'generate',
+ type => 'yesno',
+ label => 'ImportGenerateId',
+ default => '1'
+ },
+ ];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub generateId
+ {
+ my $self = shift;
+ return $self->{options}->{generate};
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ open MOVIES, "<$file";
+ my $gotFirstLine = 0;
+ my $i = 0;
+ while (<MOVIES>)
+ {
+ chomp;
+ my @values = split m/\|/;
+
+ if (!$gotFirstLine)
+ {
+ $gotFirstLine = 1;
+ if ($values[0] eq 'GCfilms')
+ {
+ binmode( MOVIES, ':utf8' ) if $values[2] eq 'UTF8';
+ next;
+ }
+ }
+ my $idx = 0;
+ for my $field (@{$self->{fields}})
+ {
+ my $value = $values[$idx];
+ if ($field eq 'image')
+ {
+ my $origPath = GCUtils::getDisplayedImage($value, '', $file);
+ my $origFile = basename($origPath);
+ $origFile = $origPath = '' if ! -f $origPath;
+ # We copy the image only if it was a generated one and if we use the default path
+ if ($origFile =~ /^gcfilms_/)
+ {
+ # We don't change the filename as gcstar has a different pattern for automatic files
+ my $destPath = $self->{options}->{parent}->getImagesDir;
+ copy($origPath, $destPath) if $origPath ne $destPath;
+ $result[$i]->{image} = $destPath.$origFile;
+ }
+ else
+ {
+ # We use the full path
+ $result[$i]->{image} = $origPath;
+ }
+ }
+ else
+ {
+ $value =~ s|:|;|gm if $field eq 'borrowings';
+ $value =~ s|<br>|\n|gm;
+ $value =~ s|<.*?>||gm;
+ if (!$value)
+ {
+ $value = 0 if $field eq 'age';
+ $value = 'none' if $field eq 'borrower';
+ }
+ $result[$i]->{$field} = $value;
+ }
+ $idx++;
+ }
+ $i++;
+ }
+ return \@result;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportGCstar.pm b/lib/gcstar/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..1bff9c2
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportGCstar.pm
@@ -0,0 +1,106 @@
+package GCImport::GCImportGCstar;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterGCstar;
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCBackend::GCBackendXmlParser;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getName
+ {
+ return "GCstar (.gcs)";
+ }
+
+ sub getFilePatterns
+ {
+ return (['GCstar (.gcs)', '*.gcs']);
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ return [
+ {
+ name => 'copyPics',
+ type => 'yesno',
+ label => 'CopyPictures',
+ default => '1'
+ }];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+
+ my $parent = $self->{options}->{parent};
+ $self->{modelsFactory} = $parent->{modelsFactory};
+ $self->{modelAlreadySet} = 0;
+
+ my $copyPics = 1;
+ $copyPics = $self->{options}->{copyPics}
+ if exists $self->{options}->{copyPics};
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $file);
+ my $loaded = $backend->load(0);
+ my $itemsArray = $loaded->{data};
+ if ($copyPics)
+ {
+ $self->copyPictures($itemsArray, $file);
+ }
+ return $itemsArray;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportList.pm b/lib/gcstar/GCImport/GCImportList.pm
new file mode 100644
index 0000000..a2b2ec2
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportList.pm
@@ -0,0 +1,202 @@
+package GCImport::GCImportList;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterList;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCPlugins;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+ sub getFilePatterns
+ {
+ return ();
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $pluginsList = '';
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ $pluginsList .= $plugin->getName . ',';
+ }
+
+
+ return [
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+
+ {
+ name => 'first',
+ type => 'yesno',
+ label => 'UseFirst',
+ default => '1'
+ },
+ ];
+
+
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ #First we try to get the correct plugin
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $plugin->{bigPics} = $self->{options}->{parent}->{options}->bigPics;
+
+ my $titleField = $self->{model}->{commonFields}->{title};
+
+ open ITEMS, $file;
+ binmode(ITEMS, ':utf8');
+
+ my $i = 0;
+
+ my $resultsDialog;
+ if (!$self->{options}->{first})
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+ while (<ITEMS>)
+ {
+ chomp;
+ next if ! $_;
+ # $_ contains the title to search
+ $plugin->{title} = $_;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $titleField;
+ #Initialize what will be pushed in the array
+ my $info = {$titleField => $_};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$_.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber != 0)
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{first}))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ else
+ {
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($_, @items);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $info = $plugin->getItemInfo;
+ my $title = $info->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $info->{$field} = '' if $info->{$field} eq 'empty';
+ next if !$info->{$field};
+ ($info->{$field}) = $self->{options}->{parent}->downloadPicture($info->{$field}, $title);
+ }
+ $info->{comment} = $self->getLang->{CommentAuto}
+ . "\n"
+ . $self->getLang->{CommentSite}
+ . $plugin->getName()
+ . "\n"
+ . $self->getLang->{CommentTitle}
+ . $_
+ . "\n";
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+ foreach my $field(keys %$defaultInfo)
+ {
+ next if exists $info->{$field};
+ $info->{$field} = $defaultInfo->{$field};
+ }
+ }
+
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+ close ITEMS;
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ return $message;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportMyMovies.pm b/lib/gcstar/GCImport/GCImportMyMovies.pm
new file mode 100644
index 0000000..a51b1c4
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportMyMovies.pm
@@ -0,0 +1,211 @@
+package GCImport::GCImportMyMovies;
+
+#################################################################################
+#
+# Created by Rob Maas rob@progob.nl | http://www.robmaas.eu (2008)
+#
+#
+# This file is strongly based op the already existing DVDProfiler
+# import class. It is also my first perl script :-)
+#
+# Since MyMovies has some different fields then GCStar, there are some work
+# arounds to get as much of the original data.
+#
+# If the field ExtraFeatures is filled, it will appear in the General tab in
+# the synopsis.
+#
+# The rating system will be calculated back to the Dutch rating system.
+#
+# If data was imported from IMDB, the webpage button will link to the specific
+# movie site on IMDB.
+#
+# Cause GCstar hasn´t (yet?) a real EAN field, the EAN code is placed on the
+# details tab under comments.
+#
+# Special thanks goes to Tian who helped me with some array trouble :-P and
+# for creating this software.
+#
+#################################################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterMyMovies;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use XML::Simple;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "MyMovies (.xml)";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getFilePatterns
+ {
+ return (['MyMovies (.xml)', '*.xml']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ return ['GCfilms'];
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ return "";
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my $xml;
+ my $data;
+ # Creates an object / Skip empty ellements
+ $xml = new XML::Simple(suppressempty => 1);
+ $data = $xml->XMLin ("$file");
+
+ my @result;
+ my $film;
+
+ # For each "Title" in the XML file
+ foreach $film(@{$data->{Title}}){
+ my $item;
+
+ #General fields
+ $item->{title} = $film->{LocalTitle};
+ $item->{original} = $film->{OriginalTitle};
+ $item->{date} = $film->{ProductionYear};
+ $item->{time} = $film->{RunningTime}.' min';
+ $item->{synopsis} = $film->{Description};
+
+ #Extra's on the disc
+ if ($film->{ExtraFeatures}->{content}){
+ $item->{synopsis} .= "\n\nEXTRA\n";
+ $item->{synopsis} .= $film->{ExtraFeatures}->{content};
+ }
+
+ #Based on the Dutch ratings!
+
+ $item->{age} =
+ ($film->{ParentalRating}->{Value} == 1) ? 1
+ : ($film->{ParentalRating}->{Value} == 2) ? 2
+ : ($film->{ParentalRating}->{Value} == 3) ? 5
+ : ($film->{ParentalRating}->{Value} == 4) ? 12
+ : 16;
+
+ if ($film->{DataProvider} eq 'IMDB.com'){
+ $item->{webPage} = 'http://www.imdb.com/title/'.$film->{DataProviderId};
+ }
+ $item->{country} = $film->{Country};
+
+ ###### GENRE #########
+ my $type;
+ if (ref ($film->{Genres}->{Genre}) eq "ARRAY"){
+ foreach $type(@{$film->{Genres}->{Genre}}){
+ $item->{genre} .= $type.',';
+ }
+ }
+ else{
+ $item->{genre} = $film->{Genres}->{Genre};
+ }
+ ###### END GENRE #########
+ ####### DIRECTOR AND ACTORS #########
+ my $actor;
+ if (ref ($film->{Persons}->{Person}) eq "ARRAY") {
+ foreach $actor(@{$film->{Persons}->{Person}}){
+ if ($actor->{Type} eq 'Director'){
+ $item->{director} = $actor->{Name};
+ }
+ else{
+ $item->{actors}.= $actor->{Name}.' ('.$actor->{Role}.'), ';
+ }
+ }
+ }
+ else{
+ $item->{actors}.= $film->{Persons}->{Person}->{Name}.' ('.$film->{Persons}->{Person}->{Role}.')';
+ }
+ ###### END DIRECTOR AND ACTORS ######
+
+ ##DETAIL
+ $item->{format} = $film->{Type};
+ $item->{video} = $film->{VideoStandard};
+ $item->{added} = $film->{Added};
+ $item->{identifier} = $film->{CollectionNumber};
+
+ #Temporately cause a real barcode field is missing
+ if (length($film->{Barcode}) gt 0){
+ $item->{comment} = 'EAN: '.$film->{Barcode};
+ }
+
+ ###### AUDIO #########
+ my $audio;
+ my @audioTracks;
+ if (ref ($film->{AudioTracks}->{AudioTrack}) eq "ARRAY"){
+ foreach $audio(@{$film->{AudioTracks}->{AudioTrack}}){
+ push @audioTracks, [$audio->{Language}, $audio->{Type}.' '.$audio->{Channels}];
+ }
+ $item->{audio} = \@audioTracks;
+ }
+ else{
+ $item->{audio} = [[$audio->{Language}, $audio->{Type}]];
+ }
+ ###### END AUDIO #########
+ ###### SUBTITLES #########
+ my $subt;
+ if (ref ($film->{Subtitles}->{Subtitle}) eq "ARRAY"){
+ foreach $subt(@{$film->{Subtitles}->{Subtitle}}){
+ $item->{subt} .= $subt->{Language}.',';
+ }
+ }
+ else{
+ $item->{subt} = $subt->{Language};
+ }
+ ###### END SUBTITLES #########
+
+ #$item->{borrower} = $film->{Title};
+ #$item->{lendDate} = $film->{Title};
+ #$item->{history} = $film->{Title};
+ #$item->{seen} = $film->{Title};# non par defaut ?
+ #$item->{image} = $film->{Title};
+ #$item->{number} = $film->{CollectionNumber};
+ #$item->{rating} = $film->{Title};# note par defaut
+ #$item->{place} = $film->{Title};
+
+ $item->{director} =~ s/, $//;
+ $item->{actors} =~ s/, $//;
+ $item->{audio} =~ s/, $//;
+ $item->{subt} =~ s/, $//;
+ $item->{genre} =~ s/, $//;
+ push @result, $item;
+ }
+ return \@result;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportScanner.pm b/lib/gcstar/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..92c5bba
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportScanner.pm
@@ -0,0 +1,394 @@
+package GCImport::GCImportList;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ package GCScannerDialog;
+ use base 'GCModalDialog';
+ use XML::Simple;
+
+ sub new
+ {
+ my ($proto, $parent, $lang, $model, $serverSocket) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $lang->{Waiting});
+ bless($self, $class);
+
+ $self->{lang} = $lang;
+ $self->{model} = $model;
+ $self->{accepted} = 0;
+ if ($serverSocket)
+ {
+ $self->{network} = 1;
+ $self->{serverSocket} = $serverSocket;
+ }
+ my $table = new Gtk2::Table(2, 2);
+ $table->set_row_spacings($GCUtils::halfMargin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::margin);
+ $self->{previousLabel} = new GCLabel('');
+ $self->{promptLabel} = new GCLabel($lang->{ScanPrompt});
+ $table->attach($self->{previousLabel}, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{promptLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ my $eanLabel = new GCLabel($lang->{EAN});
+ $self->{ean} = new GCShortText;
+ $self->{ean}->signal_connect('activate' => sub {$self->response('ok')} );
+ if (!$self->{network})
+ {
+ $table->attach($eanLabel, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $table->attach($self->{ean}, 1, 2, 2, 3, ['fill', 'expand'], 'fill', 0, 0);
+ }
+ $self->vbox->pack_start($table, 1, 1, 0);
+ $table->show_all;
+ $self->setCancelLabel($lang->{Terminate});
+ $self->action_area->remove(($self->action_area->get_children)[$self->{okPosition}]);
+ return $self;
+ }
+
+ sub setPrevious
+ {
+ my ($self, $previous) = @_;
+ if (!$self->{first})
+ {
+ $self->{first} = 1;
+ return;
+ }
+ my $label;
+ if ($previous)
+ {
+ ($label = $self->{lang}->{Previous}) =~ s|%s|<b>$previous</b>|;
+ }
+ else
+ {
+ my $previous = $self->{previousCode};
+ ($label = $self->{lang}->{NothingFound}) =~ s|%s|<b>$previous</b>|;
+ }
+ $self->{previousLabel}->set_markup($label);
+ $self->{promptLabel}->set_label($self->{lang}->{ScanOtherPrompt});
+ }
+
+ sub readSocket
+ {
+ my ($self) = @_;
+ Glib::Source->remove($self->{socketWatch});
+ my $socket = $self->{socket};
+ my $line = <$socket>;
+ $self->response('cancel') if !$line;
+ my $xs = XML::Simple->new;
+ my $scan = $xs->XMLin($line);
+ my $code = $scan->{scan}->{content};
+ $code = $self->eanToIsbn($code)
+ if $self->{model} eq 'GCbooks';
+ $self->{ean}->setValue($code);
+ $self->{previousCode} = $code;
+ $self->response('ok');
+ }
+
+ sub waitForCode
+ {
+ my $self = shift;
+ $self->{socketWatch} = Glib::IO->add_watch($self->{socket}->fileno,
+ 'in',
+ sub {
+ $self->readSocket;
+ });
+ }
+
+ sub eanToIsbn
+ {
+ my ($self, $code) = @_;
+ return $code if $code !~ /978(\d{9})/;
+ my $sub = $1;
+ my $multiplier = 1;
+ my $checkSum = 0;
+ foreach (split(//, $sub))
+ {
+ $checkSum += $_ * $multiplier++;
+ }
+ $checkSum %= 11;
+ $checkSum = 'X' if $checkSum == 10;
+ return $sub.$checkSum;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->showMe;
+ if ($self->{network})
+ {
+ if (!$self->{accepted})
+ {
+ $self->{serverWatch} = Glib::IO->add_watch($self->{serverSocket}->fileno,
+ 'in',
+ sub {
+ $self->{socket} = $self->{serverSocket}->accept;
+ $self->{accepted} = 1;
+ $self->waitForCode;
+ });
+ }
+ else
+ {
+ $self->waitForCode;
+ }
+ }
+ else
+ {
+ $self->{ean}->setValue('');
+ $self->{ean}->grab_focus;
+ }
+ my $code = $self->run;
+ $self->hide;
+ return $self->{ean}->getValue if $code eq 'ok';
+ $self->{socket}->close;
+ return undef;
+ }
+}
+
+{
+ package GCImport::GCImporterScanner;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use IO::Socket;
+ use GCPlugins;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub wantsFileSelection
+ {
+ return 0;
+ }
+
+ sub hideFileSelection
+ {
+ return 1;
+ }
+
+ sub getFilePatterns
+ {
+ return ();
+ }
+
+ sub checkPortField
+ {
+ my ($self, $data) = @_;
+ my ($parent, $list) = @{$data};
+ my $model = $list->getValue ;
+ $parent->{options}->{port}->set_sensitive($model eq 'Network');
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+
+ my $pluginsList = '';
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$_};
+ $pluginsList .= $plugin->getName . ','
+ if $plugin->getEanField;
+ }
+
+
+ return [
+ {
+ name => 'type',
+ type => 'options',
+ label => 'Type',
+ valuesList => 'Local,Network',
+ default => 'Local',
+ changedCallback => sub {shift; $self->checkPortField(@_)},
+ },
+
+ {
+ name => 'port',
+ type => 'number',
+ label => 'Port',
+ default => 50007,
+ min => 1024,
+ max => 65536,
+ },
+
+ {
+ name => 'plugin',
+ type => 'options',
+ label => 'Plugin',
+ valuesList => $pluginsList
+ },
+
+ {
+ name => 'first',
+ type => 'yesno',
+ label => 'UseFirst',
+ default => '1'
+ },
+ ];
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+ return $self->{model}->getName;
+ }
+
+ sub getBarCode
+ {
+ my ($self, $previous) = @_;
+ #my $dialog = new
+ $self->{dialog}->setPrevious($previous);
+ return $self->{dialog}->show;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ #First we try to get the correct plugin
+ my $plugin = $GCPlugins::pluginsMap{$self->{model}->getName}->{$self->{options}->{plugin}};
+ $plugin->{bigPics} = $self->{options}->{parent}->{options}->bigPics;
+
+ my $titleField = $self->{model}->{commonFields}->{title};
+ my $searchField = $plugin->getEanField;
+
+ my $i = 0;
+
+ my $resultsDialog;
+ if (!$self->{options}->{first})
+ {
+ $resultsDialog = $self->{options}->{parent}->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ }
+ my $search;
+
+ my $socket;
+ if ($self->{options}->{type} eq 'Network')
+ {
+ $socket = new IO::Socket::INET(
+ LocalPort => $self->{options}->{port},
+ Proto => 'tcp',
+ Listen => 1,
+ Reuse => 1
+ );
+ }
+
+ $self->{dialog} = new GCScannerDialog($self->{options}->{parent},
+ $self->getLang,
+ $self->{model}->getName,
+ $socket);
+ my $previous = '';
+ while ($search = $self->getBarCode($previous))
+ {
+ chomp $search;
+ next if ! $search;
+ # $_ contains the title to search
+ $plugin->{title} = $search;
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{searchField} = $searchField;
+ #Initialize what will be pushed in the array
+ my $info = {$searchField => $search};
+
+ $self->{options}->{parent}->setWaitCursor($self->{options}->{lang}->{StatusSearch}.' ('.$search.')');
+ $plugin->load;
+
+ my $itemNumber = $plugin->getItemsNumber;
+
+ if ($itemNumber != 0)
+ {
+ $plugin->{type} = 'info';
+ if (($itemNumber == 1) || ($self->{options}->{first}))
+ {
+ $plugin->{wantedIdx} = 0;
+ }
+ else
+ {
+ my $withNext = 0;
+ my @items = $plugin->getItems;
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList($search);
+ $resultsDialog->show;
+ if ($resultsDialog->{validated})
+ {
+ $plugin->{wantedIdx} = $resultsDialog->getItemsIndexes->[0];
+ }
+ }
+ $info = $plugin->getItemInfo;
+ my $title = $info->{$titleField};
+ $self->{options}->{parent}->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ foreach my $field(@{$self->{model}->{managedImages}})
+ {
+ $info->{$field} = '' if $info->{$field} eq 'empty';
+ next if !$info->{$field};
+ ($info->{$field}) = $self->{options}->{parent}->downloadPicture($info->{$field}, $title);
+ }
+
+ # Add the default value
+ my $defaultInfo = $self->{model}->getDefaultValues;
+ foreach my $field(keys %$defaultInfo)
+ {
+ next if exists $info->{$field};
+ $info->{$field} = $defaultInfo->{$field};
+ }
+ }
+ $previous = $info->{$titleField};
+ push @result, $info;
+ $self->{options}->{parent}->restoreCursor;
+ }
+ $socket->close if $socket;
+ return \@result;
+ }
+
+
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+ return $message;
+ }
+}
+
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportTarGz.pm b/lib/gcstar/GCImport/GCImportTarGz.pm
new file mode 100644
index 0000000..b995b82
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportTarGz.pm
@@ -0,0 +1,152 @@
+package GCImport::GCImportTarGz;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterTarGz;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ use GCBackend::GCBackendXmlParser;
+
+ use File::Spec;
+ use File::Temp qw/ tempfile tempdir /;
+ use Cwd;
+ use File::Copy;
+
+ #use GCData;
+
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->checkModule('Compress::Zlib');
+ $self->checkModule('Archive::Tar');
+ $self->checkModule('File::Path');
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return ".tar.gz";
+ }
+
+ sub getFilePatterns
+ {
+ return (['Tar gzip (.tar.gz)', '*.tar.gz']);
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+
+ return $self->{model}->getName;
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ # Ignored for the moment
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+ sub getEndInfo
+ {
+ my $self = shift;
+ return ($self->{parsingError}, 'error');
+ }
+
+ sub addFieldsToDefaultModel
+ {
+ my ($self, $inlineModel) = @_;
+ my $model = GCModelLoader->newFromInline($self, {inlineModel => $inlineModel, defaultModifier => 1});
+ $self->{model}->addFields($model);
+ $self->{options}->{parent}->setCurrentModel($self->{model});
+ $self->{modelAlreadySet} = 1;
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+
+ my ($tarFh, $tarFilename) = tempfile();
+ my $gz = Compress::Zlib::gzopen($file, "rb");
+ my $buffer;
+ print $tarFh $buffer while $gz->gzread($buffer) > 0 ;
+ close $tarFh;
+ $gz->gzclose;
+
+ my $tmpDir = tempdir();
+ my $oldCwd = getcwd;
+ chdir $tmpDir;
+ my $tar = Archive::Tar->new($tarFilename);
+ $tar->extract;
+ my $listFile = './collection.gcs';
+
+ my $parent = $self->{options}->{parent};
+ $self->{modelsFactory} = $parent->{modelsFactory};
+ $self->{modelAlreadySet} = 0;
+
+ my $backend = new GCBackend::GCBeXmlParser($self);
+ $backend->setParameters(file => $listFile);
+ my $loaded = $backend->load(0);
+ my $itemsArray = [];
+ if ($loaded->{error})
+ {
+ $self->{parsingError} = GCUtils::formatOpenSaveError(
+ $parent->{lang},
+ $file,
+ $loaded->{error}
+ );
+ }
+ else
+ {
+ $itemsArray = $loaded->{data};
+
+ #Copying pictures
+ $self->copyPictures($itemsArray, $file);
+ }
+
+ #Cleaning
+ chdir $oldCwd;
+ File::Path::rmtree($tmpDir);
+ unlink $tarFilename;
+
+ return $itemsArray;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCImport/GCImportTellico.pm b/lib/gcstar/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..033b474
--- /dev/null
+++ b/lib/gcstar/GCImport/GCImportTellico.pm
@@ -0,0 +1,496 @@
+package GCImport::GCImportTellico;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCImport::GCImportBase;
+
+{
+ package GCImport::GCImporterTellico;
+
+ use base qw(GCImport::GCImportBaseClass);
+ use File::Spec;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->checkModule('Archive::Zip');
+ $self->checkModule('MIME::Base64');
+
+ # Associate a Tellico type to a GCstar model
+ $self->{models} = {
+ 2 => 'GCbooks',
+ 3 => 'GCfilms',
+ 4 => 'GCmusics',
+ 8 => 'GCcoins',
+ 11 => 'GCgames'
+ };
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Tellico (.tc)";
+ }
+
+ sub getOptions
+ {
+ my $self = shift;
+ my @options;
+ return \@options;
+ }
+
+ sub getFilePatterns
+ {
+ my $self = shift;
+
+ return (['Tellico Format (.tc)', '*.tc'], ['Tellico XML (.xml)', '*.xml']);
+ }
+
+ #Return supported models name
+ sub getModels
+ {
+ my $self = shift;
+ my @models = values %{$self->{models}};
+ return \@models;
+ }
+
+ sub getModelName
+ {
+ my $self = shift;
+
+ return $self->{extractedModel};
+ }
+
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ sub getEndInfo
+ {
+ my $self = shift;
+
+ return $self->{parsingError};
+ }
+
+ sub getItemsArray
+ {
+ my ($self, $file) = @_;
+
+ my @result = ();
+
+ my $xml;
+
+ # File type is based on suffix
+ # T is for Tellico (zipped file)
+ # X is for XML
+ $self->{type} = ($file =~ m/tc$/) ? 'T' : 'X';
+ #Then we test to be sure
+ eval
+ {
+ $self->{zip} = Archive::Zip->new($file);
+ };
+ #First we uncompress file
+ if (($self->{type} eq 'T') && ($self->{zip}))
+ {
+ $xml = $self->{zip}->contents('tellico.xml');
+ }
+ else
+ {
+ $self->{type} = 'X';
+ open XML, $file;
+ $xml = do {local $/; <XML>};
+ close XML;
+ }
+
+ #Then we parse XML data
+ my $xs = XML::Simple->new;
+ my $tellico = $xs->XMLin($xml,
+ SuppressEmpty => '',
+ ForceArray => 1);
+ my $collection = $tellico->{collection}->[0];
+
+ $self->{extractedModel} = $self->{models}->{$collection->{type}};
+ #We check we know this model
+ if (! $self->{extractedModel})
+ {
+ $self->{parsingError} = $self->getLang->{NotSupported};
+ return \@result;
+ }
+
+ my %tmpMap;
+ # If there are no ids, we have an array in $collection
+ if (ref ($collection->{entry}) eq 'ARRAY')
+ {
+ my $i = 0;
+ #Then we prepare a map
+ foreach (@{$collection->{entry}})
+ {
+ $tmpMap{$i} = $_;
+ $i++;
+ }
+ }
+ else
+ {
+ %tmpMap = %{$collection->{entry}};
+ }
+ #Loop on entries
+ my $i = 0;
+
+ my $methodName = 'get'.$self->{extractedModel}.'Item';
+
+ while (my ($id, $entry) = each (%tmpMap))
+ {
+ $result[$i] = $self->$methodName($entry, $collection);
+ $i++;
+ }
+ return \@result;
+
+ }
+
+ sub getGCfilmsItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{title} = $entry->{title}->[0];
+ $result{format} = $entry->{medium}->[0];
+ $result{date} = $entry->{year}->[0];
+ my $certification = $entry->{certification}->[0];
+ if ($certification eq 'U (USA)')
+ {
+ $result{age} = 1;
+ }
+ elsif ($certification eq 'G (USA)')
+ {
+ $result{age} = 2;
+ }
+ elsif ($certification eq 'PG (USA)')
+ {
+ $result{age} = 5;
+ }
+ elsif ($certification eq 'PG-13 (USA)')
+ {
+ $result{age} = 13;
+ }
+ elsif ($certification eq 'R (USA)')
+ {
+ $result{age} = 17;
+ }
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ if ($entry->{nationalitys}->[0])
+ {
+ for my $country(@{$entry->{nationalitys}->[0]->{nationality}})
+ {
+ $result{country} .= $country.', ';
+ }
+ }
+ $result{country} =~ s/, $//;
+
+ $result{video} = $entry->{format}->[0];
+ if ($entry->{casts}->[0])
+ {
+ for my $cast(@{$entry->{casts}->[0]->{cast}})
+ {
+ $result{actors} .= $cast->{column}->[0];
+ $result{actors} .= ' ('.$cast->{column}->[1].')' if $cast->{column}->[1];
+ $result{actors} .= ', ';
+ }
+ }
+ $result{actors} =~ s/, $//;
+
+ if ($entry->{directors}->[0])
+ {
+ for my $director(@{$entry->{directors}->[0]->{director}})
+ {
+ $result{director} .= $director.', ';
+ }
+ }
+ $result{director} =~ s/, $//;
+
+ $result{audio} = [];
+ if ($entry->{languages}->[0])
+ {
+ for my $language(@{$entry->{languages}->[0]->{language}})
+ {
+ push @{$result{audio}}, [$language];
+ }
+ }
+ $result{subt} = [];
+ if ($entry->{subtitles}->[0])
+ {
+ for my $subtitle(@{$entry->{subtitles}->[0]->{subtitle}})
+ {
+ push @{$result{subt}}, [$subtitle];
+ }
+ }
+ $result{time} = $entry->{'running-time'}->[0];
+ $result{synopsis} = $entry->{plot}->[0];
+ $result{synopsis} =~ s{(<|&lt;)br/>}{\n}g;
+
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ #$result{borrower} = 'none' if (! $entry->{loaned});
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{comment} = $entry->{comments}->[0];
+
+ #Picture management
+ $result{image} = $self->getPicture($collection, $entry->{cover}->[0], $result{title});
+
+ return \%result;
+ }
+
+ sub getGCgamesItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{name} = $entry->{title}->[0];
+ $result{platform} = $entry->{platform}->[0];
+ $result{released} = $entry->{year}->[0];
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ if ($entry->{publishers}->[0])
+ {
+ for my $editor(@{$entry->{publishers}->[0]->{publisher}})
+ {
+ $result{editor} .= $editor.', ';
+ }
+ $result{editor} =~ s/, $//;
+ }
+ if ($entry->{developers}->[0])
+ {
+ for my $developer(@{$entry->{developers}->[0]->{developer}})
+ {
+ $result{developer} .= $developer.', ';
+ }
+ $result{developer} =~ s/, $//;
+ }
+ $result{description} = $entry->{description}->[0];
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ $result{completion} = 100 if $entry->{completed}->[0] eq 'true';
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{boxpic} = $self->getPicture($collection, $entry->{cover}->[0], $result{name});
+ return \%result;
+ }
+
+ sub getGCbooksItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{title} = $entry->{title}->[0];
+ $result{isbn} = $entry->{isbn}->[0];
+ $result{authors} = [];
+ if ($entry->{authors}->[0])
+ {
+ for my $author(@{$entry->{authors}->[0]->{author}})
+ {
+ push @{$result{authors}}, [$author];
+ }
+ }
+ $result{publisher} = $entry->{publisher}->[0];
+ $result{publication} = $entry->{pub_year}->[0];
+ if ($entry->{languages}->[0])
+ {
+ for my $language(@{$entry->{languages}->[0]->{language}})
+ {
+ $result{language} .= $language.', ';
+ }
+ $result{language} =~ s/, $//;
+ }
+ $result{serie} = $entry->{series}->[0];
+ $result{rank} = $entry->{series_num}->[0];
+ $result{edition} = $entry->{edition}->[0];
+ $result{format} = $entry->{binding}->[0];
+ $result{description} = $entry->{comments}->[0];
+ $result{pages} = $entry->{pages}->[0];
+ $result{read} = 1 if ($entry->{read}->[0] eq 'true');
+ $result{acquisition} = $entry->{pur_date}->[0];
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{cover} = $self->getPicture($collection, $entry->{cover}->[0], $result{title});
+ return \%result;
+ }
+
+ sub getGCmusicsItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my %result;
+
+ $result{title} = $entry->{title}->[0];
+ $result{format} = $entry->{medium}->[0];
+ if ($entry->{artists}->[0])
+ {
+ for my $artist(@{$entry->{artists}->[0]->{artist}})
+ {
+ $result{artist} .= $artist.', ';
+ }
+ $result{artist} =~ s/, $//;
+ }
+ if ($entry->{labels}->[0])
+ {
+ for my $label(@{$entry->{labels}->[0]->{label}})
+ {
+ $result{label} .= $label.', ';
+ }
+ $result{label} =~ s/, $//;
+ }
+ $result{release} = $entry->{year}->[0];
+ $result{genre} = [];
+ if ($entry->{genres}->[0])
+ {
+ for my $genre(@{$entry->{genres}->[0]->{genre}})
+ {
+ push @{$result{genre}}, [$genre];
+ }
+ }
+ if ($entry->{tracks}->[0])
+ {
+ my $trackNum = 1;
+ for my $track(@{$entry->{tracks}->[0]->{track}})
+ {
+ push @{$result{tracks}}, [$trackNum,
+ $track->{column}->[0],
+ $track->{column}->[2]];
+ $trackNum++;
+ }
+ }
+ $result{comment} = $entry->{comments}->[0];
+ $result{rating} = $self->convertRating($entry->{rating}->[0]);
+ $result{borrower} = 'Unknown' if ($entry->{loaned}->[0] eq 'true');
+ $result{cover} = $self->getPicture($collection, $entry->{cover}->[0], $result{title});
+ return \%result;
+ }
+
+ sub getGCcoinsItem
+ {
+ my ($self, $entry, $collection) = @_;
+
+ my $i = 0;
+ my %result;
+
+ #$result{name} = $entry->{title}->[0];
+
+ $result{currency} = $entry->{type}->[0];
+ $result{value} = $entry->{denomination}->[0];
+ $result{year} = $entry->{years}->[0]->{year}->[0];
+ $result{country} = $entry->{country}->[0];
+ $result{type} = ($entry->{set}->[0] eq 'true') ? 'coin' : 'banknote';
+ # TODO: Import grade
+ $result{added} = $entry->{pur_date}->[0];
+ $result{estimate} = $entry->{pur_price}->[0];
+ $result{location} = $entry->{location}->[0];
+
+ $result{comments} = $entry->{comments}->[0];
+
+ $result{name} = $result{currency}.' '.$result{value}.' ('.$result{year}.')';
+
+ $result{picture} = $self->getPicture($collection, $entry->{obverse}->[0], $result{name});
+ $result{front} = $self->getPicture($collection, $entry->{obverse}->[0], $result{name}.'_front');
+ $result{back} = $self->getPicture($collection, $entry->{reverse}->[0], $result{name}.'_back');
+ return \%result;
+ }
+
+ sub getPicture
+ {
+ my ($self, $collection, $imageId, $title) = @_;
+
+ my $result = undef;
+ if ($imageId && (ref($imageId) ne 'HASH'))
+ {
+ (my $suffix = $imageId) =~ s/.*?(\.[^.]*)$/$1/;
+ my $fileName = $self->{options}->{parent}->getUniqueImageFileName($suffix, $title);
+ if ((exists $collection->{images}->[0]->{image}->{$imageId}) &&
+ (exists $collection->{images}->[0]->{image}->{$imageId}->{content}))
+ {
+ # Picture is embedded
+ my $data = MIME::Base64::decode_base64($collection->{images}->[0]->{image}->{$imageId}->{content});
+ open PIC, ">$fileName";
+ print PIC $data;
+ close PIC;
+ }
+ else
+ {
+ if ($self->{type} eq 'T')
+ {
+ # Only zipped file may have external pictures
+ my $picName = 'images/'.$imageId;
+ $self->{zip}->extractMember($picName, $fileName);
+ }
+ else
+ {
+ $fileName = '';
+ }
+ }
+ $result = $self->{options}->{parent}->transformPicturePath($fileName);
+ }
+ return $result;
+ }
+
+ sub convertRating
+ {
+ my ($self, $rating) = @_;
+ return 10 if $rating =~ /^5/;
+ return 7 if $rating =~ /^4/;
+ return 3 if $rating =~ /^2/;
+ return 0 if $rating =~ /^1/;
+ return 5; #if ($rating =~ /^3/) || ($rating == undef);
+ }
+
+}
+
+
+
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCImageListComponents.pm b/lib/gcstar/GCItemsLists/GCImageListComponents.pm
new file mode 100644
index 0000000..aa2bf2b
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCImageListComponents.pm
@@ -0,0 +1,848 @@
+package GCImageListComponents;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+{
+ package GCImageListItem;
+
+ use GCUtils;
+ use GCStyle;
+ use base "Gtk2::EventBox";
+ use File::Temp qw/ tempfile /;
+
+ @GCImageListItem::ISA = ('Gtk2::EventBox');
+
+ sub new
+ {
+ my ($proto, $container, $info) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+
+ # Some information that we'll need later
+ $self->{info} = $info;
+ $self->{container} = $container;
+ $self->{style} = $container->{style};
+ $self->{tooltips} = $container->{tooltips};
+ $self->{file} = $container->{parent}->{options}->file;
+ $self->{collectionDir} = $container->{collectionDir};
+ $self->{model} = $container->{parent}->{model};
+ $self->{imageCache} = $container->{imageCache};
+ $self->{dataManager} = $container->{parent}->{items};
+
+ $self->can_focus(1);
+ my $image = new Gtk2::Image;
+ $self->add($image);
+ $self->refreshInfo($info);
+ $self->set_size_request($container->{style}->{vboxWidth}, $container->{style}->{vboxHeight});
+ $self->show_all;
+
+ return $self;
+ }
+
+ sub setInfo
+ {
+ my ($self, $info) = @_;
+
+ $self->{info} = $info;
+ }
+
+ sub refreshInfo
+ {
+ my ($self, $info, $cacheRefresh) = @_;
+
+ $self->setInfo($info);
+
+ $self->refreshPopup;
+
+ delete $self->{zoomedPixbufCache};
+
+ {
+ my $pixbuf = $self->createPixbuf($info, $cacheRefresh);
+ if (! $self->{style}->{withImage})
+ {
+ $self->modify_bg('normal', $self->{style}->{inactiveBg});
+ }
+ $self->{previousPixbuf} = $pixbuf->copy;
+ $self->child->set_from_pixbuf($pixbuf);
+ }
+ if ($self->{selected})
+ {
+ $self->{selected} = 0;
+ $self->highlight;
+ $self->{selected} = 1;
+ }
+ }
+
+ sub refreshPopup
+ {
+ my $self = shift;
+ # Old versions of Gtk2 don't support set_tooltip_markup
+ eval {
+ $self->set_tooltip_markup($self->{dataManager}->getSummary($self->{info}->{idx}));
+ };
+ if ($@)
+ {
+ print "$@\n";
+ # So we do it the old way for them
+ $self->{tooltips}->set_tip($self, $self->{info}->{title}, '');
+ }
+ }
+
+ sub savePicture
+ {
+ my $self = shift;
+ $self->{previousPixbuf} = $self->child->get_pixbuf->copy
+ if $self->child;
+ }
+
+ sub restorePicture
+ {
+ my $self = shift;
+ $self->child->set_from_pixbuf($self->{previousPixbuf})
+ if $self->{previousPixbuf} && $self->child;
+ }
+
+ sub startZoomAnimation
+ {
+ my $self = shift;
+ $self->{currentZoom} = 1.01;
+ my $pixbuf = $self->createPixbuf($self->{info}, 0, 1.01);
+ $self->child->set_from_pixbuf($pixbuf);
+ $self->{zoomTimeout} = Glib::Timeout->add(20 , sub {
+ my $widget = shift;
+ $widget->{currentZoom} += 0.02;
+ if ($widget->{currentZoom} > 1.06)
+ {
+ $widget->{zoomTimeout} = undef;
+ return 0;
+ }
+ my $pixbuf = $widget->createPixbuf($self->{info}, 0, $widget->{currentZoom});
+ $widget->child->set_from_pixbuf($pixbuf)
+ if $widget->child;
+ return 1;
+ }, $self);
+ }
+
+ sub stopZoomAnimation
+ {
+ my $self = shift;
+ Glib::Source->remove($self->{zoomTimeout})
+ if $self->{zoomTimeout};
+ }
+
+ # This method sets all the event callbacks
+ sub prepareHandlers
+ {
+ my ($self, $idx, $info) = @_;
+ $self->{idx} = $idx;
+ $self->{info} = $info;
+
+ $self->signal_handler_disconnect($self->{mouseHandler})
+ if $self->{mouseHandler};
+ $self->{mouseHandler} = $self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+
+ if (($event->type ne '2button-press') && !(($event->button eq 3) && ($widget->{selected})))
+ {
+ my $state = $event->get_state;
+ my $keepPrevious = 0;
+ if ($state =~ /control-mask/)
+ {
+ $widget->{container}->select($widget->{idx}, 0, 1);
+ }
+ elsif ($state =~ /shift-mask/)
+ {
+ $widget->{container}->restorePrevious;
+ $widget->{container}->selectMany($widget->{idx});
+ }
+ else
+ {
+ $widget->{container}->select($widget->{idx});
+ }
+ $widget->{container}->setPreviousSelectedDisplayed($widget->{idx});
+
+ #$self->{parent}->display($widget->{idx}) unless $event->type eq '2button-press';
+ $widget->{container}->displayDetails(0, keys %{$widget->{container}->{selectedIndexes}});
+ }
+
+ $widget->{container}->displayDetails(1, $widget->{idx}) if $event->type eq '2button-press';
+ $widget->{container}->showPopupMenu($event->button, $event->time) if ($event->button eq 3);
+ $widget->grab_focus;
+ });
+
+ if ($self->{style}->{withAnimation})
+ {
+ $self->signal_handler_disconnect($self->{enterHandler})
+ if $self->{enterHandler};
+ $self->{enterHandler} = $self->signal_connect('enter_notify_event' => sub {
+ my ($widget, $event) = @_;
+ if (!$widget->{selected})
+ {
+ $widget->startZoomAnimation;
+ }
+ });
+
+ $self->signal_handler_disconnect($self->{leaveHandler})
+ if $self->{leaveHandler};
+ $self->{leaveHandler} = $self->signal_connect('leave_notify_event' => sub {
+ my ($widget, $event) = @_;
+ if (!$widget->{selected})
+ {
+ $widget->stopZoomAnimation;
+ $widget->restorePicture;
+ }
+ });
+ }
+
+
+ $self->signal_handler_disconnect($self->{keyHandler})
+ if $self->{keyHandler};
+
+ $self->{keyHandler} = $self->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $displayed = $self->{container}->convertIdxToDisplayed($widget->{idx});
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $widget->{container}->{parent}->deleteCurrentItem;
+ return 1;
+ }
+ if (($key eq 'Return') || ($key eq 'space'))
+ {
+ $widget->{container}->displayDetails(1, $widget->{idx});
+ return 1;
+ }
+ my $unicode = Gtk2::Gdk->keyval_to_unicode($event->keyval);
+ if ($unicode)
+ {
+ $self->{container}->showSearch(pack('U',$unicode));
+ }
+ else
+ {
+ my $columns = $widget->{container}->getColumnsNumber;
+
+ ($key eq 'Right') ? $displayed++ :
+ ($key eq 'Left') ? $displayed-- :
+ ($key eq 'Down') ? $displayed += $columns :
+ ($key eq 'Up') ? $displayed -= $columns :
+ ($key eq 'Page_Down') ? $displayed += ($widget->{style}->{pageCount} * $columns):
+ ($key eq 'Page_Up') ? $displayed -= ($widget->{style}->{pageCount} * $columns):
+ ($key eq 'Home') ? $displayed = 0 :
+ ($key eq 'End') ? $displayed = $widget->{container}->getNbItems - 1 :
+ return 1;
+
+ return 1 if ($displayed < 0) || ($displayed >= $widget->{container}->getNbItems);
+ my $column = $displayed % $columns;
+ my $valueIdx = $widget->{container}->convertDisplayedToIdx($displayed);
+# my $keepPrevious = 0;
+ my $state = $event->get_state;
+ if ($state =~ /control-mask/)
+ {
+ $widget->{container}->select($valueIdx, 0, 1);
+ $widget->{container}->unsetPreviousSelectedDisplayed;
+ }
+ elsif ($state =~ /shift-mask/)
+ {
+ $widget->{container}->setPreviousSelectedDisplayed($widget->{idx});
+ $widget->{container}->restorePrevious;
+ $widget->{container}->selectMany($valueIdx);
+ }
+ else
+ {
+ $widget->{container}->select($valueIdx);
+ $widget->{container}->unsetPreviousSelectedDisplayed;
+ }
+ $widget->{container}->displayDetails(0, $valueIdx);
+ $widget->{container}->grab_focus;
+ $widget->{container}->showCurrent unless (($key eq 'Left') && ($column != ($columns - 1)))
+ || (($key eq 'Right') && ($column != 0));
+ }
+ return 1;
+
+ });
+
+ }
+
+ sub highlight
+ {
+ my ($self, $keepPrevious) = @_;
+ return if $self->{selected};
+ $self->{selected} = 1;
+ if (! $self->{style}->{withImage})
+ {
+ $self->modify_bg('normal', $self->{style}->{activeBg});
+ }
+# $self->savePicture
+# unless $keepPrevious;
+
+ my $pixbuf = $self->createPixbuf($self->{info}, 0, 1.1);
+
+ $pixbuf->saturate_and_pixelate($pixbuf, 1.5, 0);
+ $pixbuf = $pixbuf->composite_color_simple ($pixbuf->get_width, $pixbuf->get_height, 'nearest',220, 128, $self->{style}->{activeBgValue}, $self->{style}->{activeBgValue});
+ $self->child->set_from_pixbuf($pixbuf);
+ }
+
+ sub unhighlight
+ {
+ my ($self) = @_;
+
+ $self->modify_bg('normal', $self->{style}->{inactiveBg})
+ if (! $self->{style}->{withImage});
+ $self->restorePicture;
+ $self->{selected} = 0;
+ }
+
+ sub createPixbuf
+ {
+ my ($self, $info, $cacheRefresh, $zoom) = @_;
+
+ my $displayedImage = $info->{picture};
+ my $pixbuf = undef;
+
+ my $borrower = $info->{borrower};
+ my $favourite = $info->{favourite};
+
+ # Item has a picture assigned
+ if ($cacheRefresh)
+ {
+ $self->{imageCache}->forceCacheUpdateForNextUse;
+ }
+
+ if ($zoom)
+ {
+ if (! exists $self->{zoomedPixbufCache}->{$zoom})
+ {
+ $self->{zoomedPixbufCache}->{$zoom} = $self->{imageCache}->getPixbuf($info, $zoom);
+ }
+ $pixbuf = $self->{zoomedPixbufCache}->{$zoom};
+ }
+ else
+ {
+ $pixbuf = $self->{imageCache}->getPixbuf($info, $zoom);
+ }
+
+ my $width;
+ my $height;
+ my $boxWidth = $self->{style}->{imgWidth};
+ my $boxHeight = $self->{style}->{imgHeight};
+
+ my $overlay;
+ my $imgWidth;
+ my $imgHeight;
+ my $targetOverlayHeight;
+ my $targetOverlayWidth;
+ my $pixbufTempHeight;
+ my $pixbufTempWidth;
+ my $alpha = 1;
+ if ($self->{style}->{useOverlays})
+ {
+ # Need to call this to get the overlay padding
+ ($imgWidth, $imgHeight, $overlay) = $self->{imageCache}->getDestinationImgSize($pixbuf->get_width,
+ $pixbuf->get_height);
+ }
+ $width = $pixbuf->get_width;
+ $height = $pixbuf->get_height;
+
+ # Do the composition
+
+ if ($self->{style}->{useOverlays})
+ {
+ if ($self->{style}->{withImage})
+ {
+ # Using background, so center accordingly
+ my $offsetX = (($self->{style}->{offsetX} / 2) * $self->{style}->{factor}) + (($boxWidth - ($width + $overlay->{paddingLeft} + $overlay->{paddingRight})) / 2);
+ my $offsetY = 15 * $self->{style}->{factor} + ($boxHeight - ($height + $overlay->{paddingTop} + $overlay->{paddingBottom}));
+
+ # Make an empty pixbuf to work within
+ my $tempPixbuf =Gtk2::Gdk::Pixbuf->new('rgb', 1, 8,
+ $self->{style}->{backgroundPixbuf}->get_width,
+ $self->{style}->{backgroundPixbuf}->get_height);
+ $tempPixbuf->fill(0x00000000);
+
+ # Place cover in pixbuf
+ $pixbuf->composite($tempPixbuf,
+ $offsetX + $overlay->{paddingLeft}, $offsetY + $overlay->{paddingTop},
+ $width , $height,
+ $offsetX + $overlay->{paddingLeft}, $offsetY + $overlay->{paddingTop},
+ 1, 1,
+ 'nearest', 255);
+ $pixbuf = $tempPixbuf;
+
+ # Composite overlay picture
+ $self->{style}->{overlayPixbuf}->composite($pixbuf,
+ $offsetX, $offsetY,
+ $width + $overlay->{paddingLeft} + $overlay->{paddingRight},
+ $height + $overlay->{paddingTop} + $overlay->{paddingBottom},
+ $offsetX, $offsetY,
+ ($width + $overlay->{paddingLeft} + $overlay->{paddingRight}) / $self->{style}->{overlayPixbuf}->get_width,
+ ($height + $overlay->{paddingTop} + $overlay->{paddingBottom}) / $self->{style}->{overlayPixbuf}->get_height,
+ 'nearest', 255);
+
+ # Overlay borrower image if required
+ if ($borrower && ($borrower ne 'none'))
+ {
+ # De-saturate borrowed items
+ $pixbuf->saturate_and_pixelate($pixbuf, .1, 0);
+ $self->{style}->{lendPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width - $offsetX,
+ $offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom} - $self->{style}->{lendPixbuf}->get_height,
+ $self->{style}->{lendPixbuf}->get_width, $self->{style}->{lendPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width - $offsetX,
+ $offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom} - $self->{style}->{lendPixbuf}->get_height,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Overlay favourite image if required
+ if ($favourite)
+ {
+ $self->{style}->{favPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width - $offsetX,
+ $offsetY,
+ $self->{style}->{favPixbuf}->get_width, $self->{style}->{favPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width - $offsetX,
+ $offsetY,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Create and apply reflection if required
+ if ($self->{style}->{withReflect})
+ {
+ my $reflect;
+ $reflect = $pixbuf->flip(0);
+ $reflect->composite(
+ $pixbuf,
+ 0, 2 * ($offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom}) - $pixbuf->get_height,
+ $pixbuf->get_width,
+ 2 * ($pixbuf->get_height - $height - $offsetY - $overlay->{paddingTop} - $overlay->{paddingBottom}) - (10 * $self->{style}->{factor}),
+ 0, 2 * ($offsetY + $height + $overlay->{paddingTop} + $overlay->{paddingBottom}) - $pixbuf->get_height,
+ 1, 1,
+ 'nearest', 100
+ );
+
+ # Apply foreground fading
+ $self->{style}->{foregroundPixbuf}->composite(
+ $pixbuf,
+ 0, 0,
+ $pixbuf->get_width, $pixbuf->get_height,
+ 0, 0,
+ 1, 1,
+ 'nearest', 255
+ );
+ }
+
+ # Heft created pixbuf onto background
+ my $bgPixbuf = $self->{style}->{backgroundPixbuf}->copy;
+ $pixbuf->composite($bgPixbuf,
+ 0,0,
+ $pixbuf->get_width , $pixbuf->get_height,
+ 0,0,
+ 1, 1,
+ 'nearest', 255);
+ $pixbuf = $bgPixbuf;
+
+ }
+ else
+ {
+ # Not using background, so we need to make an empty pixbuf which is right size for overlay first
+ my $tempPixbuf =Gtk2::Gdk::Pixbuf->new('rgb', 1, 8,
+ $width + $overlay->{paddingLeft} + $overlay->{paddingRight},
+ $height + $overlay->{paddingTop} + $overlay->{paddingBottom});
+ $tempPixbuf->fill(0x00000000);
+
+ # Now, place list image inside empty pixbuf
+ $pixbuf->composite($tempPixbuf,
+ $overlay->{paddingLeft}, $overlay->{paddingTop},
+ $width , $height,
+ $overlay->{paddingLeft}, $overlay->{paddingTop},
+ 1, 1,
+ 'nearest', 255 * $alpha);
+ $pixbuf = $tempPixbuf;
+
+ # Place overlay on top of pixbuf
+ $self->{style}->{overlayPixbuf}->composite($pixbuf,
+ 0, 0,
+ $width + $overlay->{paddingLeft} + $overlay->{paddingRight},
+ $height + $overlay->{paddingTop} + $overlay->{paddingBottom},
+ 0, 0,
+ ($width + $overlay->{paddingLeft} + $overlay->{paddingRight}) / $self->{style}->{overlayPixbuf}->get_width,
+ ($height + $overlay->{paddingTop} + $overlay->{paddingBottom}) / $self->{style}->{overlayPixbuf}->get_height,
+ 'nearest', 255 * $alpha);
+
+ # Overlay borrower image if required
+ if ($borrower && ($borrower ne 'none'))
+ {
+ # De-saturate borrowed items
+ $pixbuf->saturate_and_pixelate($pixbuf, .1, 0);
+
+ $self->{style}->{lendPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width,
+ $pixbuf->get_height - $self->{style}->{lendPixbuf}->get_height,
+ $self->{style}->{lendPixbuf}->get_width, $self->{style}->{lendPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{lendPixbuf}->get_width,
+ $pixbuf->get_height - $self->{style}->{lendPixbuf}->get_height,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Overlay favourite image if required
+ if ($favourite)
+ {
+ $self->{style}->{favPixbuf}->composite($pixbuf,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width,
+ 0,
+ $self->{style}->{favPixbuf}->get_width, $self->{style}->{favPixbuf}->get_height,
+ $pixbuf->get_width - $self->{style}->{favPixbuf}->get_width,
+ 0,
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ }
+ }
+ else
+ {
+ # No overlays, nice and simple
+
+ # Overlay borrower image if required
+ if ($borrower && ($borrower ne 'none'))
+ {
+ # De-saturate borrowed items
+ $pixbuf->saturate_and_pixelate($pixbuf, .1, 0);
+ $self->{style}->{lendPixbuf}->composite($pixbuf,
+ $width - $self->{style}->{lendPixbuf}->get_width - $self->{style}->{factor},
+ $height - $self->{style}->{lendPixbuf}->get_height - $self->{style}->{factor},
+ $self->{style}->{lendPixbuf}->get_width, $self->{style}->{lendPixbuf}->get_height,
+ $width - $self->{style}->{lendPixbuf}->get_width - $self->{style}->{factor},
+ $height - $self->{style}->{lendPixbuf}->get_height - $self->{style}->{factor},
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ # Overlay favourite image if required
+ if ($favourite)
+ {
+ $self->{style}->{favPixbuf}->composite($pixbuf,
+ $width - $self->{style}->{favPixbuf}->get_width - $self->{style}->{factor},
+ $self->{style}->{factor},
+ $self->{style}->{favPixbuf}->get_width, $self->{style}->{favPixbuf}->get_height,
+ $width - $self->{style}->{favPixbuf}->get_width - $self->{style}->{factor},
+ $self->{style}->{factor},
+ 1, 1,
+ 'nearest', 255);
+ }
+
+ my $reflect;
+ $reflect = $pixbuf->flip(0)
+ if $self->{style}->{withReflect};
+
+ my $offsetX = (($self->{style}->{offsetX} / 2) * $self->{style}->{factor}) + (($boxWidth - $width) / 2);
+ my $offsetY = 15 * $self->{style}->{factor} + ($boxHeight - $height);
+ if ($self->{style}->{withImage})
+ {
+ my $bgPixbuf = $self->{style}->{backgroundPixbuf}->copy;
+ $pixbuf->composite($bgPixbuf,
+ $offsetX, $offsetY,
+ $width, $height,
+ $offsetX, $offsetY,
+ 1, 1,
+ 'nearest', 255);
+ $pixbuf = $bgPixbuf;
+ }
+
+ if ($self->{style}->{withReflect})
+ {
+ $reflect->composite(
+ $pixbuf,
+ $offsetX, $height + $offsetY,
+ $width, $pixbuf->get_height - $height - $offsetY - (10 * $self->{style}->{factor}),
+ $offsetX, $height + $offsetY,
+ 1, 1,
+ 'nearest', 100
+ );
+
+ # Apply foreground fading
+ $self->{style}->{foregroundPixbuf}->composite(
+ $pixbuf,
+ 0, 0,
+ $pixbuf->get_width, $pixbuf->get_height,
+ 0, 0,
+ 1, 1,
+ 'nearest', 255
+ );
+ }
+ }
+ return $pixbuf;
+ }
+
+
+
+}
+
+{
+ package GCImageCache;
+
+ use File::Path;
+ use File::Copy;
+ use List::Util qw/min/;
+
+ sub new
+ {
+ my ($proto, $imagesDir, $imageSize, $style, $defaultImage) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ imagesDir => $imagesDir,
+ imageSize => $imageSize,
+ style => $style,
+ cacheDir => $imagesDir.'/.cache/',
+ oldCacheDir => $imagesDir,
+ defaultImage => $defaultImage,
+ forceUpdate => 0,
+ };
+ # Make sure destination directory exists
+ if ( ! -d $self->{cacheDir})
+ {
+ mkpath $self->{cacheDir};
+ }
+ bless ($self, $class);
+
+ $self->clearOldCache;
+
+ return $self;
+ }
+
+ # This method removes images cached by previous versions
+ sub clearOldCache
+ {
+ my $self = shift;
+ my $trashDir = $self->{imagesDir}.'.trash';
+ mkpath $trashDir;
+ foreach (glob $self->{oldCacheDir}.'/*')
+ {
+ if (/\.cache\.[0-4](\.|$)/)
+ {
+ move $_, $trashDir;
+ }
+ }
+ }
+
+ sub forceCacheUpdateForNextUse
+ {
+ my ($self) = @_;
+ $self->{forceUpdate} = 1;
+ }
+
+ sub getPixbuf
+ {
+ my ($self, $info, $zoom) = @_;
+ my $fileName;
+ my $pixbuf = undef;
+ if (!$zoom)
+ {
+ $fileName = $self->getCachedFileName($info);
+ if ($self->{forceUpdate} || (! -e $fileName))
+ {
+ $self->createImageCache($info);
+ }
+ $self->{forceUpdate} = 0;
+ eval {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($fileName);
+ };
+ }
+ else
+ {
+ # When a zoom is requested, we have to generate the picture
+ $fileName = $self->getCachedFileName($info);
+ # Get picture size from cached file to avoid re-computing everything
+ my ($picFormat, $picWidth, $picHeight) = Gtk2::Gdk::Pixbuf->get_file_info($fileName);
+ # Then open the original file
+ my $origFileName = $info->{picture};
+ if (! -f $origFileName)
+ {
+ $origFileName = $self->{defaultImage};
+ }
+ if (!$self->{style}->{useOverlays})
+ {
+ $zoom -= 0.01;
+ }
+
+ eval {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($origFileName);
+ my $newWidth = int($picWidth * $zoom);
+ my $newHeight = int($picHeight * $zoom);
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf, $newWidth, $newHeight, 1, 0);
+ };
+ }
+
+ return $pixbuf;
+ }
+
+ sub getCachedFileName
+ {
+ my ($self, $info, $size) = @_;
+
+ my $gcsautoid = $info->{autoid};
+ my $title = $info->{title};
+
+ $title =~ s/[^a-zA-Z0-9]*//g;
+ my $cacheFilename = $self->{cacheDir};
+ if ($info->{picture})
+ {
+ $cacheFilename .= $gcsautoid
+ ."."
+ .$title;
+ }
+ else
+ {
+ $cacheFilename .= 'GCSDefaultImage';
+ }
+ $cacheFilename .= (defined $size ? $size : $self->{imageSize});
+ $cacheFilename .= ".overlay"
+ if $self->{style}->{useOverlays};
+
+ return $cacheFilename;
+ }
+
+ # Resizes artwork to required sizes and saves copies of the images, for fast loading
+ sub createImageCache
+ {
+ my ($self, $info) = @_;
+
+ my $srcImage = $info->{picture};
+ if (! -f $srcImage)
+ {
+ $srcImage = $self->{defaultImage};
+ $info->{picture} = "";
+ }
+
+ # Load in the original source image
+ my $origPixbuf = Gtk2::Gdk::Pixbuf->new_from_file($srcImage);
+
+ my $gcsautoid = $info->{autoid};
+ my $title = $info->{title};
+ $title =~ s/[^a-zA-Z0-9]*//g;
+ # Get original picture format
+ my ($picFormat, $picWidth, $picHeight) = Gtk2::Gdk::Pixbuf->get_file_info($srcImage);
+
+ # Loop through possible sizes
+ for (my $size = 0; $size < 5; $size++) {
+ my $imgWidth;
+ my $imgHeight;
+ my $overlay;
+
+ my $cacheFilename = $self->getCachedFileName($info, $size);
+
+ # Get size for cached image
+ ($imgWidth, $imgHeight, $overlay) = $self->getDestinationImgSize($picWidth,
+ $picHeight,
+ $size);
+
+ # Scale pixbuf and save
+ my $scaledPixbuf = GCUtils::scaleMaxPixbuf($origPixbuf, $imgWidth, $imgHeight, 0, 0);
+ if ($picFormat->{name} eq 'jpeg')
+ {
+ $scaledPixbuf->save ($cacheFilename, 'jpeg', quality => '99');
+ }
+ else
+ {
+ $scaledPixbuf->save ($cacheFilename, 'png');
+ }
+ }
+ }
+
+ # Calculates height and width of list image
+ sub getDestinationImgSize
+ {
+ my ($self, $origWidth, $origHeight, $size) = @_;
+
+ $size = $self->{imageSize}
+ if (!defined $size);
+
+ my $imgWidth;
+ my $imgHeight;
+ my $overlay;
+
+ # No overlays
+ $imgWidth = $self->{style}->{imgWidth} / $self->{style}->{factor};
+ $imgHeight = $self->{style}->{imgHeight} / $self->{style}->{factor};
+
+ if ($self->{style}->{useOverlays})
+ {
+ # Overlays
+
+ # Calculate size of list image with proportional size of overlay padding added
+ my $pixbufTempHeight = (($self->{style}->{overlayPaddingTop} + $self->{style}->{overlayPaddingBottom})/$self->{style}->{overlayPixbuf}->get_height + 1) * $origHeight;
+ my $pixbufTempWidth = (($self->{style}->{overlayPaddingLeft} + $self->{style}->{overlayPaddingRight})/$self->{style}->{overlayPixbuf}->get_width + 1) * $origWidth;
+
+ # Find out target size of overlay, keeping the same ratio as the size calculated above (ie, list image + relative padding)
+ my $ratio = $pixbufTempHeight / $pixbufTempWidth;
+ my $targetOverlayHeight;
+ my $targetOverlayWidth;
+ if (($pixbufTempWidth > $imgWidth) || ($pixbufTempHeight > $imgHeight))
+ {
+ if (($pixbufTempWidth * $imgHeight/$pixbufTempHeight) < $imgHeight )
+ {
+ $targetOverlayHeight = $imgHeight;
+ $targetOverlayWidth = int($imgHeight / $ratio);
+ }
+ else
+ {
+ $targetOverlayHeight = int( $imgWidth * $ratio);
+ $targetOverlayWidth = $imgWidth;
+ }
+ }
+ else
+ {
+ # Special case when image is small enough and doesn't need to be resized
+ $targetOverlayHeight = $pixbufTempHeight;
+ $targetOverlayWidth = $pixbufTempWidth;
+ }
+
+ # Calculate final offset amounts for target size of overlay
+ $overlay->{paddingLeft} = int($self->{style}->{overlayPaddingLeft} * $targetOverlayWidth / $self->{style}->{overlayPixbuf}->get_width);
+ $overlay->{paddingRight} = int($self->{style}->{overlayPaddingRight} * $targetOverlayWidth / $self->{style}->{overlayPixbuf}->get_width);
+ $overlay->{paddingTop} = int($self->{style}->{overlayPaddingTop} * $targetOverlayHeight / $self->{style}->{overlayPixbuf}->get_height);
+ $overlay->{paddingBottom} = int($self->{style}->{overlayPaddingBottom} * $targetOverlayHeight / $self->{style}->{overlayPixbuf}->get_height);
+
+ $imgWidth = $imgWidth - $overlay->{paddingLeft} - $overlay->{paddingRight};
+ $imgHeight = $imgHeight - $overlay->{paddingTop} - $overlay->{paddingBottom};
+ }
+
+ my $factor = ($size == 0) ? 0.5
+ : ($size == 1) ? 0.8
+ : ($size == 3) ? 1.5
+ : ($size == 4) ? 2
+ : 1;
+ $imgWidth *= $factor;
+ $imgHeight *= $factor;
+
+ return ($imgWidth, $imgHeight, $overlay);
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCImageLists.pm b/lib/gcstar/GCItemsLists/GCImageLists.pm
new file mode 100644
index 0000000..2250bcb
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCImageLists.pm
@@ -0,0 +1,2028 @@
+package GCImageLists;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use locale;
+
+# Number of ms to wait before enhancing the next picture
+my $timeOutBetweenEnhancements = 50;
+
+{
+ package GCBaseImageList;
+
+ use File::Basename;
+ use GCItemsLists::GCImageListComponents;
+ use GCUtils;
+ use GCStyle;
+ use base "Gtk2::VBox";
+ use File::Temp qw/ tempfile /;
+
+ sub new
+ {
+ my ($proto, $container, $columns) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+ bless ($self, $class);
+
+ my $parent = $container->{parent};
+
+ $self->{preferences} = $parent->{model}->{preferences};
+ $self->{imagesDir} = $parent->getImagesDir();
+ $self->{coverField} = $parent->{model}->{commonFields}->{cover};
+ $self->{titleField} = $parent->{model}->{commonFields}->{title};
+ $self->{idField} = $parent->{model}->{commonFields}->{id};
+ $self->{borrowerField} = $parent->{model}->{commonFields}->{borrower}->{name};
+ # Sort field
+ $self->{sortField} = $self->{preferences}->secondarySort
+ || $self->{titleField};
+ $self->{fileIdx} = "";
+ $self->{selectedIndexes} = {};
+ $self->{previousSelectedDisplayed} = 0;
+ $self->{displayedToItemsArray} = {};
+ $self->{container} = $container;
+ $self->{scroll} = $container->{scroll};
+ $self->{searchEntry} = $container->{searchEntry};
+
+
+ $self->{preferences}->sortOrder(1)
+ if ! $self->{preferences}->exists('sortOrder');
+
+ $self->{parent} = $container->{parent};
+
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->{columns} = $columns;
+ $self->{dynamicSize} = ($columns == 0);
+ $self->clearCache;
+
+
+ $self->set_border_width(0);
+
+ $self->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ if ($event->button eq 3)
+ {
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $event->button, $event->time)
+ }
+ });
+
+ $self->can_focus(1);
+
+ $self->{imageCache} = new GCImageCache($self->{imagesDir},
+ $self->{preferences}->listImgSize,
+ $container->{style},
+ $self->{parent}->{defaultImage});
+
+ return $self;
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ return $self->{displayedToIdx}->{$self->{current}};
+ }
+
+ sub getCurrentItems
+ {
+ my $self = shift;
+ my @indexes = keys %{$self->{selectedIndexes}};
+ return \@indexes;
+ }
+
+ sub isSelected
+ {
+ my ($self, $idx) = @_;
+ foreach (keys %{$self->{selectedIndexes}})
+ {
+ return 1 if $_ == $idx;
+ }
+ return 0;
+ }
+
+ sub DESTROY
+ {
+ my $self = shift;
+
+ #unlink $self->{style}->{tmpBgPixmap};
+ $self->SUPER::DESTROY;
+ }
+
+ sub isUsingDate
+ {
+ my ($self) = @_;
+ return 0;
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order) = @_;
+ $order = 0 if !defined $order;
+ $self->{currentOrder} = ($order == -1) ? (1 - $self->{currentOrder})
+ : $self->{preferences}->sortOrder;
+
+ if ($self->{itemsArray})
+ {
+ if ($order == -1)
+ {
+ @{$self->{itemsArray}} = reverse @{$self->{itemsArray}};
+ }
+ else
+ {
+ sub compare
+ {
+ return (
+ GCUtils::gccmpe($a->{sortValue}, $b->{sortValue})
+ );
+ }
+ if ($self->{currentOrder} == 1)
+ {
+ @{$self->{itemsArray}} = sort compare @{$self->{itemsArray}};
+ }
+ else
+ {
+ @{$self->{itemsArray}} = reverse sort compare @{$self->{itemsArray}};
+ }
+ }
+ }
+ $self->refresh if ! $self->{initializing};
+ $self->{initializing} = 0;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ $self->{displayedNumber} = 0;
+ $self->{filter} = $filter;
+ $self->{displayedToItemsArray} = {};
+ my $current = $self->{current};
+ $self->restorePrevious;
+ my $i = 0;
+ foreach (@{$self->{itemsArray}})
+ {
+ $_->{displayed} = $filter->test($items->[$_->{idx}]);
+ if ($_->{displayed})
+ {
+ $self->{displayedToItemsArray}->{$self->{displayedNumber}} = $i;
+ $self->{displayedNumber}++;
+ }
+ $self->{container}->setDisplayed($_->{idx}, $_->{displayed});
+ $i++;
+ }
+ my $newIdx = $self->getFirstVisibleIdx($current);
+ my $conversionNeeded = 0;
+ $conversionNeeded = 1 if ! exists $self->{boxes}->[$current];
+
+ if ($refresh)
+ {
+ $self->refresh(1, $splash);
+ $self->show_all;
+ }
+
+ $self->{initializing} = 0;
+ return $self->displayedToItemsArrayIdx($newIdx)
+ if $conversionNeeded;
+ return $newIdx;
+ }
+
+ sub getFirstVisibleIdx
+ {
+ my ($self, $displayed) = @_;
+ return $displayed if ! exists $self->{boxes}->[$displayed];
+ my $currentIdx = $self->{boxes}->[$displayed]->{info}->{idx};
+ my $info = $self->{boxes}->[$displayed]->{info};
+
+ return $currentIdx if (! exists $self->{boxes}->[$displayed])
+ || ($self->{boxes}->[$displayed]->{info}->{displayed});
+ my $previous = -1;
+ my $after = 0;
+ foreach my $item(@{$self->{itemsArray}})
+ {
+ $after = 1 if $item->{idx} == $currentIdx;
+ if ($after)
+ {
+ return $item->{idx} if $item->{displayed};
+ }
+ else
+ {
+ $previous = $item->{idx} if $item->{displayed};
+ }
+ }
+ return $previous;
+ }
+
+ sub refresh
+ {
+ my ($self, $forceClear, $splash) = @_;
+ return if $self->{columns} == 0;
+
+ # Store current item index
+ my $currentIdx = $self->{displayedToIdx}->{$self->{current}};
+ $self->{boxes} = [];
+ $self->{displayedToIdx} = {};
+ $self->{idxToDisplayed} = {};
+
+ $self->clearView if (! $self->{initializing}) || $forceClear;
+ $self->{number} = 0;
+ my $idx = 0;
+ $self->{collectionDir} = dirname($self->{parent}->{options}->file);
+ foreach (@{$self->{itemsArray}})
+ {
+ $splash->setProgressForItemsSort($idx++) if $splash;
+ next if ! $_->{displayed};
+ $self->addDisplayedItem($_);
+ }
+ delete $self->{collectionDir};
+ # Determine new current displayed
+ $self->{current} = $self->{idxToDisplayed}->{$currentIdx};
+ if ($self->{toBeSelectedLater})
+ {
+ $self->{parent}->display($self->select(-1));
+ $self->{toBeSelectedLater} = 0;
+ }
+ #$self->show_all;
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+ return $self->{displayedNumber};
+ }
+
+ sub clearCache
+ {
+ my $self = shift;
+
+ if ($self->{cache})
+ {
+ foreach (@{$self->{cache}})
+ {
+ $_->{imageBox}->destroy
+ if $_->{imageBox};
+ }
+ }
+ $self->{cache} = [];
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ #Restore current picture if modified
+ $self->restorePrevious;
+
+ $self->{itemsArray} = [];
+ $self->{boxes} = [];
+ $self->{number} = 0;
+ $self->{count} = 0;
+ $self->{displayedNumber} = 0;
+ $self->{current} = 0;
+ $self->{previous} = 0;
+ $self->clearView;
+ }
+
+ sub clearView
+ {
+ my $self = shift;
+
+ # TODO : This will be different with many lists
+ #my $parent = $self->parent;
+ #$self->parent->remove($self)
+ # if $parent;
+
+ my @children = $self->get_children;
+ foreach (@children)
+ {
+ my @children2 = $_->get_children;
+ foreach my $child(@children2)
+ {
+ $_->remove($child);
+ }
+ $self->remove($_);
+ $_->destroy;
+ }
+ $self->{rowContainers} = [];
+ $self->{enhanceInformation} = [];
+
+ # TODO : This will be different with many lists
+ #$self->{scroll}->add_with_viewport($self)
+ # if $parent;
+
+ $self->{initializing} = 1;
+ }
+
+ sub done
+ {
+ my ($self, $splash, $refresh) = @_;
+ if ($refresh)
+ {
+ $self->refresh(0, $splash);
+ }
+ $self->{initializing} = 0;
+ }
+
+ sub setColumnsNumber
+ {
+ my ($self, $columns, $refresh) = @_;
+ $self->{columns} = $columns;
+ my $init = $self->{initializing};
+ $self->{initializing} = 1;
+ $self->refresh($refresh) if $refresh;
+ $self->show_all;
+ $self->{initializing} = $init;
+ }
+
+ sub getColumnsNumber
+ {
+ my $self = shift;
+ return $self->{columns};
+ }
+
+ sub createImageBox
+ {
+ my ($self, $info) = @_;
+
+ my $imageBox = new GCImageListItem($self, $info);
+ return $imageBox;
+ }
+
+ sub getFromCache
+ {
+ my ($self, $info) = @_;
+ if (! $self->{cache}->[$info->{idx}])
+ {
+ my $item = {};
+ $item->{imageBox} = $self->createImageBox($info);
+ $self->{cache}->[$info->{idx}] = $item;
+ }
+ return $self->{cache}->[$info->{idx}];
+ }
+
+ sub findPlace
+ {
+ my ($self, $item, $sortvalue) = @_;
+ my $refSortValue = $sortvalue || $item->{sortValue};
+ $refSortValue = uc($refSortValue);
+
+ # First search where it should be inserted
+ my $place = 0;
+ my $itemsIdx = 0;
+ if ($self->{currentOrder} == 1)
+ {
+ foreach my $followingItem(@{$self->{itemsArray}})
+ {
+ my $testSortValue = uc($followingItem->{sortValue});
+ my $cmp = GCUtils::gccmpe($testSortValue, $refSortValue);
+ $itemsIdx++ if ! ($cmp > 0);
+
+ next if !$followingItem->{displayed};
+ last if ($cmp > 0);
+ $place++;
+ }
+ }
+ else
+ {
+ foreach my $followingItem(@{$self->{itemsArray}})
+ {
+ my $testSortValue = uc($followingItem->{sortValue});
+ my $cmp = GCUtils::gccmpe($refSortValue, $testSortValue);
+ $itemsIdx++ if ! ($cmp > 0);
+ next if !$followingItem->{displayed};
+ last if ($cmp > 0);
+ $place++;
+ }
+ }
+ return ($place, $itemsIdx) if wantarray;
+ return $place;
+ }
+
+ sub createItemInfo
+ {
+ my ($self, $idx, $info) = @_;
+ my $displayedImage = GCUtils::getDisplayedImage($info->{$self->{coverField}},
+ undef,
+ $self->{parent}->{options}->file,
+ $self->{collectionDir});
+ my $item = {
+ idx => $idx,
+ title => $self->{parent}->transformTitle($info->{$self->{titleField}}),
+ picture => $displayedImage,
+ borrower => $info->{$self->{borrowerField}},
+ sortValue => $self->{sortField} eq $self->{titleField}
+ ? $self->{parent}->transformTitle($info->{$self->{titleField}})
+ : $info->{$self->{sortField}},
+ favourite => $info->{favourite},
+ displayed => 1,
+ autoid => $info->{$self->{idField}}
+ };
+ return $item;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate, $idx, $keepConversionTables) = @_;
+
+ my $item = $self->createItemInfo($idx, $info);
+
+ if ($immediate)
+ {
+ # When the flag is set, that means we modified an item and that it had
+ # to be added to that group. In this case, we don't want to de-select
+ # the current one.
+ if (!$keepConversionTables)
+ {
+ $self->restorePrevious;
+ # To force the selection
+ $self->{current} = -1;
+ }
+ # First search where it should be inserted
+ my ($place, $itemsArrayIdx) = $self->findPlace($item);
+ # Prepare the conversions displayed <-> index
+ if (!$keepConversionTables)
+ {
+ $self->{displayedToIdx}->{$place} = $idx;
+ $self->{idxToDisplayed}->{$idx} = $place;
+ }
+ # Then we insert it at correct position
+ $self->addDisplayedItem($item, $place);
+ splice @{$self->{itemsArray}}, $itemsArrayIdx, 0, $item;
+ }
+ else
+ {
+ # Here we know it will be sorted after
+ push @{$self->{itemsArray}}, $item;
+ }
+
+ $self->{count}++;
+ $self->{displayedNumber}++;
+ $self->{header}->show_all if $self->{header} && $self->{displayedNumber} > 0;
+ }
+
+ # Params:
+ # $info: Information already formated for this class
+ # $place: Optional value to indicate where it should be inserted
+ sub addDisplayedItem
+ {
+ # info is an iternal info generated
+ my ($self, $info, $place) = @_;
+ return if ! $self->{columns};
+ my $item = $self->getFromCache($info);
+ my $imageBox = $item->{imageBox};
+ my $i = $info->{idx};
+ if (!defined $place)
+ {
+ $self->{displayedToIdx}->{$self->{number}} = $i;
+ $self->{idxToDisplayed}->{$i} = $self->{number};
+ }
+ $imageBox->prepareHandlers($i, $info);
+
+ if (($self->{number} % $self->{columns}) == 0)
+ {
+ #New row begin
+ $self->{currentRow} = new Gtk2::HBox(0,0);
+ push @{$self->{rowContainers}}, $self->{currentRow};
+ $self->pack_start($self->{currentRow},0,0,0);
+ $self->{currentRow}->show_all if ! $self->{initializing};
+ }
+
+ if (defined($place))
+ {
+ # Get the row and col where it should be inserted
+ my $itemLine = int $place / $self->{columns};
+ my $itemCol = $place % $self->{columns};
+ # Insert it at correct place
+ $self->{rowContainers}->[$itemLine]->pack_start($imageBox,0,0,0);
+ $self->{rowContainers}->[$itemLine]->reorder_child($imageBox, $itemCol);
+ $imageBox->show_all;
+ $self->shiftItems($place, 1, 0, scalar @{$self->{boxes}});
+ splice @{$self->{boxes}}, $place, 0, $imageBox;
+ $self->initConversionTables;
+ }
+ else
+ {
+ $self->{currentRow}->pack_start($imageBox,0,0,0);
+ $self->{idxToDisplayed}->{$i} = $self->{number};
+ push @{$self->{boxes}}, $imageBox;
+ }
+
+ $self->{number}++;
+ }
+
+ sub grab_focus
+ {
+ my $self = shift;
+ $self->SUPER::grab_focus;
+ $self->{boxes}->[$self->{current}]->grab_focus;
+ }
+
+ sub displayedToItemsArrayIdx
+ {
+ my ($self, $displayed) = @_;
+ return 0 if ! exists $self->{boxes}->[$displayed];
+ # If we have nothing, that means we have no filter. So displayed and idx are the same
+ return $displayed if ! exists $self->{displayedToItemsArray}->{$displayed};
+ return $self->{displayedToItemsArray}->{$displayed};
+ }
+
+ sub shiftItems
+ {
+ my ($self, $place, $direction, $justFromView, $maxPlace) = @_;
+ my $idx = $self->{displayedToIdx}->{$place};
+ my $itemLine = int $place / $self->{columns};
+ my $itemCol = $place % $self->{columns};
+ # Did we already remove or add the item ?
+ my $alreadyChanged = ($direction < 0) || (defined $maxPlace);
+ # Useful to always have the same comparison a few lines below
+ # Should be >= for $direction == 1
+ # This difference is because we didn't added it yet while it has
+ # already been removed in the other direction
+ #$itemCol-- if ! (defined $maxPlace);
+ $itemCol++ if ($direction < 0);
+ # Same here
+ $idx-- if $alreadyChanged;
+ my $newDisplayed = 0;
+ my $currentLine = 0;
+ my $currentCol;
+ my $shifting = 0;
+ # Limit indicates which value for column should make use take action
+ # For backward, it's the 1st one. For forward, the last one
+ my $limit = 0;
+ $limit = ($self->{columns} - 1) if $direction > 0;
+ foreach my $item(@{$self->{itemsArray}})
+ {
+ if (!$item->{displayed})
+ {
+ $item->{idx} += $direction if ((!defined $maxPlace) && ($item->{idx} > $idx));
+ next;
+ }
+ $currentLine = int $newDisplayed / $self->{columns};
+ $currentCol = $newDisplayed % $self->{columns};
+ $shifting = $direction if (!$shifting)
+ && (
+ ($currentLine > $itemLine)
+ || (($currentLine == $itemLine)
+ && ($currentCol >= $itemCol))
+ );
+ $shifting = 0 if (defined $maxPlace) && ($newDisplayed > $maxPlace);
+ # When using maxPlace, we are only moving in view
+ if ((!defined $maxPlace) && ($item->{idx} > $idx))
+ {
+ $item->{idx} += $direction;
+ $self->{cache}->[$item->{idx}]->{imageBox}->{idx} = $item->{idx}
+ if ($item->{idx} > 0) && $self->{cache}->[$item->{idx}];
+ }
+ if ($shifting)
+ {
+ # Is this the first/last one in the line?
+ if ($currentCol == $limit)
+ {
+ $self->{rowContainers}->[$currentLine]->remove(
+ $self->{cache}->[$item->{idx}]->{imageBox}
+ );
+ $self->{rowContainers}->[$currentLine + $direction]->pack_start(
+ $self->{cache}->[$item->{idx}]->{imageBox},
+ 0,0,0
+ );
+ # We can't directly insert on the beginning.
+ # So we need a little adjustement here
+ if ($direction > 0)
+ {
+ $self->{rowContainers}->[$currentLine + $direction]->reorder_child(
+ $self->{cache}->[$item->{idx}]->{imageBox},
+ 0
+ );
+ }
+ }
+ }
+ $newDisplayed++;
+ }
+ }
+
+ sub shiftIndexes
+ {
+ my ($self, $indexes) = @_;
+ my $nbIndexes = scalar @$indexes;
+ my $nbLower;
+ my $currentIdx;
+ my @cache;
+ foreach my $box(@{$self->{boxes}})
+ {
+ # Find how many are lowers in our indexes
+ # We suppose they are sorted
+ $nbLower = 0;
+ $currentIdx = $box->{info}->{idx};
+ foreach (@$indexes)
+ {
+ last if $_ > $currentIdx;
+ $nbLower++;
+ }
+ $box->{info}->{idx} -= $nbLower;
+ $cache[$box->{info}->{idx}] = $self->{cache}->[$box->{info}->{idx} + $nbLower];
+ }
+ $self->{cache} = \@cache;
+ }
+
+ sub initConversionTables
+ {
+ my $self = shift;
+ my $displayed = 0;
+ $self->{displayedToIdx} = {};
+ $self->{idxToDisplayed} = {};
+ foreach (@{$self->{boxes}})
+ {
+ $self->{displayedToIdx}->{$displayed} = $_->{info}->{idx};
+ $self->{idxToDisplayed}->{$_->{info}->{idx}} = $displayed;
+ $_->{idx} = $_->{info}->{idx};
+ $displayed++;
+ }
+ }
+
+ sub convertIdxToDisplayed
+ {
+ my ($self, $idx) = @_;
+ return $self->{idxToDisplayed}->{$idx};
+ }
+
+ sub convertDisplayedToIdx
+ {
+ my ($self, $displayed) = @_;
+ return $self->{displayedToIdx}->{$displayed};
+ }
+
+ sub removeItem
+ {
+ my ($self, $idx, $justFromView) = @_;
+ $self->{count}--;
+ $self->{displayedNumber}--;
+ # Fix to remove header only when items are grouped
+ $self->{header}->hide if $self->{container}->{groupItems} && $self->{displayedNumber} <= 0;
+ my $displayed = $self->{idxToDisplayed}->{$idx};
+ my $itemLine = int $displayed / $self->{columns};
+ #my $itemCol = $displayed % $self->{columns};
+ $self->{rowContainers}->[$itemLine]->remove(
+ $self->{cache}->[$idx]->{imageBox}
+ );
+
+ # Remove event box from cache
+ my $itemsArrayIdx = $self->displayedToItemsArrayIdx($displayed);
+
+ $self->{cache}->[$idx]->{imageBox}->destroy;
+ $self->{cache}->[$idx]->{imageBox} = 0;
+
+ splice @{$self->{cache}}, $idx, 1 if !$justFromView;
+ splice @{$self->{boxes}}, $self->{idxToDisplayed}->{$idx}, 1;
+
+ if ($justFromView)
+ {
+ $self->shiftItems($displayed, -1, 0, scalar @{$self->{boxes}});
+ }
+ else
+ {
+ $self->shiftItems($displayed, -1);
+ }
+ $self->initConversionTables;
+
+ splice @{$self->{itemsArray}}, $itemsArrayIdx, 1;
+ my $next = $self->{displayedToIdx}->{$displayed};
+ if ($displayed >= (scalar(@{$self->{boxes}})))
+ {
+ $next = $self->{displayedToIdx}->{--$displayed}
+ }
+ $self->{current} = $displayed;
+
+ my $last = scalar @{$self->{itemsArray}};
+ delete $self->{displayedToIdx}->{$last};
+ # To be sure we still have consistent data, we re-initialize the other hash by swapping keys and values.
+ $self->{idxToDisplayed} = {};
+ my ($k,$v);
+ $self->{idxToDisplayed}->{$v} = $k while (($k,$v) = each %{$self->{displayedToIdx}});
+
+ # Fix to remove items from "displayed" list on delete
+ my $numDisplayed = scalar(keys %{$self->{container}->{displayed}});
+ delete $self->{container}->{displayed}->{$numDisplayed-1};
+
+ $self->{number}--;
+ return $next;
+ }
+
+ sub removeCurrentItems
+ {
+ my ($self) = @_;
+ my @indexes = sort {$a <=> $b} keys %{$self->{selectedIndexes}};
+ my $nbRemoved = 0;
+ $self->restorePrevious;
+ my $next;
+ foreach my $idx(@indexes)
+ {
+ $next = $self->removeItem($idx - $nbRemoved);
+ $nbRemoved++;
+ }
+ $self->{selectedIndexes} = {};
+ $self->select($next, 1);
+
+ return $next;
+ }
+
+ sub restoreItem
+ {
+ my ($self, $idx) = @_;
+
+ my $previous = $self->{idxToDisplayed}->{$idx};
+ next if ($previous == -1) || (!defined $previous) || (!$self->{boxes}->[$previous]);
+
+ $self->{boxes}->[$previous]->unhighlight;
+ delete $self->{selectedIndexes}->{$idx};
+ }
+
+ sub restorePrevious
+ {
+ my ($self, $fromContainer) = @_;
+ foreach my $idx(keys %{$self->{selectedIndexes}})
+ {
+ $self->restoreItem($idx);
+ }
+ $self->{container}->clearSelected($self) if !$fromContainer;
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ $self->restorePrevious;
+ $self->select($self->{displayedToIdx}->{0}, 1, 0);
+ foreach my $displayed(1..scalar(@{$self->{boxes}}) - 1)
+ {
+ $self->select($self->{displayedToIdx}->{$displayed}, 0, 1);
+ }
+ $self->{parent}->display(keys %{$self->{selectedIndexes}});
+ }
+
+ sub selectMany
+ {
+ my ($self, $lastSelected) = @_;
+
+ my ($min, $max);
+ if ($self->{previousSelectedDisplayed} > $self->{idxToDisplayed}->{$lastSelected})
+ {
+ $min = $self->{idxToDisplayed}->{$lastSelected};
+ $max = $self->{previousSelectedDisplayed};
+ }
+ else
+ {
+ $min = $self->{previousSelectedDisplayed};
+ $max = $self->{idxToDisplayed}->{$lastSelected};
+ }
+ foreach my $displayed($min..$max)
+ {
+ $self->select($self->{displayedToIdx}->{$displayed}, 0, 1);
+ }
+
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init, $keepPrevious) = @_;
+ $self->{container}->setCurrentList($self);
+ $idx = $self->{displayedToIdx}->{0} if $idx == -1;
+ my $displayed = $self->{idxToDisplayed}->{$idx};
+ if (! $self->{columns})
+ {
+ $self->{toBeSelectedLater} = 1;
+ return $idx;
+ }
+ my @boxes = @{$self->{boxes}};
+
+ return $idx if ! scalar(@boxes);
+ my $alreadySelected = 0;
+ $alreadySelected = $boxes[$displayed]->{selected}
+ if exists $boxes[$displayed];
+ my $nbSelected = scalar keys %{$self->{selectedIndexes}};
+
+ return $idx if $alreadySelected && ($nbSelected < 2) && (!$init);
+ if ($keepPrevious)
+ {
+ if (($alreadySelected) && ($nbSelected > 1))
+ {
+
+ $self->restoreItem($idx);
+ # Special case where user has deselect items, so now only one item is left selected
+ # and menus need to be updated to reflect that
+ $self->updateMenus(1)
+ if $nbSelected <= 2;
+
+ return $idx;
+ }
+ $self->{selectedIndexes}->{$idx} = 1;
+ }
+ else
+ {
+ $self->restorePrevious;
+ $self->{selectedIndexes} = {$idx => 1};
+ }
+
+ $self->{current} = $displayed;
+
+ $boxes[$displayed]->highlight
+ if exists $boxes[$displayed];
+
+ $self->grab_focus;
+ $self->{container}->setCurrentList($self)
+ if $self->{container};
+
+ # Update menu items to reflect number of items selected
+ $self->updateMenus(scalar keys %{$self->{selectedIndexes}});
+ return $idx;
+ }
+
+ sub displayDetails
+ {
+ my ($self, $createWindow, @idx) = @_;
+ if ($createWindow)
+ {
+ $self->{parent}->displayInWindow($idx[0]);
+ }
+ else
+ {
+ $self->{parent}->display(@idx);
+ }
+ }
+
+ sub showPopupMenu
+ {
+ my ($self, $button, $time) = @_;
+
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $button, $time);
+ }
+
+ sub setPreviousSelectedDisplayed
+ {
+ my ($self, $idx) = @_;
+ $self->{previousSelectedDisplayed} = $self->{idxToDisplayed}->{$idx}
+ if !exists $self->{previousSelectedDisplayed};
+ }
+
+ sub unsetPreviousSelectedDisplayed
+ {
+ my ($self, $idx) = @_;
+ delete $self->{previousSelectedDisplayed};
+ }
+
+ sub updateMenus
+ {
+ # Update menu items to reflect number of items selected
+ my ($self, $nbSelected) = @_;
+ foreach (
+ # Menu labels
+ [$self->{parent}->{menubar}, 'duplicateItem', 'MenuDuplicate'],
+ [$self->{parent}->{menubar}, 'deleteCurrentItem', 'MenuEditDeleteCurrent'],
+ # Context menu labels
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindow'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicate'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrent'],
+ )
+ {
+ $self->{parent}->{menubar}->updateItem(
+ $_->[0]->{$_->[1]},
+ $_->[2].(($nbSelected > 1) ? 'Plural' : ''));
+ }
+ }
+
+ sub setHeader
+ {
+ my ($self, $header) = @_;
+ $self->{header} = $header;
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+ return if ! $self->{columns};
+ if ($self->{initializing})
+ {
+ Glib::Timeout->add(100 ,\&showCurrent, $self);
+ return;
+ }
+
+ my $adj = $self->{scroll}->get_vadjustment;
+ my $totalRows = int $self->{number} / $self->{columns};
+ my $row = (int $self->{current} / $self->{columns});
+
+ my $ypos = 0;
+ if ($self->{header})
+ {
+ $ypos = $self->{header}->allocation->y;
+ # We scroll also the size of the header.
+ # But we don't do that for the 1st row to have it displayed then.
+ $ypos += $self->{header}->allocation->height
+ if $row;
+ }
+ # Add the items before
+ $ypos += (($row - 1) * $self->{style}->{vboxHeight});
+
+ $adj->set_value($ypos);
+ return 0;
+ }
+
+ sub changeItem
+ {
+ my ($self, $idx, $previous, $new, $withSelect) = @_;
+ return $self->changeCurrent($previous, $new, $idx, 0);
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ my $forceSelect = 0;
+ #To ease comparison, do some modifications.
+ #empty borrower is equivalent to 'none'.
+ $previous->{$self->{borrowerField}} = 'none' if $previous->{$self->{borrowerField}} eq '';
+ $new->{$self->{borrowerField}} = 'none' if $new->{$self->{borrowerField}} eq '';
+ my $previousDisplayed = $self->{idxToDisplayed}->{$idx};
+ my $newDisplayed = $previousDisplayed;
+ if ($new->{$self->{sortField}} ne $previous->{$self->{sortField}})
+ {
+ # Adjust title
+ my $newTitle = $self->{parent}->transformTitle($new->{$self->{titleField}});
+ my $newSort = $self->{sortField} eq $self->{titleField} ? $newTitle : $new->{$self->{sortField}};
+
+ $self->{boxes}->[$previousDisplayed]->{info}->{title} = $newTitle;
+ $self->{tooltips}->set_tip($self->{boxes}->[$previousDisplayed], $newTitle, '');
+ my $newItemsArrayIdx;
+ ($newDisplayed, $newItemsArrayIdx) = $self->findPlace(undef, $newSort);
+ # We adjust the index as we'll remove an item
+ $newDisplayed-- if $newDisplayed > $previousDisplayed;
+ if ($previousDisplayed != $newDisplayed)
+ {
+ #$self->restorePrevious;
+ my $itemPreviousLine = int $previousDisplayed / $self->{columns};
+ my $itemNewLine = int $newDisplayed / $self->{columns};
+ my $itemNewCol = $newDisplayed % $self->{columns};
+ my ($direction, $origin, $limit);
+ if ($previousDisplayed > $newDisplayed)
+ {
+ $direction = 1;
+ $origin = $newDisplayed;
+ $limit = $previousDisplayed - 1;
+ }
+ else
+ {
+ $direction = -1;
+ $origin = $previousDisplayed;
+ $limit = $newDisplayed;
+ $itemNewCol++ if ($itemNewLine > $itemPreviousLine) && ($itemNewCol != 0)
+ }
+ my $box = $self->{cache}->[$idx]->{imageBox};
+ my $previousItemsArrayIdx = $self->displayedToItemsArrayIdx($previousDisplayed);
+ $self->{rowContainers}->[$itemPreviousLine]->remove($box);
+ splice @{$self->{boxes}}, $previousDisplayed, 1;
+ $self->{rowContainers}->[$itemNewLine]->pack_start($box,0,0,0);
+ $self->{rowContainers}->[$itemNewLine]->reorder_child($box, $itemNewCol);
+
+ $self->shiftItems($origin, $direction, 0, $limit);
+ my $item = splice @{$self->{itemsArray}}, $previousItemsArrayIdx, 1;
+ $newItemsArrayIdx-- if $previousItemsArrayIdx < $newItemsArrayIdx;
+ splice @{$self->{itemsArray}}, $newItemsArrayIdx, 0, $item;
+ splice @{$self->{boxes}}, $newDisplayed, 0, $box;
+ $self->initConversionTables;
+ }
+ }
+
+ my @boxes = @{$self->{boxes}};
+ my $item = $self->createItemInfo($idx, $new);
+ if (($previous->{$self->{coverField}} ne $new->{$self->{coverField}})
+ || ($previous->{$self->{borrowerField}} ne $new->{$self->{borrowerField}})
+ || ($previous->{favourite} ne $new->{favourite}))
+ {
+ $boxes[$newDisplayed]->refreshInfo($item, 1);
+ $forceSelect = 1;
+ $wantSelect = 1 if $wantSelect ne '';
+ }
+ else
+ {
+ # Popup is refreshed by previous call.
+ # So we just need to explicitely do it here
+ if ($boxes[$newDisplayed])
+ {
+ $boxes[$newDisplayed]->setInfo($item);
+ $boxes[$newDisplayed]->refreshPopup;
+ }
+ }
+ if ($self->{filter})
+ {
+ # Test visibility
+ my $previouslyVisible = $self->{filter}->test($previous);
+ my $visible = $self->{filter}->test($new);
+ if ($previouslyVisible && ! $visible)
+ {
+ $self->{displayedNumber}--;
+ $self->restorePrevious if $wantSelect;
+ my $itemLine = int $newDisplayed / $self->{columns};
+
+ $self->{rowContainers}->[$itemLine]->remove(
+ $self->{cache}->[$idx]->{imageBox}
+ );
+ my $info = $self->{boxes}->[$newDisplayed]->{info};
+ splice @{$self->{boxes}}, $newDisplayed, 1;
+ $self->shiftItems($newDisplayed, -1, 0, scalar @{$self->{boxes}});
+ $self->initConversionTables;
+ $info->{displayed} = $visible;
+ $idx = $self->getFirstVisibleIdx($newDisplayed);
+ $wantSelect = 0 if ! scalar @{$self->{boxes}}
+ }
+ }
+ $self->select($idx, $forceSelect) if $wantSelect;
+ return $idx;
+ }
+
+ sub showSearch
+ {
+ my ($self, $char) = @_;
+ $self->{searchEntry}->set_text($char);
+ $self->{searchEntry}->show_all;
+ $self->activateSearch;
+ $self->{container}->{searchTimeOut} = Glib::Timeout->add(4000, sub {
+ $self->hideSearch;
+ $self->{searchTimeOut} = 0;
+ return 0;
+ });
+ }
+
+ sub activateSearch
+ {
+ my ($self) = @_;
+ $self->{searchEntry}->grab_focus;
+ $self->{searchEntry}->select_region(length($self->{searchEntry}->get_text), -1);
+ }
+
+ sub hideSearch
+ {
+ my $self = shift;
+ $self->{searchEntry}->set_text('');
+ $self->{searchEntry}->hide;
+ $self->grab_focus;
+ $self->{previousSearch} = '';
+ }
+
+ sub internalSearch
+ {
+ my $self = shift;
+
+ my $query = $self->{searchEntry}->get_text;
+ return if !$query;
+ my $newDisplayed = -1;
+
+ my $current = 0;
+ my $length = length($query);
+ if ($self->{currentOrder})
+ {
+ if (($length > 1) && ($length > length($self->{previousSearch})))
+ {
+ $current = $self->{idxToDisplayed}->{$self->{itemsArray}->[$self->{current}]->{idx}};
+ }
+ foreach(@{$self->{itemsArray}}[$current..$self->{count} - 1])
+ {
+ next if !$_->{displayed};
+ if ($_->{title} ge $query)
+ {
+ $newDisplayed = $self->{idxToDisplayed}->{$_->{idx}};
+ last;
+ }
+ }
+ }
+ else
+ {
+ foreach(@{$self->{itemsArray}}[$current..$self->{count} - 1])
+ {
+ next if !$_->{displayed};
+ if (($_->{title} =~ m/^\Q$query\E/i) || ($_->{title} lt $query))
+ {
+ $newDisplayed = $self->{idxToDisplayed}->{$_->{idx}};
+ last;
+ }
+ }
+ }
+
+ if ($newDisplayed != -1)
+ {
+ my $valueIdx = $self->{displayedToIdx}->{$newDisplayed};
+ $self->select($valueIdx);
+ $self->{parent}->display($valueIdx);
+ $self->{boxes}->[$newDisplayed]->grab_focus;
+ $self->showCurrent;
+ $self->activateSearch;
+ }
+ $self->{previousSearch} = $query;
+ }
+
+}
+
+{
+ package GCImageList;
+
+ use base "Gtk2::VBox";
+ use File::Temp qw/ tempfile /;
+
+ my $defaultGroup = 'GCMAINDEFAULTGROUP';
+
+ sub new
+ {
+ my ($proto, $parent, $columns) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+ bless ($self, $class);
+
+ $self->{preferences} = $parent->{model}->{preferences};
+ $self->{parent} = $parent;
+ $self->{columns} = $columns;
+
+ $self->{borrowerField} = $parent->{model}->{commonFields}->{borrower}->{name};
+
+ $self->{scroll} = new Gtk2::ScrolledWindow;
+ $self->{scroll}->set_policy ('automatic', 'automatic');
+ $self->{scroll}->set_shadow_type('none');
+
+ $self->{searchEntry} = new Gtk2::Entry;
+ #$self->{list} = new GCBaseImageList($self, $columns);
+
+ $self->{orderSet} = 0;
+ $self->{sortButton} = Gtk2::Button->new;
+ $self->setSortButton($self->{preferences}->sortOrder);
+ $self->{searchEntry}->signal_connect('changed' => sub {
+ return if ! $self->{searchEntry}->get_text;
+ $self->internalSearch;
+ });
+ $self->{searchEntry}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ Glib::Source->remove($self->{searchTimeOut})
+ if $self->{searchTimeOut};
+ return if ! $self->{searchEntry}->get_text;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Escape')
+ {
+ $self->hideSearch;
+ return 1;
+ }
+ $self->{searchTimeOut} = Glib::Timeout->add(4000, sub {
+ $self->hideSearch;
+ $self->{searchTimeOut} = 0;
+ return 0;
+ });
+
+ return 0;
+ });
+
+ #$self->{scroll}->add_with_viewport($self->{list});
+ $self->{mainList} = new Gtk2::VBox(0,0);
+ $self->{scroll}->add_with_viewport($self->{mainList});
+ #$self->{list}->initPixmaps;
+
+ $self->pack_start($self->{sortButton},0,0,0);
+ $self->pack_start($self->{scroll},1,1,0);
+ $self->pack_start($self->{searchEntry},0,0,0);
+
+ $self->{sortButton}->signal_connect('clicked' => sub {
+ $self->setSortOrder(-1);
+ $self->setSortButton;
+ });
+
+ $self->initStyle;
+ $self->setGroupingInformation;
+ $self->{empty} = 1;
+ $self->{orderedLists} = [];
+ $self->{displayed} = {};
+ return $self;
+ }
+
+ sub setSortButton
+ {
+ my ($self, $order) = @_;
+ $order = $self->{currentOrder}
+ if !defined $order;
+ my $image = Gtk2::Image->new_from_stock($order
+ ? 'gtk-sort-descending'
+ : 'gtk-sort-ascending',
+ 'button');
+ my $stockItem = Gtk2::Stock->lookup($order
+ ? 'gtk-sort-ascending'
+ : 'gtk-sort-descending');
+ $stockItem->{label} =~ s/_//g;
+ $self->{sortButton}->set_label($stockItem->{label});
+ $self->{sortButton}->set_image($image);
+
+ }
+
+ sub show_all
+ {
+ my $self = shift;
+ $self->SUPER::show_all;
+ $self->{mainList}->show_all;
+ $self->{searchEntry}->hide;
+ }
+
+ sub done
+ {
+ my $self = shift;
+ foreach (values %{$self->{lists}})
+ {
+ $_->done;
+# $self->{style}->{vboxWidth} = $_->{style}->{vboxWidth}
+# if !exists $self->{style}->{vboxWidth};
+ }
+ # We set a number of ms to wait before enhancing the pictures
+ my $offset = 0;
+ foreach (@{$self->{orderedLists}})
+ {
+ $self->{lists}->{$_}->{offset} = $offset;
+ $offset += $timeOutBetweenEnhancements * ($self->{lists}->{$_}->{displayedNumber} + 1);
+ }
+ if ($self->{columns} == 0)
+ {
+ $self->signal_connect('size-allocate' => sub {
+ $self->computeAllocation;
+ });
+ $self->computeAllocation;
+ }
+ else
+ {
+ foreach (values %{$self->{lists}})
+ {
+ $_->setColumnsNumber($self->{columns}, 0);
+ }
+ }
+ }
+
+ sub computeAllocation
+ {
+ my $self = shift;
+ return if !$self->{style}->{vboxWidth};
+ my $width = $self->{scroll}->child->allocation->width - 15;
+ return if $width < 0;
+ if (($self->{scroll}->get_hscrollbar->visible)
+ || ($width > (($self->{columns} + 1) * $self->{style}->{vboxWidth})))
+ {
+ my $columns = int ($width / $self->{style}->{vboxWidth});
+ if ($columns)
+ {
+ return if $columns == $self->{columns};
+ $self->{columns} = $columns;
+ foreach (values %{$self->{lists}})
+ {
+ $_->setColumnsNumber($columns, 1);
+ }
+ # TODO : We should maybe select an item here
+ #$self->{parent}->display($self->select(-1, 1))
+ # if !$self->{current};
+ }
+ else
+ {
+ $self->{columns} = 1;
+ }
+ }
+
+ }
+
+ sub initStyle
+ {
+ my $self = shift;
+ my $parent = $self->{parent};
+
+ my $size = $self->{preferences}->listImgSize;
+ $self->{style}->{withAnimation} = $self->{preferences}->animateImgList;
+ $self->{style}->{withImage} = $self->{preferences}->listBgPicture;
+ $self->{style}->{useOverlays} = ($self->{preferences}->useOverlays) && ($parent->{model}->{collection}->{options}->{overlay}->{image});
+ $self->{preferences}->listImgSkin($GCStyle::defaultList) if ! $self->{preferences}->exists('listImgSkin');
+ $self->{style}->{skin} = $self->{preferences}->listImgSkin;
+ # Reflect setting can be enabled using "withReflect=1" in the listbg style file
+ $self->{style}->{withReflect} = 0;
+ $self->{preferences}->listImgSize(2) if ! $self->{preferences}->exists('listImgSize');
+
+ my $bgdir;
+ # Load in extra settings from the style file
+ if ($self->{style}->{withImage})
+ {
+ $bgdir = $ENV{GCS_SHARE_DIR}.'/list_bg/'.$self->{style}->{skin};
+ if (open STYLE, $bgdir.'/style')
+ {
+ while (<STYLE>)
+ {
+ chomp;
+ next if !$_;
+ m/^(.*?)\s*=\s*(.*)$/;
+ my $item = $1;
+ (my $value = $2) =~ s/^"(.*?)"$/$1/;
+ $self->{style}->{$item} = $value;
+ }
+ close STYLE;
+ }
+ }
+
+ # Sets image width/height (for size = 2), getting value from the collection model or setting to
+ # default values of 120, 160 if not specified in model file
+ $self->{style}->{imgWidth} = (exists $parent->{model}->{collection}->{options}->{defaults}->{listImageWidth})
+ ? $parent->{model}->{collection}->{options}->{defaults}->{listImageWidth}
+ : 120;
+ $self->{style}->{imgHeight} = (exists $parent->{model}->{collection}->{options}->{defaults}->{listImageHeight})
+ ? $parent->{model}->{collection}->{options}->{defaults}->{listImageHeight}
+ : 160;
+
+ $self->{style}->{factor} = ($size == 0) ? 0.5
+ : ($size == 1) ? 0.8
+ : ($size == 3) ? 1.5
+ : ($size == 4) ? 2
+ : 1;
+ $self->{style}->{imgWidth} *= $self->{style}->{factor};
+ $self->{style}->{imgHeight} *= $self->{style}->{factor};
+ $self->{style}->{offsetX} = 11;
+ if ($self->{style}->{withImage})
+ {
+ if (! $self->{style}->{useOverlays})
+ {
+ $self->{style}->{offsetX} = 26;
+ }
+ }
+ else
+ {
+ $self->{style}->{offsetX} = 22;
+ }
+
+ $self->{style}->{vboxWidth} = $self->{style}->{imgWidth} + ($self->{style}->{offsetX} * $self->{style}->{factor});
+
+ $self->{style}->{vboxHeight} = $self->{style}->{imgHeight} + (10 * $self->{style}->{factor});
+ $self->{style}->{vboxHeight} += (20 * $self->{style}->{factor}) if $self->{style}->{withImage};
+ $self->{style}->{vboxHeight} += (30 * $self->{style}->{factor}) if $self->{style}->{withReflect};
+ $self->{style}->{pageCount} = int 5 / $self->{style}->{factor};
+
+ # Pixbuf for lending icon
+ my $lendImageFile = $ENV{GCS_SHARE_DIR}.'/overlays/lend_';
+ $lendImageFile .= ($size < 1) ? 'verysmall'
+ : ($size < 2) ? 'small'
+ : ($size < 3) ? 'med'
+ : ($size < 4) ? 'large'
+ : 'xlarge';
+ $self->{style}->{lendPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($lendImageFile.'.png');
+
+ # Pixbuf for favourite icon
+ my $favImageFile = $ENV{GCS_SHARE_DIR}.'/overlays/favourite_';
+ $favImageFile .= ($size < 1) ? 'verysmall'
+ : ($size < 2) ? 'small'
+ : ($size < 3) ? 'med'
+ : ($size < 4) ? 'large'
+ : 'xlarge';
+ $self->{style}->{favPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($favImageFile.'.png');
+
+ if ($self->{style}->{useOverlays})
+ {
+ $self->{style}->{overlayImage} = $ENV{GCS_SHARE_DIR}.'/overlays/'.$parent->{model}->{collection}->{options}->{overlay}->{image};
+ $self->{style}->{overlayPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($self->{style}->{overlayImage});
+
+ $self->{style}->{overlayPaddingLeft} = $parent->{model}->{collection}->{options}->{overlay}->{paddingLeft};
+ $self->{style}->{overlayPaddingRight} = $parent->{model}->{collection}->{options}->{overlay}->{paddingRight};
+ $self->{style}->{overlayPaddingTop} = $parent->{model}->{collection}->{options}->{overlay}->{paddingTop};
+ $self->{style}->{overlayPaddingBottom} = $parent->{model}->{collection}->{options}->{overlay}->{paddingBottom};
+ }
+
+ # Default value for align
+ $self->{style}->{groupAlign} = 'center';
+
+ if ($self->{style}->{withImage})
+ {
+ $self->{style}->{bgPixmap} = $bgdir.'/list_bg.png';
+
+ my $tmpPixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{style}->{bgPixmap});
+ $tmpPixbuf = GCUtils::scaleMaxPixbuf($tmpPixbuf,
+ $self->{style}->{vboxWidth},
+ $self->{style}->{vboxHeight},
+ 1);
+ (my $fh, $self->{style}->{tmpBgPixmapFile}) = tempfile(UNLINK => 1);
+ close $fh;
+ if ($^O =~ /win32/i)
+ {
+ # It looks like Win32 version only supports JPEG pictures for background
+ $tmpPixbuf->save($self->{style}->{tmpBgPixmap}, 'jpeg', quality => '100');
+ }
+ else
+ {
+ $tmpPixbuf->save($self->{style}->{tmpBgPixmapFile}, 'png');
+ }
+
+ #($self->{style}->{tmpBgPixmap}, $self->{style}->{tmpBgMask}) = $tmpPixbuf->render_pixmap_and_mask(255);
+
+ GCUtils::setWidgetPixmap($self->{mainList}->parent, $self->{style}->{tmpBgPixmapFile});
+
+ $self->{style}->{backgroundPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($self->{style}->{bgPixmap});
+ $self->{style}->{backgroundPixbuf} = GCUtils::scaleMaxPixbuf($self->{style}->{backgroundPixbuf},
+ $self->{style}->{vboxWidth},
+ $self->{style}->{vboxHeight},
+ 1);
+ my @colors = split m/,/, $self->{preferences}->listFgColor;
+ ($colors[0], $colors[1], $colors[2]) = (65535, 65535, 65535) if !@colors;
+ my $red = int($colors[0] / 257);
+ my $green = int($colors[1] / 257);
+ my $blue = int($colors[2] / 257);
+ $self->{style}->{activeBgValue} = ($red << 16) + ($green << 8) + $blue;
+
+ if ($self->{style}->{withReflect})
+ {
+ $self->{style}->{foregroundPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($bgdir.'/list_fg.png');
+ $self->{style}->{foregroundPixbuf} = GCUtils::scaleMaxPixbuf($self->{style}->{foregroundPixbuf},
+ $self->{style}->{vboxWidth},
+ $self->{style}->{vboxHeight},
+ 1);
+ }
+
+ $self->{groupBgFile} = $bgdir.'/group.png';
+ }
+ else
+ {
+ my @colors = split m/,/, $self->{preferences}->listBgColor;
+ ($colors[0], $colors[1], $colors[2]) = (65535, 65535, 65535) if !@colors;
+ $self->{style}->{inactiveBg} = new Gtk2::Gdk::Color($colors[0], $colors[1], $colors[2]);
+ @colors = split m/,/, $self->{preferences}->listFgColor;
+ ($colors[0], $colors[1], $colors[2]) = (0, 0, 0) if !@colors;
+ $self->{style}->{activeBg} = new Gtk2::Gdk::Color($colors[0], $colors[1], $colors[2]);
+ $self->{mainList}->parent->modify_bg('normal', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('active', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('prelight', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('selected', $self->{style}->{inactiveBg});
+ $self->{mainList}->parent->modify_bg('insensitive', $self->{style}->{inactiveBg});
+ }
+ }
+
+ sub initListStyle
+ {
+ my ($self, $list) = @_;
+ $list->{style} = $self->{style};
+ if ($self->{style}->{withImage})
+ {
+ GCUtils::setWidgetPixmap($list->parent, $self->{style}->{tmpBgPixmapFile});
+ }
+ else
+ {
+ $self->set_border_width(5);
+ $list->parent->modify_bg('normal', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('active', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('prelight', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('selected', $self->{style}->{inactiveBg});
+ $list->parent->modify_bg('insensitive', $self->{style}->{inactiveBg});
+ }
+ }
+
+ sub setCurrentList
+ {
+ my ($self, $list) = @_;
+ $self->{currentList} = $list;
+ }
+
+ sub setGroupingInformation
+ {
+ my $self = shift;
+
+ $self->{collectionField} = $self->{preferences}->groupBy;
+ $self->{groupItems} = ($self->{collectionField} ne '');
+ if (!$self->{groupItems})
+ {
+ $self->addGroup($defaultGroup, uc $defaultGroup, 1)
+ if !$self->{currentList};
+ }
+ }
+
+ sub getGroups
+ {
+ my ($self, $info) = @_;
+
+ my $field = $self->{collectionField};
+ my $value = $info->{$field};
+ my $type = '';
+ $type = $self->{parent}->{model}->{fieldsInfo}->{$field}->{type}
+ if defined $self->{parent}->{model}->{fieldsInfo}->{$field}->{type};
+
+ $value = $self->{parent}->transformValue($value, $field, 1);
+
+ if (ref($value) eq 'ARRAY')
+ {
+ if (!scalar (@$value))
+ {
+ $value = [$defaultGroup];
+ }
+ }
+ else
+ {
+ $value = $defaultGroup
+ if ($type =~ /text$/) && ($value eq '');
+ my @array = ($value);
+ $value = \@array;
+ }
+
+
+ return $value;
+ }
+
+ sub sortAndFind
+ {
+ my ($self, $group) = @_;
+
+ # We insert it in the list
+ my @tmpList = @{$self->{orderedLists}};
+ #push @tmpList, $group;
+ # We sort it
+ if ($self->{currentOrder} == 0)
+ {
+ @tmpList = reverse sort {GCUtils::gccmpe($a, $b)} @tmpList;
+ }
+ else
+ {
+ @tmpList = sort {GCUtils::gccmpe($a, $b)} @tmpList;
+ }
+
+ # And now we find back its position
+ $self->{orderedLists} = \@tmpList;
+ return GCUtils::inArray($group, @tmpList);
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+
+ # We count the number of items in displayed hash where value is 1
+ return scalar grep {$_ == 1} values %{$self->{displayed}};
+ }
+
+ sub createHeader
+ {
+ my ($self, $title) = @_;
+ my $label;
+ my $fixedTitle = $title;
+ $fixedTitle =~ s/&/&amp;/;
+ $fixedTitle =~ s/</&lt;/;
+ $fixedTitle =~ s/>/&gt;/;
+
+ if ($self->{style}->{withImage})
+ {
+ $label = new GCColorLabel(Gtk2::Gdk::Color->parse('#000000'));
+ $label->set_markup('<span '.$self->{style}->{groupStyle}.">$fixedTitle</span>");
+ GCUtils::setWidgetPixmap($label, $self->{groupBgFile});
+ }
+ else
+ {
+ $label = new GCColorLabel($self->{style}->{activeBg});
+ $label->set_markup('<span weight="bold" color="'.$self->{style}->{inactiveBg}->to_string."\">$fixedTitle</span>");
+ }
+ $label->set_justify($self->{style}->{groupAlign});
+ $label->set_padding($GCUtils::halfMargin, $GCUtils::halfMargin);
+ return $label;
+ return new Gtk2::Label($title);
+ }
+
+ sub addGroup
+ {
+ my ($self, $group, $refGroup, $immediate) = @_;
+
+ my $listBox = new Gtk2::VBox(0,0);
+ my $list = new GCBaseImageList($self, $self->{columns});
+ if ($self->{groupItems})
+ {
+ my $label;
+ if ($refGroup eq $defaultGroup)
+ {
+ $label = $self->createHeader('');
+ }
+ else
+ {
+ $label = $self->createHeader($group);
+ }
+ $listBox->pack_start($label, 0, 0, 0);
+ $list->setHeader($label);
+ $list->{refGroup} = $refGroup;
+ $label->show_all;
+ }
+ my $eventBox = new Gtk2::EventBox;
+ $eventBox->add($list);
+ $listBox->pack_start($eventBox, 0, 0, 0);
+ $self->{mainList}->pack_start($listBox, 0, 0, 0);
+
+ push @{$self->{orderedLists}}, $refGroup
+ if ($refGroup ne $defaultGroup);
+
+ if ($immediate && $self->{groupItems})
+ {
+ my $place = $self->sortAndFind($refGroup);
+ $self->{mainList}->reorder_child($listBox, $place);
+ }
+
+ $listBox->show_all;
+ $self->initListStyle($list);
+ $self->{lists}->{$refGroup} = $list;
+ $self->{listBoxes}->{$refGroup} = $listBox;
+ $self->{currentList} = $list if ! $self->{currentList};
+ $list->done(undef, 1) if $immediate;
+ return $list;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate) = @_;
+ my $groups = [];
+ if ($self->{groupItems})
+ {
+ $groups = $self->getGroups($info);
+ }
+ else
+ {
+ $groups = [$defaultGroup];
+ }
+ foreach my $group(@$groups)
+ {
+ my $refGroup = uc($group);
+ if (! exists $self->{lists}->{$refGroup})
+ {
+ $self->addGroup($group, $refGroup, $immediate);
+ }
+ $self->{currentList} = $self->{lists}->{$refGroup} if $immediate;
+ $self->{lists}->{$refGroup}->addItem($info, $immediate, $self->{count}, 0);
+ # Storing conversion from index to the actual list
+ $self->{idxToList}->{$self->{count}} = $self->{lists}->{$refGroup};
+ }
+ # Default is to display it. It will maybe be filtered later
+ $self->{displayed}->{$self->{count}} = 1;
+ $self->{count}++;
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return $self->{groupItems};
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+ # TODO:
+ $self->{currentList}->showCurrent
+ if $self->{currentList};
+ }
+
+ sub clearSelected
+ {
+ my ($self, $current) = @_;
+ foreach (values %{$self->{lists}})
+ {
+ next if $_ == $current;
+ $_->restorePrevious(1);
+ }
+
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ foreach (values %{$self->{lists}})
+ {
+ $_->reset;
+ }
+ $self->{count} = 0;
+ $self->{idxToList} = {};
+ }
+
+ sub clearCache
+ {
+ my ($self) = @_;
+ foreach (values %{$self->{lists}})
+ {
+ $_->clearCache;
+ }
+ #$self->{vboxWidth} = 1;
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order) = @_;
+ $self->{orderSet} = 1;
+
+ if ($self->{groupItems})
+ {
+ my $first = 1;
+ foreach (values %{$self->{lists}})
+ {
+ $_->setSortOrder($order);
+ # We get it computed by the first internal list
+ $self->{currentOrder} = $_->{currentOrder}
+ if $first;
+ $first = 0;
+ }
+ # Now the internal lists are ordered, we need to order them
+ my @tmpList = @{$self->{orderedLists}};
+
+ # We sort the list, using gccmpe to handle sorting of numeric values and dates
+ if ($self->{currentOrder} == 0)
+ {
+ @tmpList = reverse sort {GCUtils::gccmpe($a, $b)} @{$self->{orderedLists}};
+ }
+ else
+ {
+ @tmpList = sort {GCUtils::gccmpe($a, $b)} @{$self->{orderedLists}};
+ }
+
+ # Clear the current view
+ my @children = $self->{mainList}->get_children;
+ foreach my $child(@children)
+ {
+ $self->{mainList}->remove($child);
+ }
+ # And fill it again with the current order
+ foreach my $refGroup(@tmpList, $defaultGroup)
+ {
+ next if !$self->{listBoxes}->{$refGroup};
+ $self->{mainList}->pack_start($self->{listBoxes}->{$refGroup}, 0, 0, 0);
+ $self->{listBoxes}->{$refGroup}->show_all;
+ }
+
+ # Save the new order
+ $self->{orderedLists} = \@tmpList;
+ }
+ else
+ {
+ $self->{currentList}->setSortOrder($order);
+ $self->{currentList}->show_all;
+ # We get it computed by the first internal list
+ $self->{currentOrder} = $self->{currentList}->{currentOrder};
+ }
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ shift;
+ my $current;
+ my $result = -1;
+ my $list;
+ $self->{displayed} = {};
+ foreach (keys %{$self->{lists}})
+ {
+ $list = $self->{lists}->{$_};
+ $current = $list->setFilter(@_);
+ $result = $current if $list == $self->{currentList};
+ if ($list->{displayedNumber})
+ {
+ $self->{listBoxes}->{$_}->show_all;
+ }
+ else
+ {
+ $self->{listBoxes}->{$_}->hide;
+ }
+ }
+ $result = -1 if !defined $result;
+ return $result;
+ }
+
+ sub setDisplayed
+ {
+ my ($self, $idx, $displayed) = @_;
+ $self->{displayed}->{$idx} = $displayed;
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init, $keepPrevious) = @_;
+ my $list;
+ if ($self->{groupItems})
+ {
+ if (($idx == -1) || (!defined $idx))
+ {
+ if (defined $self->{orderedLists}->[0])
+ {
+ $list = $self->{lists}->{$self->{orderedLists}->[0]};
+ }
+ else
+ {
+ $list = $self->{lists}->{$defaultGroup};
+ }
+ }
+ else
+ {
+ $list = $self->{idxToList}->{$idx};
+ }
+ }
+ else
+ {
+ $list = $self->{currentList};
+ }
+ $list->select($idx, $init, $keepPrevious)
+ if $list;
+ }
+
+ sub savePreferences
+ {
+ my ($self, $preferences) = @_;
+ return if !$self->{orderSet};
+ $preferences->sortField($self->{titleField});
+ $preferences->sortOrder($self->{currentOrder});
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ return 0 if !$self->{currentList};
+ return $self->{currentList}->getCurrentIdx;
+ }
+
+ sub removeCurrentItems
+ {
+ my $self = shift;
+ # TODO : This doesn't work if there are items selected in many lists
+
+ my @indexes = sort @{$self->getCurrentItems};
+ my $selected;
+ my @listWhereAlreadyRemoved;
+ # Find other lists where they were
+ foreach my $list(values %{$self->{lists}})
+ {
+ next if $list == $self->{currentList};
+ foreach my $idx(@indexes)
+ {
+ my $nbRemoved = 0;
+ if (exists $list->{idxToDisplayed}->{$idx - $nbRemoved})
+ {
+ $list->removeItem($idx - $nbRemoved);
+ push @listWhereAlreadyRemoved, 0 + $list;
+ $nbRemoved++;
+ }
+ #splice @{$list->{cache}}, $idx - $nbRemoved, 1;
+ delete $self->{displayed}->{$idx};
+ }
+ }
+ # Adjust the total number of items according to what we removed
+ $self->{count} -= scalar @indexes;
+
+ $selected = $self->{currentList}->removeCurrentItems;
+ push @listWhereAlreadyRemoved, $self->{currentList};
+
+ # Now we have to adjust all of the indexes in other lists
+ foreach my $list(values %{$self->{lists}})
+ {
+ # We don't perform the switch if we already removed the item
+ my $found = 0;
+ foreach my $listRm(@listWhereAlreadyRemoved)
+ {
+ if ($listRm == $list)
+ {
+ # Found a list where we removed it
+ $found = 1;
+ last;
+ }
+ }
+ next if $found;
+ $list->shiftIndexes(\@indexes);
+ $list->initConversionTables;
+ }
+
+ # If we removed all the items in the current group, we are looking for the 1st one
+ # of the next group (fallback on previous if last one)
+ if (!defined $selected)
+ {
+ my $nextList;
+ foreach my $i(0 .. $#{$self->{orderedLists}})
+ {
+ if ($self->{orderedLists}->[$i] eq $self->{currentList}->{refGroup})
+ {
+ if ($i < $#{$self->{orderedLists}})
+ {
+ $nextList = $self->{orderedLists}->[$i+1];
+ last;
+ }
+ else
+ {
+ $nextList = $self->{orderedLists}->[$i-1]
+ if $i > 0;
+ last;
+ }
+ }
+ }
+ if ($nextList)
+ {
+ my $currentList = $self->{lists}->{$nextList};
+ $selected = $currentList->{displayedToIdx}->{0};
+ $currentList->select($selected);
+ $self->{currentList} = $currentList;
+ }
+ }
+ return $selected;
+ }
+
+ sub getCurrentItems
+ {
+ my $self = shift;
+ # TODO : This doesn't work if there are items selected in many lists
+ return $self->{currentList}->getCurrentItems;
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ if ($self->{groupItems})
+ {
+ # Will be set to a true value if the 1st added item should be selected
+ my $shouldBeSelected = 0;
+ # Get the list where it was
+ my @prevGroups = sort @{$self->getGroups($previous)};
+
+ # And the one where it should be
+ my @newGroups = sort @{$self->getGroups($new)};
+
+ my ($found, $place);
+ # First look for previous ones
+ foreach my $pg(@prevGroups)
+ {
+ my $pg = uc $pg;
+ ($found, $place) = (0, 0);
+ # Try to find it in the new groups
+ foreach my $ng (@newGroups)
+ {
+ my $refGroup = uc($ng);
+ $found = 1 if $refGroup eq $pg;
+ # As it is sorted, we can stop when we find a greater one
+ last if $refGroup ge $pg;
+ $place++;
+ }
+ # If found, we just change it
+ if ($found)
+ {
+ $self->{lists}->{$pg}->changeCurrent($previous, $new, $idx, $wantSelect);
+ # And we remove it from the list
+ splice @newGroups, $place, 1;
+ }
+ # Otherwise, it means it was removed from this group
+ else
+ {
+ $shouldBeSelected = 1
+ if $self->{lists}->{$pg}->isSelected($idx);
+ $self->{lists}->{$pg}->removeItem($idx,1);
+ }
+ }
+ # Now we should have a list whith just the new groups
+ foreach my $ng(@newGroups)
+ {
+ my $refGroup = uc $ng;
+ # We should create the list if it doesn't exist
+ if (! exists $self->{lists}->{$refGroup})
+ {
+ my $list = $self->addGroup($ng, $refGroup, 1);
+ }
+
+ # 2nd parameter means it should be added immediately
+ # 4th one is that we should not change the conversion tables because it's not
+ # a new item
+ $self->{lists}->{$refGroup}->addItem($new, 1, $idx, 1);
+ if ($shouldBeSelected)
+ {
+ $self->{lists}->{$refGroup}->select($idx, 0, 1);
+ $shouldBeSelected = 0;
+ }
+ }
+ # TODO It should return something else if filtered
+ return $idx;
+ }
+ else
+ {
+ return $self->{currentList}->changeCurrent($previous, $new, $idx, $wantSelect);
+ }
+ }
+
+ sub AUTOLOAD
+ {
+ return if our $AUTOLOAD =~ /::DESTROY$/;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ my $self = shift;
+ #GCUtils::printStack(6);
+ #print "CALLING $name\n";
+ return $self->{currentList}->$name(@_);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCListOptions.pm b/lib/gcstar/GCItemsLists/GCListOptions.pm
new file mode 100644
index 0000000..c41084b
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCListOptions.pm
@@ -0,0 +1,496 @@
+package GCListOptions;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCListOptionsPanel;
+ use base "Gtk2::Frame";
+
+ sub setView
+ {
+ my ($self, $view) = @_;
+ if ((!exists $self->{currentView}) || ($view != $self->{currentView}))
+ {
+ $self->{currentView} = $view;
+ if ($self->{panel})
+ {
+ $self->{scroll}->remove($self->{scroll}->get_child);
+ $self->{panel}->destroy;
+ }
+
+ $self->{cancel}->set_sensitive(1);
+ $self->{apply}->set_sensitive(1);
+
+ if ($view == 0)
+ {
+ $self->{panel} = new GCEmptyOptionsPanel($self->{parent}->{model}->{preferences}, $self->{parent});
+ $self->{cancel}->set_sensitive(0);
+ $self->{apply}->set_sensitive(0);
+ }
+ elsif ($view == 1)
+ {
+ $self->{panel} = new GCImagesOptionsPanel($self->{parent}->{model}->{preferences}, $self->{parent});
+ }
+ else
+ {
+ $self->{panel} = new GCDetailedOptionsPanel($self->{parent}->{model}->{preferences}, $self->{parent});
+ }
+ $self->{scroll}->add_with_viewport($self->{panel});
+ $self->{scroll}->child->set_shadow_type('none');
+ }
+ $self->{panel}->initValues;
+ }
+
+ sub new
+ {
+ my ($proto, $optionsManager, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new;
+ $self->{optionsManager} = $optionsManager;
+ $self->{parent} = $parent;
+ $self->{scroll} = new Gtk2::ScrolledWindow;
+ $self->{scroll}->set_policy ('automatic', 'automatic');
+ $self->{scroll}->set_shadow_type('none');
+ $self->{hboxButtons} = new Gtk2::HBox(0,0);
+ $self->{cancel} = GCButton->newFromStock('gtk-clear');
+ $self->{apply} = GCButton->newFromStock('gtk-apply');
+
+ $self->{vbox} = new Gtk2::VBox(0,0);
+
+ $self->{hboxButtons}->pack_end($self->{apply}, 0, 0, $GCUtils::halfMargin);
+ $self->{hboxButtons}->pack_end($self->{cancel}, 0, 0, $GCUtils::halfMargin);
+ $self->add($self->{vbox});
+
+ $self->{vbox}->pack_start($self->{scroll}, 1, 1, $GCUtils::quarterMargin);
+ $self->{vbox}->pack_start($self->{hboxButtons}, 0, 0, $GCUtils::quarterMargin);
+
+ $self->{cancel}->signal_connect('clicked' => sub {
+ $self->{panel}->initValues
+ if $self->{panel};
+ });
+ $self->{apply}->signal_connect('clicked' => sub {
+ if ($self->{panel})
+ {
+ $self->{panel}->saveValues;
+ $self->{parent}->setItemsList(0, 1);
+ }
+ });
+
+
+ bless $self, $class;
+ return $self;
+ }
+}
+
+{
+ # Class used when there is no option
+ package GCEmptyOptionsPanel;
+ use base "Gtk2::VBox";
+ use GCStyle;
+
+ sub initValues
+ {
+ my $self = shift;
+ }
+ sub saveValues
+ {
+ my $self = shift;
+ }
+ sub new
+ {
+ my ($proto, $optionsManager, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(0,0);
+ bless $self, $class;
+ # TODO to be replaced with a translatable label
+ my $label = new GCLabel("No option");
+ $self->pack_start($label,1,1,0);
+ $self->show_all;
+ return $self;
+ }
+}
+
+{
+ # Class used to let user select images options
+ package GCImagesOptionsPanel;
+ use base "Gtk2::Table";
+ #use base "Gtk2::VBox";
+ use GCStyle;
+
+ sub initValues
+ {
+ my $self = shift;
+ $self->{resizeImgList}->set_active($self->{optionsManager}->resizeImgList);
+ $self->{animateImgList}->set_active($self->{optionsManager}->animateImgList);
+ $self->{columns}->set_value($self->{optionsManager}->columns);
+ $self->{imgSizeOption}->setValue($self->{optionsManager}->listImgSize);
+ $self->{optionStyle}->setValue($self->{optionsManager}->listImgSkin);
+ $self->{useOverlays}->set_active($self->{optionsManager}->useOverlays);
+ $self->{listBgPicture}->set_active($self->{optionsManager}->listBgPicture);
+ $self->activateColors(! $self->{optionsManager}->listBgPicture);
+ $self->{mlbg} = $self->{optionsManager}->listBgColor;
+ $self->{mlfg} = $self->{optionsManager}->listFgColor;
+ $self->{groupByOption}->setValue($self->{optionsManager}->groupBy);
+ $self->{secondarySortOption}->setValue($self->{optionsManager}->secondarySort);
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ $self->{optionsManager}->resizeImgList(($self->{resizeImgList}->get_active) ? 1 : 0);
+ $self->{optionsManager}->animateImgList(($self->{animateImgList}->get_active) ? 1 : 0);
+ $self->{optionsManager}->columns($self->{columns}->get_value);
+ $self->{optionsManager}->listImgSize($self->{imgSizeOption}->getValue);
+ $self->{optionsManager}->listImgSkin($self->{optionStyle}->getValue);
+ $self->{optionsManager}->listBgColor($self->{mlbg});
+ $self->{optionsManager}->listFgColor($self->{mlfg});
+ $self->{optionsManager}->listBgPicture(($self->{listBgPicture}->get_active) ? 1 : 0);
+ $self->{optionsManager}->useOverlays(($self->{useOverlays}->get_active) ? 1 : 0);
+ $self->{optionsManager}->groupBy($self->{groupByOption}->getValue);
+ $self->{optionsManager}->secondarySort( $self->{secondarySortOption}->getValue);
+ }
+
+ sub changeColor
+ {
+ my ($self, $type) = @_;
+
+ my $dialog = new Gtk2::ColorSelectionDialog($self->{lang}->{ImagesOptionsSelectColor});
+ my $vboxPicture = new Gtk2::VBox(0,0);
+ my @colors = split m/,/, $self->{'ml'.$type};
+ my $previous = new Gtk2::Gdk::Color($colors[0], $colors[1], $colors[2]);
+ $dialog->colorsel->set_current_color($previous) if $previous;
+ my $response = $dialog->run;
+ if ($response eq 'ok')
+ {
+ my $color = $dialog->colorsel->get_current_color;
+ $self->{'ml'.$type} = join ',',$color->red, $color->green, $color->blue;
+ }
+ $dialog->destroy;
+ }
+
+ sub activateColors
+ {
+ my ($self, $value) = @_;
+
+ $self->{labelStyle}->set_sensitive(!$value);
+ $self->{optionStyle}->set_sensitive(!$value);
+ $self->{labelBg}->set_sensitive($value);
+ $self->{buttonBg}->set_sensitive($value);
+ }
+
+ sub new
+ {
+ my ($proto, $optionsManager, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new(14,4);
+ #my $self = $class->SUPER::new(0,0);
+
+ $self->{optionsManager} = $optionsManager;
+ $self->{lang} = $parent->{lang};
+
+# $self->set_row_spacings($GCUtils::halfMargin);
+ $self->set_col_spacings($GCUtils::margin);
+ $self->set_border_width($GCUtils::margin);
+
+ $self->{labelColumns} = new GCLabel($self->{lang}->{OptionsColumns});
+ my $adj = Gtk2::Adjustment->new(0, 1, 20, 1, 1, 0) ;
+ $self->{columns} = Gtk2::SpinButton->new($adj, 0, 0);
+
+ $self->{resizeImgList} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsResizeImgList});
+ $self->{resizeImgList}->signal_connect('clicked' => sub {
+ $self->{columns}->set_sensitive(! $self->{resizeImgList}->get_active);
+ });
+ $self->{resizeImgList}->set_active($self->{resizeImgList});
+
+ $self->{animateImgList} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsAnimateImgList});
+ $self->{animateImgList}->signal_connect('clicked' => sub {
+ $self->{columns}->set_sensitive(! $self->{animateImgList}->get_active);
+ });
+ $self->{animateImgList}->set_active($self->{animateImgList});
+
+ $self->{imgSizeLabel} = new GCLabel($self->{lang}->{ImagesOptionsSizeLabel});
+ $self->{imgSizeOption} = new GCMenuList;
+ my %imgSizes = %{$self->{lang}->{ImagesOptionsSizeList}};
+ my @imgValues = map {{value => $_, displayed => $imgSizes{$_}}}
+ (sort keys %imgSizes);
+ $self->{imgSizeOption}->setValues(\@imgValues);
+
+ $self->{useOverlays} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsUseOverlays});
+ $self->{useOverlays}->set_active($self->{useOverlays});
+
+ $self->{listBgPicture} = new Gtk2::CheckButton($self->{lang}->{ImagesOptionsBgPicture});
+ $self->{listBgPicture}->signal_connect('clicked' => sub {
+ $self->activateColors(! $self->{listBgPicture}->get_active);
+ });
+
+ $self->{labelStyle} = new GCLabel($self->{lang}->{OptionsStyle});
+ $self->{optionStyle} = new GCMenuList;
+ my @styleValues;
+ foreach (@GCStyle::lists)
+ {
+ (my $displayed = $_) =~ s/_/ /g;
+ push @styleValues, {value => $_, displayed => $displayed};
+ }
+ $self->{optionStyle}->setValues(\@styleValues);
+
+ $self->{labelBg} = new GCLabel($self->{lang}->{ImagesOptionsBg});
+ $self->{buttonBg} = new Gtk2::Button($self->{lang}->{ImagesOptionsSelectColor});
+ $parent->{tooltips}->set_tip($self->{buttonBg},
+ $self->{lang}->{ImagesOptionsBgTooltip});
+ $self->{buttonBg}->signal_connect('clicked' => sub {
+ $self->changeColor('bg');
+ });
+
+ $self->{labelFg} = new GCLabel($self->{lang}->{ImagesOptionsFg});
+ $self->{buttonFg} = new Gtk2::Button($self->{lang}->{ImagesOptionsSelectColor});
+ $self->{buttonFg}->signal_connect('clicked' => sub {
+ $self->changeColor('fg');
+ });
+ $parent->{tooltips}->set_tip($self->{buttonFg},
+ $self->{lang}->{ImagesOptionsFgTooltip});
+
+ $self->{groupItems} = new GCLabel($self->{lang}->{DetailedOptionsGroupItems});
+ $self->{groupByOption} = new GCFieldSelector(0, undef, 1);
+ $self->{groupByOption}->setModel($parent->{model});
+
+ $self->{secondarySort} = new GCLabel($self->{lang}->{DetailedOptionsSecondarySort});
+ $self->{secondarySortOption} = new GCFieldSelector(0, undef, 1);
+ $self->{secondarySortOption}->setModel($parent->{model});
+
+# my $tableDisplay = new Gtk2::Table(5,2);
+# $tableDisplay->set_row_spacings($GCUtils::halfMargin);
+# $tableDisplay->set_col_spacings($GCUtils::margin);
+# $tableDisplay->set_border_width($GCUtils::margin);
+ my $imagesDisplayExpander = new GCExpander($self->{lang}->{OptionsImagesDisplayGroup}, 1);
+ $self->attach($imagesDisplayExpander, 0, 4, 0, 1, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{resizeImgList}, 2, 4, 1, 2, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{animateImgList}, 2, 4, 2, 3, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelColumns}, 2, 3, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{columns}, 3, 4, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{imgSizeLabel}, 2, 3, 4, 5, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{imgSizeOption}, 3, 4, 4, 5, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{groupItems}, 2, 3, 5, 6, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{groupByOption}, 3, 4, 5, 6, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{secondarySort}, 2, 3, 6, 7, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{secondarySortOption}, 3, 4, 6, 7, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ my $imagesStyleExpander = new GCExpander($self->{lang}->{OptionsImagesStyleGroup}, 1);
+ $self->attach($imagesStyleExpander, 0, 4, 8, 9, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{useOverlays}, 2, 4, 9, 10, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{listBgPicture}, 2, 4, 10, 11, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelStyle}, 2, 3, 11, 12, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{optionStyle}, 3, 4, 11, 12, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelBg}, 2, 3, 12, 13, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{buttonBg}, 3, 4, 12, 13, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{labelFg}, 2, 3, 13, 14, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $self->attach($self->{buttonFg}, 3, 4, 13, 14, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $imagesDisplayExpander->signal_connect('activate' => sub {
+ if (!$imagesDisplayExpander->get_expanded)
+ {
+ $self->{resizeImgList}->show_all;
+ $self->{labelColumns}->show_all;
+ $self->{columns}->show_all;
+ $self->{imgSizeLabel}->show_all;
+ $self->{imgSizeOption}->show_all;
+ $self->{groupItems}->show_all;
+ $self->{groupByOption}->show_all;
+ $self->{secondarySort}->show_all;
+ $self->{secondarySortOption}->show_all;
+ }
+ else
+ {
+ $self->{resizeImgList}->hide_all;
+ $self->{labelColumns}->hide_all;
+ $self->{columns}->hide_all;
+ $self->{imgSizeLabel}->hide_all;
+ $self->{imgSizeOption}->hide_all;
+ $self->{groupItems}->hide_all;
+ $self->{groupByOption}->hide_all;
+ $self->{secondarySort}->hide_all;
+ $self->{secondarySortOption}->hide_all;
+ }
+ });
+ $imagesStyleExpander->signal_connect('activate' => sub {
+ if (!$imagesStyleExpander->get_expanded)
+ {
+ $self->{useOverlays}->show_all;
+ $self->{listBgPicture}->show_all;
+ $self->{labelStyle}->show_all;
+ $self->{optionStyle}->show_all;
+ $self->{labelBg}->show_all;
+ $self->{buttonBg}->show_all;
+ $self->{labelFg}->show_all;
+ $self->{buttonFg}->show_all;
+ }
+ else
+ {
+ $self->{useOverlays}->hide_all;
+ $self->{listBgPicture}->hide_all;
+ $self->{labelStyle}->hide_all;
+ $self->{optionStyle}->hide_all;
+ $self->{labelBg}->hide_all;
+ $self->{buttonBg}->hide_all;
+ $self->{labelFg}->hide_all;
+ $self->{buttonFg}->hide_all;
+ }
+ });
+
+ $self->show_all;
+ $imagesDisplayExpander->set_expanded(1);
+ $imagesStyleExpander->set_expanded(1);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+
+
+{
+ # Class used to let user select detailed options
+ package GCDetailedOptionsPanel;
+ use base "Gtk2::VBox";
+
+
+ sub initValues
+ {
+ my $self = shift;
+
+ $self->{imgSizeOption}->setValue($self->{optionsManager}->detailImgSize);
+ $self->{groupByOption}->setValue($self->{optionsManager}->groupBy);
+ $self->{secondarySortOption}->setValue($self->{optionsManager}->secondarySort);
+ $self->{groupedFirst}->setValue($self->{optionsManager}->groupedFirst);
+ $self->{addCount}->setValue($self->{optionsManager}->addCount);
+
+ my @tmpFieldsArray = split m/\|/, $self->{optionsManager}->details;
+ $self->{fieldsSelection}->setListFromIds(\@tmpFieldsArray);
+
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+ $self->{optionsManager}->detailImgSize($self->{imgSizeOption}->getValue);
+ $self->{optionsManager}->groupBy($self->{groupByOption}->getValue);
+ $self->{optionsManager}->secondarySort($self->{secondarySortOption}->getValue);
+ $self->{optionsManager}->groupedFirst($self->{groupedFirst}->getValue);
+ $self->{optionsManager}->addCount($self->{addCount}->getValue);
+ my $details = join('|', @{$self->{fieldsSelection}->getSelectedIds});
+ $self->{optionsManager}->details($details);
+ }
+
+ sub hideExtra
+ {
+ my $self = shift;
+
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ my $code = $self->SUPER::show;
+ if ($code eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $optionsManager, $parent, $preIdList) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(0,0);
+
+ $self->{lang} = $parent->{lang};
+ $self->{optionsManager} = $optionsManager;
+
+ bless ($self, $class);
+
+ $self->set_border_width($GCUtils::margin);
+
+ $self->{groupItems} = new GCLabel($self->{lang}->{DetailedOptionsGroupItems});
+ $self->{groupByOption} = new GCFieldSelector(0, undef, 1);
+ $self->{groupByOption}->setModel($parent->{model});
+
+ $self->{secondarySort} = new GCLabel($self->{lang}->{DetailedOptionsSecondarySort});
+ $self->{secondarySortOption} = new GCFieldSelector(0, undef, 1);
+ $self->{secondarySortOption}->setModel($parent->{model});
+
+ $self->{groupedFirst} = new GCCheckBox($self->{lang}->{DetailedOptionsGroupedFirst});
+ $self->{addCount} = new GCCheckBox($self->{lang}->{DetailedOptionsAddCount});
+
+ $self->{imgSizeLabel} = new GCLabel($self->{lang}->{DetailedOptionsImageSize});
+ $self->{imgSizeOption} = new GCMenuList;
+ my %imgSizes = %{$self->{lang}->{ImagesOptionsSizeList}};
+ my @imgValues = map {{value => $_, displayed => $imgSizes{$_}}}
+ (sort keys %imgSizes);
+ $self->{imgSizeOption}->setValues(\@imgValues);
+
+ my $preferencesExpander = new GCExpander($self->{lang}->{OptionsDetailedPreferencesGroup}, 1);
+ $self->pack_start($preferencesExpander, 0, 0, $GCUtils::quarterMargin);
+
+ my $tablePreferences = new Gtk2::Table(4, 5);
+ $tablePreferences->set_col_spacings($GCUtils::margin);
+
+ $tablePreferences->attach($self->{imgSizeLabel}, 2, 3, 1, 2, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{imgSizeOption}, 3, 4, 1, 2, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $tablePreferences->attach($self->{groupItems}, 2, 3, 2, 3, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{groupByOption}, 3, 4, 2, 3, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{secondarySort}, 2, 3, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{secondarySortOption}, 3, 4, 3, 4, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $tablePreferences->attach($self->{groupedFirst}, 2, 4, 4, 5, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+ $tablePreferences->attach($self->{addCount}, 2, 4, 5, 6, 'fill', 'fill', 0, $GCUtils::quarterMargin);
+
+ $preferencesExpander->add($tablePreferences);
+
+ my $fieldsExpander = new GCExpander($self->{lang}->{DetailedOptionsFields}, 1);
+ my @tmpFieldsArray = split m/\|/, $optionsManager->details;
+ $self->{fieldsSelection} = new GCFieldsSelectionWidget($parent, \@tmpFieldsArray, 1);
+
+ $self->pack_start($fieldsExpander, 0, 0, $GCUtils::quarterMargin);
+ $fieldsExpander->add($self->{fieldsSelection});
+ $self->{fieldsSelection}->set_border_width($GCUtils::margin);
+
+ $preferencesExpander->set_expanded(1);
+ $fieldsExpander->set_expanded(1);
+
+ $self->show_all;
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCItemsLists/GCTextLists.pm b/lib/gcstar/GCItemsLists/GCTextLists.pm
new file mode 100644
index 0000000..aaa080b
--- /dev/null
+++ b/lib/gcstar/GCItemsLists/GCTextLists.pm
@@ -0,0 +1,2101 @@
+package GCTextLists;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# This file handle the left list part, in text Mode and Detailed Mode
+#
+
+use strict;
+use locale;
+
+{
+ package GCBaseTextList;
+ use base "Gtk2::ScrolledWindow";
+ use GCUtils;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new;
+ bless ($self, $class);
+ $self->{parent} = $parent;
+ $self->{preferences} = $parent->{model}->{preferences};
+ $self->{preferences}->sortOrder(1)
+ if ! $self->{preferences}->exists('sortOrder');
+ $self->{count} = 0;
+ return $self;
+ }
+
+ sub getNbItems
+ {
+ my $self = shift;
+ return $self->{count};
+ }
+
+ sub convertIterToChildIter
+ {
+ my ($self, $iter) = @_;
+ my $result = $self->{completeModel}->convert_iter_to_child_iter($iter);
+ $result = $self->{subModel}->convert_iter_to_child_iter($result);
+ return $result;
+ }
+
+ sub convertChildIterToIter
+ {
+ my ($self, $iter) = @_;
+ my $result = $iter;
+ $result = $self->{subModel}->convert_child_iter_to_iter($result);
+ $result = $self->{completeModel}->convert_child_iter_to_iter($result);
+ return $result;
+ }
+
+ sub convertIterToString
+ {
+ my ($self, $iter) = @_;
+ return '' if ! $iter;
+
+ return $self->{completeModel}->get_string_from_iter($iter);
+ }
+
+ sub convertIdxToIter
+ {
+ my ($self, $idx) = @_;
+ $self->{completeModel}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if (($self->convertIterToIdx($iter) == $idx)
+ && (!$model->iter_n_children($iter)))
+ {
+ $self->{currentIterString} = $model->get_path($iter)->to_string;
+ return 1;
+ }
+ return 0;
+ });
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ $self->{list}->get_selection->select_all;
+ }
+
+ sub selectIter
+ {
+ my ($self, $iter, $deactivateUpdate) = @_;
+ $self->{deactivateUpdate} = $deactivateUpdate;
+ $self->{list}->get_selection->unselect_all;
+ $self->{list}->get_selection->select_iter($iter);
+ $self->{deactivateUpdate} = 0;
+ }
+
+ sub getCurrentIter
+ {
+ my $self = shift;
+ my $iter = undef;
+ #my $iter = $self->{list}->get_selection->get_selected;
+ my @rows = $self->{list}->get_selection->get_selected_rows;
+ $iter = $self->{list}->get_model->get_iter($rows[0]) if $rows[0];
+ return $iter;
+ }
+
+ sub getCurrentItems
+ {
+ my $self = shift;
+ my @indexes;
+ my @iterators;
+ my @rows = $self->{list}->get_selection->get_selected_rows;
+ foreach (@rows)
+ {
+ my $iter = $self->{list}->get_model->get_iter($_);
+ push @iterators, $iter;
+ push @indexes, $self->convertIterToIdx($iter);
+ }
+ @indexes = sort @indexes;
+ return (\@indexes, \@iterators) if wantarray;
+ return \@indexes;
+ }
+
+ sub getCurrentIterFromString
+ {
+ my $self = shift;
+ return ($self->{currentIterString})
+ ? $self->{completeModel}->get_iter_from_string($self->{currentIterString})
+ : $self->{completeModel}->get_iter_first;
+ }
+
+ sub removeCurrentItems
+ {
+ my ($self) = @_;
+ my ($indexes, $iterators) = $self->getCurrentItems;
+
+ $self->{deactivateSortCache} = 1;
+
+ my ($nextIter, $newIdx) = $self->getNextIter($iterators->[-1], $indexes);
+ my $realIter = $self->convertIterToChildIter($nextIter);
+ my $nextPath = $self->{model}->get_path($realIter)->to_string;
+
+ my $count = scalar @$indexes;
+
+ $self->{count} -= $count;
+ $self->{nextItemIdx} -= $count;
+
+ $self->{list}->expand_to_path($self->{completeModel}->get_path($nextIter))
+ if $self->{currentIterString} =~ /:/;
+ $self->selectIter($nextIter)
+ if ($nextIter);
+
+ my @toBeRemoved;
+ my %pathToChange;
+ foreach my $number(@$indexes)
+ {
+ #Shift backward all following items.
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ return 0 if $model->iter_has_child($iter);
+ my $currentIdx = ($model->get($iter))[$self->{idxColumn}];
+ if ($currentIdx > $number)
+ {
+ $pathToChange{$path->to_string}++;
+ }
+ elsif ($currentIdx == $number)
+ {
+ # We store them for future removal
+ push @toBeRemoved, new Gtk2::TreeRowReference($model, $path);
+ }
+ return 0;
+ });
+ }
+
+ # Perform the actual shift
+ my $offset = 0;
+ foreach my $path(keys %pathToChange)
+ {
+ my $iter = $self->{model}->get_iter(Gtk2::TreePath->new($path));
+ my $currentIdx = ($self->{model}->get($iter))[$self->{idxColumn}];
+ $self->{model}->set($iter, $self->{idxColumn}, ($currentIdx - $pathToChange{$path}));
+ if ($nextPath eq $path)
+ {
+ $newIdx = $currentIdx - $pathToChange{$path};
+ }
+ $offset++;
+ }
+
+ # Update caches
+ $self->{sorter}->clear_cache;
+ $self->{testCache} = [];
+
+ # Removing all the instances
+ foreach(@toBeRemoved)
+ {
+ $self->removeFromModel($self->{model}->get_iter($_->get_path));
+ }
+
+ $self->{deactivateSortCache} = 0;
+
+ return $newIdx;
+ }
+
+ sub changeItem
+ {
+ # Apply the changes from $previous to $new to the listView entry $idx
+ # Return the $idx of the new current item ($previous can now be hidden)
+ my ($self, $idx, $previous, $new) = @_;
+ $self->convertIdxToIter($idx);
+ return $self->changeCurrent($previous, $new, $idx, 0);
+ }
+
+ sub updateMenus
+ {
+ # Update menu items to reflect number of items selected
+ my ($self, $nbSelected) = @_;
+
+ my $menu = $self->{parent}->{menubar};
+ my @updateList;
+ if ($nbSelected > 1)
+ {
+ @updateList = (
+ [$menu, 'duplicateItem', 'MenuDuplicatePlural'],
+ [$menu, 'deleteCurrentItem', 'MenuEditDeleteCurrentPlural'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicatePlural'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrentPlural'],
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindowPlural'],
+ );
+ }
+ else
+ {
+ @updateList = (
+ [$menu, 'duplicateItem', 'MenuDuplicate'],
+ [$menu, 'deleteCurrentItem', 'MenuEditDeleteCurrent'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicate'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrent'],
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindow'],
+ );
+ }
+ foreach (@updateList)
+ {
+ $menu->updateItem($_->[0]->{$_->[1]}, $_->[2]);
+ }
+ }
+
+}
+
+{
+ package GCTextList;
+
+ use Gtk2::SimpleList;
+ use GCUtils;
+ use base 'GCBaseTextList';
+
+ sub new
+ {
+ my ($proto, $parent, $title) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->{titleField} = $parent->{model}->{commonFields}->{title};
+ $self->{idxColumn} = 1;
+ $self->{orderSet} = 0;
+
+ $self->set_policy ('automatic', 'automatic');
+ $self->set_shadow_type('none');
+
+ my $columnType = ($parent->{model}->{fieldsInfo}->{$self->{titleField}}->{type} eq 'number') ?
+ 'Glib::Int' :
+ 'Glib::String';
+ my $column = Gtk2::TreeViewColumn->new_with_attributes($title, Gtk2::CellRendererText->new,
+ 'text' => 0);
+ $column->set_resizable(1);
+ $column->set_reorderable(1);
+ $column->set_sort_column_id(0);
+ # Columns are: Title, Index, isVisible
+ $self->{model} = new Gtk2::TreeStore($columnType, 'Glib::Int', 'Glib::Boolean');
+ $self->{filter} = new Gtk2::TreeModelFilter($self->{model});
+ $self->{filter}->set_visible_column(2);
+ {
+ package GCSimpleTreeModelSort;
+ use Glib::Object::Subclass
+ Gtk2::TreeModelSort::,
+ interfaces => [ 'Gtk2::TreeDragDest' ],
+ ;
+
+ sub new
+ {
+ my ($proto, $childModel) = @_;
+ my $class = ref($proto) || $proto;
+ return Glib::Object::new ($class, model => $childModel);
+ }
+ }
+ $self->{sorter} = new GCSimpleTreeModelSort($self->{filter});
+ $self->{subModel} = $self->{filter};
+ $self->{completeModel} = $self->{sorter};
+ $self->{list} = Gtk2::TreeView->new_with_model($self->{sorter});
+ $self->{list}->append_column($column);
+ $self->{list}->set_headers_clickable(1);
+ $self->{list}->set_rules_hint(1);
+ $self->{list}->set_name('GCItemsTextList');
+ $self->{list}->get_selection->set_mode ('multiple');
+ if ($parent->{model}->{fieldsInfo}->{$self->{titleField}}->{type} ne 'number')
+ {
+ $self->{sorter}->set_sort_func(0,
+ \&sortCaseInsensitive,
+ $self);
+ }
+
+ $self->{list}->get_selection->signal_connect ('changed' => sub {
+ return if $self->{deactivateUpdate};
+ my @indexes;
+ my $nbSelected;
+ $self->{list}->get_selection->selected_foreach(sub {
+ my ($model, $path, $iter, $self) = @_;
+ push @indexes, $self->{completeModel}->get_value($iter, 1);
+ $nbSelected++;
+ }, $self);
+ return if scalar @indexes == 0;
+ $parent->display(@indexes);
+ my $iter = $self->getCurrentIter;
+ $self->{currentIterString} = $self->convertIterToString($iter);
+
+ # Update menus to reflect number of items selected
+ $self->updateMenus($nbSelected);
+ });
+
+ $self->{list}->signal_connect ('row-activated' => sub {
+ $parent->displayInWindow;
+ });
+ $self->{list}->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+
+ # Check if row clicked on is in the current selection
+ my ($path, $column, $cell_x, $cell_y) = $widget->get_path_at_pos( $event->x, $event->y );
+ my $selection = $widget->get_selection;
+ my @rows = $selection->get_selected_rows;
+ my $clickedOnSelection = 0;
+ # Loop through selection to see if current row is selected
+ foreach my $row(@rows)
+ {
+ if ($row->to_string eq $path->to_string)
+ {
+ $clickedOnSelection = 1;
+ }
+ }
+
+ # Popup the menu
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $event->button, $event->time);
+
+ # If row clicked on was in the selection, return true, else return false to clear selection
+ # to clicked on item
+ if ($clickedOnSelection)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ $self->{list}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ $self->{parent}->deleteCurrentItem;
+ return 1;
+ }
+ return 0;
+ });
+
+ $self->add($self->{list});
+ $self->show_all;
+ $self->{currentIdx} = 0;
+
+ return $self;
+ }
+
+ sub savePreferences
+ {
+ my ($self, $preferences) = @_;
+ return if !$self->{orderSet};
+ my ($fieldId, $order) = $self->{sorter}->get_sort_column_id;
+ $preferences->sortField($self->{titleField});
+ $preferences->sortOrder(($order eq 'ascending') ? 1 : 0);
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return 0;
+ }
+
+ sub convertIterToIdx
+ {
+ my ($self, $iter) = @_;
+ return 0 if ! $iter;
+ return $self->{completeModel}->get_value($iter, 1)
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ my $currentIter = $self->getCurrentIter;
+ return $self->{completeModel}->get_value(
+ $self->getCurrentIter, 1
+ )
+ if $currentIter;
+ return 0;
+ }
+
+ sub isUsingDate
+ {
+ my ($self) = @_;
+ return 0;
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order, $splash, $willFilter) = @_;
+ $self->{orderSet} = 1;
+ my $progressNeeded = ($splash && !$willFilter);
+ my $step;
+ if ($progressNeeded)
+ {
+ $step = GCUtils::round($self->{count} / 7);
+ $splash->setProgressForItemsSort(2*$step);
+ }
+ $self->{sorter}->set_sort_column_id(0,
+ $self->{preferences}->sortOrder ? 'ascending' : 'descending');
+ $self->{sorter}->set_default_sort_func(undef, undef);
+ $splash->setProgressForItemsSort(4*$step) if $progressNeeded;
+ }
+
+ sub sortCaseInsensitive
+ {
+ my ($childModel, $iter1, $iter2, $self) = @_;
+
+ if ($self->{deactivateSortCache})
+ {
+ my $val1 = uc($childModel->get_value($iter1, 0));
+ my $val2 = uc($childModel->get_value($iter2, 0));
+ # Use a natural string sort method
+ return (GCUtils::gccmp($val1, $val2));
+ }
+ else
+ {
+ my $idx1 = $childModel->get_value($iter1, 1);
+ my $idx2 = $childModel->get_value($iter2, 1);
+ my $val1 = uc($childModel->get_value($iter1, 0));
+ my $val2 = uc($childModel->get_value($iter2, 0));
+ # Use a natural string sort method
+ return (GCUtils::gccmp($val1, $val2));
+ }
+ }
+
+ sub testIter
+ {
+ my ($self, $filter, $items, $iter) = @_;
+ my $idx = ($self->{model}->get($iter))[1];
+ my $displayed;
+ if (defined $self->{testCache}->[$idx])
+ {
+ $displayed = $self->{testCache}->[$idx];
+ }
+ else
+ {
+ $displayed = $self->{testCache}->[$idx] = $filter->test($items->[$idx]);
+ # We increment only here to count only unique items
+ $self->{count}++ if $displayed;
+ }
+ $self->{model}->set($iter,
+ 2,
+ $displayed
+ );
+ return $displayed;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ $self->{count} = 0;
+ $self->{testCache} = [];
+ $self->{tester} = $filter;
+ my $iter = $self->{model}->get_iter_first;
+ my $idx = 0;
+ $self->{model}->foreach(sub {
+ $splash->setProgressForItemsSort($idx++) if $splash;
+ my ($model, $path, $iter) = @_;
+ GCTextList::testIter($self, $filter, $items, $iter);
+ return 0;
+ });
+ $self->{filter}->refilter;
+
+ my $currentIter = $self->getCurrentIter;
+ return $self->{completeModel}->get_value($currentIter, 1)
+ if $currentIter;
+ if ($self->{completeModel}->get_iter_first)
+ {
+ my $idx = $self->{completeModel}->get_value($self->{completeModel}->get_iter_first, 1);
+ $self->select($idx);
+ return $idx;
+ }
+ else
+ {
+ return 0;
+ }
+
+ }
+
+ sub clearCache
+ {
+ my $self = shift;
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ $self->{list}->set_model(undef);
+ $self->{model}->clear;
+ $self->{currentIdx} = 0;
+ $self->{nextItemIdx} = -1;
+ }
+
+ sub done
+ {
+ my $self = shift;
+ $self->{list}->set_model($self->{sorter});
+ }
+
+ sub getNextIter
+ {
+ my ($self, $viewedIter) = @_;
+ my $nextIter = $self->{completeModel}->iter_next($viewedIter);
+ # If we removed the last one, we are using the previous one.
+ $nextIter = $self->{completeModel}->iter_nth_child(undef, $self->{count} - 1)
+ if !$nextIter && ($self->{count} > 0);
+ my $newIdx = 0;
+ if ($nextIter)
+ {
+ $newIdx = $self->{completeModel}->get_value($nextIter, 1);
+ #$self->selectIter($nextIter);
+ }
+ return ($nextIter, $newIdx);
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate) = @_;
+ $self->{nextItemIdx}++;
+ $self->{count}++;
+ my @data = (
+ 0 => $self->{parent}->transformTitle($info->{$self->{titleField}}),
+ 1 => $self->{nextItemIdx},
+ 2 => 1
+ );
+ $self->{model}->set($self->{model}->append(undef), @data);
+ }
+
+ sub removeFromModel
+ {
+ my ($self, $iter) = @_;
+ $self->{model}->remove($iter);
+ }
+
+ sub removeItem
+ {
+ my ($self, $number) = @_;
+ splice @{$self->{testCache}}, $number, 1;
+ #Shift backward all following items.
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ my $currentIdx = $model->get_value($iter,1);
+ if ($currentIdx >= $number)
+ {
+ $model->set($iter, 1, $currentIdx - 1)
+ if $currentIdx != $number;
+ }
+ return 0;
+ });
+
+ $self->{count}--;
+ $self->{nextItemIdx}--;
+ my $viewedCurrentIter = $self->getCurrentIter;
+ my $currentIter = $self->convertIterToChildIter($viewedCurrentIter);
+ my $newIdx = $self->selectNextIter($viewedCurrentIter);
+ $self->{model}->remove($currentIter);
+ return $newIdx;
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init) = @_;
+ if ($idx == -1)
+ {
+ $self->{currentIterString} = '0';
+ my $currentIter = $self->{completeModel}->get_iter_first;
+ if (!$currentIter)
+ {
+ $idx = 0;
+ return;
+ }
+ $idx = $self->{completeModel}->get_value($currentIter, 1);
+ $self->selectIter($currentIter);
+ }
+ else
+ {
+ $self->{currentIterString} = '0' if ! $self->{currentIterString};
+ $self->{completeModel}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if ($model->get_value($iter, 1) == $idx)
+ {
+ $self->{currentIterString} = $model->get_path($iter)->to_string;
+ $self->selectIter($iter);
+ return 1;
+ }
+ return 0;
+ });
+ }
+ return $idx;
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+
+ my $path = $self->{list}->get_selection->get_selected_rows;
+ $self->{list}->scroll_to_cell($path) if $path;
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ my $selected = $self->getCurrentIterFromString;;
+ return if ! $selected;
+ my $currentIter = $self->convertIterToChildIter($selected);
+ my $newValue = $self->{parent}->transformTitle($new->{$self->{titleField}});
+ my $newIdx = $idx;
+ my $visible = $self->{tester} ? $self->{tester}->test($new) : 1;
+
+ if (!$visible)
+ {
+ my $nextIter;
+ ($nextIter, $newIdx) = $self->getNextIter($selected);
+ $self->selectIter($nextIter, 1) if $nextIter && $wantSelect;
+ $self->{count}--;
+ }
+ $self->{model}->set($currentIter, 0, $newValue);
+ # Update the isVisible field
+ $self->{model}->set($currentIter, 2, $visible);
+
+ my $iter = $self->getCurrentIter;
+ $self->{currentIterString} = $self->convertIterToString($iter);
+ return $newIdx;
+ }
+
+}
+
+{
+ package GCDetailedList;
+
+ use File::Basename;
+ use base 'GCBaseTextList';
+ use GCUtils;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent);
+ bless ($self, $class);
+
+ $self->{multi} = 1;
+ $self->{orderSet} = 0;
+ $self->{groupItems} = 0;
+ $self->{isUsingDate} = 0;
+ $self->{titleField} = $parent->{model}->{commonFields}->{title};
+
+ $self->{imgWidth} = 60;
+ $self->{imgHeight} = 80;
+
+ # Setting default options if they don't exist
+ $self->{preferences}->detailImgSize(2) if ! $self->{preferences}->exists('detailImgSize');
+ $self->{preferences}->details($self->{titleField})
+ if ! $self->{preferences}->details;
+ $self->{preferences}->groupedFirst(1)
+ if ! $self->{preferences}->exists('groupedFirst');
+ $self->{preferences}->addCount(0)
+ if ! $self->{preferences}->exists('addCount');
+
+ # Image size
+ my $size = $self->{preferences}->detailImgSize;
+ $self->{factor} = ($size == 0) ? 0.5
+ : ($size == 1) ? 0.8
+ : ($size == 3) ? 1.5
+ : ($size == 4) ? 2
+ : 1;
+ $self->{imgWidth} *= $self->{factor};
+ $self->{imgHeight} *= $self->{factor};
+
+ $self->clearCache;
+
+ $self->set_policy ('automatic', 'automatic');
+ $self->set_shadow_type('none');
+
+ my @tmpArray = split m/\|/, $self->{preferences}->details;
+ $self->{fieldsArray} = \@tmpArray;
+
+ $self->{imageIndex} = -1;
+ my @columnsType;
+ $self->{columnsArray} = [];
+ $self->{columns} = {};
+ my $col = 0;
+
+ $self->{borrowerField} = $parent->{model}->{commonFields}->{borrower}->{name};
+
+ $self->setGroupingInformation;
+ # We don't need count if not grouped
+ $self->{addCount} = $self->{groupItems} && $self->{preferences}->addCount;
+
+ $self->{secondaryField} = $self->{preferences}->secondarySort;
+ $self->{secondaryIndex} = -1;
+ $self->{addSecondary} = 0;
+
+ foreach my $field(@tmpArray)
+ {
+ my $title = $parent->{model}->{fieldsInfo}->{$field}->{displayed};
+
+ my $renderer;
+ my $attribute;
+ if ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ push @columnsType, 'Gtk2::Gdk::Pixbuf';
+ $renderer = Gtk2::CellRendererPixbuf->new;
+ $attribute = 'pixbuf';
+ $self->{imageIndex} = $col;
+ }
+ elsif ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'yesno')
+ {
+ push @columnsType, 'Glib::Boolean';
+ $renderer = Gtk2::CellRendererToggle->new;
+ $attribute = 'active';
+ }
+ elsif ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'number')
+ {
+ push @columnsType, 'Glib::Double';
+ $renderer = Gtk2::CellRendererText->new;
+ $attribute = 'text';
+ }
+ else
+ {
+ $self->{isUsingDate} = 1
+ if $parent->{model}->{fieldsInfo}->{$field}->{type} eq 'date';
+ push @columnsType, 'Glib::String';
+ $renderer = Gtk2::CellRendererText->new;
+ $attribute = 'text';
+ }
+ $self->{secondaryIndex} = $col if $field eq $self->{secondaryField};
+ $self->{columns}->{$field} = Gtk2::TreeViewColumn->new_with_attributes($title, $renderer,
+ ($attribute) ? ($attribute => $col) : ());
+ if ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'number')
+ {
+ $self->{columns}->{$field}->set_cell_data_func($renderer, sub {
+ my ($column, $cell, $model, $iter, $colNum) = @_;
+ my $value = $model->get_value($iter, $colNum);
+ # TODO - not returning correct value when first column is a number
+ # and a grouping field is set.
+ # Remove trailing 0
+ $value =~ s/\.[0-9]*?0+$//;
+ $cell->set_property('text', $value);
+ }, $col);
+ }
+
+ # We store the field name in it to ease the save of the column order in preferences
+ $self->{columns}->{$field}->{field} = $field;
+ $self->{columns}->{$field}->set_resizable(1);
+ $self->{columns}->{$field}->set_reorderable(1);
+ if ($parent->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ $self->{columns}->{$field}->set_clickable(0);
+ }
+ else
+ {
+ $self->{columns}->{$field}->set_sort_column_id($col);
+ }
+ push @{$self->{columnsArray}}, $self->{columns}->{$field};
+ $self->{fieldToId}->{$field} = $col;
+ $col++;
+ }
+ push @columnsType, 'Glib::Int';
+ $self->{idxColumn} = $col;
+ push @columnsType, 'Glib::Boolean';
+ $self->{visibleCol} = ++$col;
+
+ # There is a secondary field for sort, but we didn't add it yet
+ if ($self->{secondaryField} && ($self->{secondaryIndex} == -1))
+ {
+ push @columnsType, 'Glib::String';
+ $self->{addSecondary} = 1;
+ $self->{secondaryIndex} = ++$col;
+ }
+
+ $self->{model} = new Gtk2::TreeStore(@columnsType);
+ {
+ package GCTreeModelSort;
+ use Glib::Object::Subclass
+ Gtk2::TreeModelSort::,
+ interfaces => [ Gtk2::TreeDragDest:: ],
+ ;
+
+ sub new
+ {
+ my ($proto, $childModel) = @_;
+ my $class = ref($proto) || $proto;
+ return Glib::Object::new ($class, model => $childModel);
+ }
+ }
+
+ $self->{filter} = new Gtk2::TreeModelFilter($self->{model});
+ $self->{sorter} = new GCTreeModelSort($self->{filter});
+
+ $self->{filter}->set_visible_column($self->{visibleCol});
+
+ $self->{subModel} = $self->{filter};
+ $self->{completeModel} = $self->{sorter};
+
+ $self->{list} = Gtk2::TreeView->new_with_model($self->{completeModel});
+ $self->{list}->append_column($_) foreach (@{$self->{columnsArray}});
+
+ $self->{list}->set_name('GCItemsDetailsList');
+ $self->{list}->set_headers_clickable(1);
+ $self->{list}->set_rules_hint(1);
+ $self->{list}->set_reorderable(1);
+
+ # Restore size of columns
+ if ($self->{preferences}->exists('columnsWidths'))
+ {
+ my $i = 0;
+ my @widths = split /\|/, $self->{preferences}->columnsWidths;
+ #/ For syntax highlighting
+ foreach (@{$self->{columnsArray}})
+ {
+ $_->set_sizing('fixed');
+ $_->set_resizable(1);
+ $_->set_fixed_width($widths[$i] || 70);
+ $i++;
+ }
+ }
+
+ # Use grouping field for generated masters, or if that field isn't displayed,
+ # fallback on title, or first column
+ if (exists $self->{columns}->{$self->{collectionField}})
+ {
+ $self->{generatedField} = $self->{collectionField};
+ }
+ elsif (exists $self->{columns}->{$self->{titleField}})
+ {
+ $self->{generatedField} = $self->{titleField};
+ }
+ else
+ {
+ $self->{generatedField} = $tmpArray[0];
+ }
+ $self->{generatedIndex} = $self->{fieldToId}->{$self->{generatedField}};
+ $self->{list}->set_expander_column($self->{columns}->{$self->{generatedField}});
+
+ if (exists $self->{columns}->{$self->{titleField}})
+ {
+ $self->{searchField} = $self->{titleField};
+ }
+ else
+ {
+ $self->{searchField} = $tmpArray[0];
+ }
+ $self->{searchIndex} = $self->{fieldToId}->{$self->{searchField}};
+ $self->{list}->set_search_column($self->{searchIndex});
+
+ $self->{sorter}->signal_connect('rows-reordered' => sub {
+ my ($fieldId, $order) = $self->{sorter}->get_sort_column_id;
+ $self->{list}->set_search_column($fieldId);
+ });
+
+ # Initializing sort methods
+ my $colIdx = 0;
+ #my $secondarySort = 1;
+ my $sorttype = "";
+ foreach my $field(@tmpArray)
+ {
+ my ($secondaryIndex, $secondaryField) = ($self->{secondaryIndex}==-1)
+ ? ($colIdx, $field)
+ : ($self->{secondaryIndex}, $self->{secondaryField});
+ my $data = [$self, $colIdx, $secondaryIndex];
+ foreach my $sorter($field, $secondaryField)
+ {
+ next if !$sorter;
+ # Work out how to sort the column
+ if ((!exists $self->{columns}->{$self->{collectionField}}) &&
+ ($self->{groupItems}) &&
+ ($sorter eq $self->{generatedField}))
+ {
+ # The grouping field isn't visible, so we need to set
+ # the sort order on the column we're using for the group
+ # headers to be sorted using the grouping field type
+ if (($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{type} eq 'date') ||
+ ($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{sorttype} eq 'date'))
+ {
+ $sorttype = "date";
+ }
+ elsif (($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{type} eq 'number') ||
+ ($parent->{model}->{fieldsInfo}->{$self->{collectionField}}->{sorttype} eq 'number'))
+ {
+ $sorttype = "number";
+ }
+ else
+ {
+ $sorttype = "text";
+ }
+ }
+ elsif (($parent->{model}->{fieldsInfo}->{$sorter}->{type} eq 'number') ||
+ ($parent->{model}->{fieldsInfo}->{$sorter}->{sorttype} eq 'number'))
+ {
+ $sorttype = "number";
+ }
+ elsif (($parent->{model}->{fieldsInfo}->{$sorter}->{type} eq 'date') ||
+ ($parent->{model}->{fieldsInfo}->{$sorter}->{sorttype} eq 'date'))
+ {
+ $sorttype = "date";
+ }
+ else
+ {
+ $sorttype = "text";
+ }
+
+ # Set the column for the desired type of sorting
+ if ($sorttype eq "number")
+ {
+ # Small trick to convert number as follows with a letter
+ # in front of them so cmp will work as expected
+ # e.g.: 3 -> b3; 42 -> c42; 56 -> c56; 5897446 -> h5897446
+ # This could not work if your system uses a character encoding
+ # which is not contiguous as EBCDIC
+ push @$data, sub {return chr(length($_[0]*1000)+ord('a')).($_[0]*1000)};
+ }
+ elsif ($sorttype eq "date")
+ {
+ push @$data, \&GCPreProcess::reverseDate;
+ }
+ else
+ {
+ #push @$data, \&uc;
+ push @$data, sub {return uc $_[0]};
+ }
+ }
+ if ($self->{groupItems} && ($self->{preferences}->groupedFirst))
+ {
+ $self->{sorter}->set_sort_func($colIdx,
+ \&sortWithParentFirst,
+ $data);
+ }
+ else
+ {
+ $self->{sorter}->set_sort_func($colIdx,
+ \&sortAll,
+ $data);
+ }
+ $colIdx++;
+ }
+ $self->{list}->get_selection->set_mode ('multiple');
+
+ $self->{list}->get_selection->signal_connect('changed' => \&onSelectionChanged,
+ $self);
+
+# $self->{list}->get_selection->set_select_function(sub {
+# my ($selection, $model, $path) = @_;
+# return !$model->iter_has_child($model->get_iter($path));
+# });
+
+ $self->{list}->signal_connect ('row-activated' => sub {
+ $parent->displayInWindow;
+ });
+
+ $self->add($self->{list});
+
+ $self->{list}->signal_connect('button_press_event' => sub {
+ my ($widget, $event) = @_;
+ return 0 if $event->button ne 3;
+
+ # Check if row clicked on is in the current selection
+ my ($path, $column, $cell_x, $cell_y) = $widget->get_path_at_pos( $event->x, $event->y );
+ my $selection = $widget->get_selection;
+ my @rows = $selection->get_selected_rows;
+ my $clickedOnSelection = 0;
+ # Loop through selection to see if current row is selected
+ foreach my $row(@rows)
+ {
+ if ($row->to_string eq $path->to_string)
+ {
+ $clickedOnSelection = 1;
+ }
+ }
+
+ # Popup the menu
+ $self->{parent}->{context}->popup(undef, undef, undef, undef, $event->button, $event->time);
+
+ # If row clicked on was in the selection, return true, else return false to clear selection
+ # to clicked on item
+ if ($clickedOnSelection)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ $self->{list}->signal_connect('key-press-event' => sub {
+ my ($treeview, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Delete')
+ {
+ return 1 if !$self->{count};
+ return 1 if !$self->getCurrentIter;
+ return 1 if $self->{completeModel}->iter_has_child(
+ $self->getCurrentIter
+ );
+ $self->{parent}->deleteCurrentItem;
+ return 1;
+ }
+ return 0;
+ });
+
+ if ($self->{groupItems})
+ {
+ my $targetEntryMove = {
+ target => 'MY_ROW_TARGET',
+ flags => ['same-widget'],
+ info => 42,
+ };
+
+ $self->{list}->enable_model_drag_source('button1-mask','move', $targetEntryMove);
+ $self->{list}->enable_model_drag_dest('move', $targetEntryMove);
+
+ $self->{list}->signal_connect('drag_data_get' => sub {
+ return 1;
+ });
+
+ $self->{list}->signal_connect('drag_data_received' => \&dropHandler, $self);
+ }
+ else
+ {
+ $self->{list}->unset_rows_drag_dest;
+ $self->{list}->unset_rows_drag_source;
+ }
+
+ $self->reset;
+
+ $self->show_all;
+ return $self;
+ }
+
+ sub destroy
+ {
+ my $self = shift;
+ # Unlock panel if we locked it when displaying a category
+ $self->{parent}->{panel}->lock(0);
+ $self->SUPER::destroy;
+ }
+
+ sub onSelectionChanged
+ {
+ my ($selection, $self) = @_;
+ return if $self->{deactivateUpdate};
+ my @indexes;
+ my $nbSelected;
+ $self->{list}->get_selection->selected_foreach(sub {
+ my ($model, $path, $iter, $self) = @_;
+ push @indexes, $self->convertIterToIdx($iter);
+ $nbSelected++;
+ }, $self);
+ return if scalar @indexes == 0;
+ my $iter = $self->getCurrentIter;
+ $self->{selectedIterString} = $self->convertIterToString($iter);
+ $self->{currentRemoved} = 0;
+ $self->{parent}->display(@indexes);
+ $self->{currentIterString} = $self->{selectedIterString}
+ if !$self->{currentRemoved};
+ $self->checkLock;
+
+ # Update menu items to reflect number of items selected
+ $self->updateMenus($nbSelected);
+
+ }
+
+ sub savePreferences
+ {
+ my ($self, $preferences) = @_;
+
+ # Save the columns order and their sizes as pipe separated lists
+ my $details = '';
+ my $widths = '';
+ foreach my $col($self->{list}->get_columns)
+ {
+ $details .= $col->{field}.'|';
+ $widths .= $col->get_width.'|';
+ }
+ $preferences->details($details);
+ $preferences->columnsWidths($widths);
+
+ # We return here if the order has not been set previously
+ return if !$self->{orderSet};
+ my ($fieldId, $order) = $self->{sorter}->get_sort_column_id;
+ $preferences->sortField($self->{fieldsArray}->[$fieldId]);
+ $preferences->sortOrder(($order eq 'ascending') ? 1 : 0);
+
+ }
+
+ sub couldExpandAll
+ {
+ my $self = shift;
+
+ return 1;
+ }
+
+ sub expandAll
+ {
+ my $self = shift;
+
+ $self->{list}->expand_all;
+ }
+
+ sub collapseAll
+ {
+ my $self = shift;
+
+ $self->{list}->collapse_all;
+ }
+
+ sub setGroupingInformation
+ {
+ my $self = shift;
+ $self->{collectionField} = $self->{preferences}->groupBy;
+ $self->{groupItems} = ($self->{collectionField} ne '');
+ }
+
+ sub sortAll
+ {
+ my ($childModel, @iter, $data);
+ ($childModel, $iter[0], $iter[1], $data) = @_;
+ my ($self, $colId1, $colId2, $converter1, $converter2) = @$data;
+
+ my @val;
+ my $colId;
+ my $converter;
+ foreach my $i(0..1)
+ {
+ ($colId, $converter) = ($childModel->iter_parent($iter[$i]))
+ ? ($colId2, $converter2)
+ : ($colId1, $converter1);
+ push @val, $converter->($childModel->get_value($iter[$i], $colId));
+ }
+ return (GCUtils::gccmp($val[0], $val[1]));
+ }
+
+ sub sortWithParentFirst
+ {
+ my ($childModel, $iter1, $iter2, $data) = @_;
+ my ($self, $colId1, $colId2, $converter1, $converter2) = @$data;
+
+ my $hasChildren1 = $childModel->iter_has_child($iter1);
+ my $hasChildren2 = $childModel->iter_has_child($iter2);
+
+ my $colId;
+ my $converter;
+ if ($hasChildren1 == $hasChildren2)
+ {
+ ($colId, $converter) = ($childModel->iter_parent($iter1))
+ ? ($colId2, $converter2)
+ : ($colId1, $converter1);
+
+ # FIXME If we don't copy the value first, it will crash on win32 systems
+ # with an iterator not matching model
+ my $val1 = $converter->($childModel->get_value($iter1, $colId));
+ my $val2 = $converter->($childModel->get_value($iter2, $colId));
+ return (GCUtils::gccmp($val1, $val2));
+ }
+ else
+ {
+ return ($hasChildren1 ? -1 : 1);
+ }
+ }
+
+ sub dropHandler
+ {
+ my ($treeview, $context, $widget_x, $widget_y, $data, $info, $time, $self) = @_;
+ my $source = $context->get_source_widget;
+ return if ($source ne $treeview);
+ my $model = $treeview->get_model;
+ my ($targetPath, $targetPos) = $treeview->get_dest_row_at_pos($widget_x, $widget_y);
+ if ($targetPath)
+ {
+ my $targetIter = $model->get_iter($targetPath);
+ #my $origIter = $treeview->get_selection->get_selected;
+
+ # Deactivate DnD for multiple selection
+ my @rows = $self->{list}->get_selection->get_selected_rows;
+ if (scalar(@rows) > 1)
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+
+ my $origIter = $self->getCurrentIter;
+ if ($model->iter_has_child($origIter)) # We can't move a master
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+
+ my $origIdx = $self->convertIterToIdx($origIter);
+ my $origCollection = '';
+ my $origParentIter = $model->iter_parent($origIter);
+ my ($origParentPath, $origParentChildIter);
+ if ($origParentIter)
+ {
+ $origParentChildIter = $self->convertIterToChildIter($origParentIter);
+ $origParentPath = $self->{model}->get_path($origParentChildIter)
+ if ($self->{addCount});
+ }
+ $origCollection = $self->getIterCollection($origParentChildIter)
+ if $origParentChildIter;
+ #We cannot drop an item on itself
+ if ($targetIter == $origIter)
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+ my @origData;
+ my $i = 0;
+ foreach ($model->get_value($origIter))
+ {
+ push @origData, $i, $_;
+ $i++;
+ }
+ my $collectionIter = $model->iter_parent($targetIter);
+ #if ($collectionIter)
+ my $collection = $collectionIter
+ ? $self->getIterCollection($self->convertIterToChildIter($collectionIter))
+ : $self->getIterCollection($self->convertIterToChildIter($targetIter));
+
+ my $newIter;
+ my $refreshCountNeeded = 0;
+ if ($targetPos =~ /^into/)
+ {
+ if (
+ (!$model->iter_has_child($targetIter)) # We can't drop on a single item
+ || ($targetPath->get_depth > 1) # We can't add an item to an item in a collection.
+ || ($model->iter_has_child($origIter)) # We can't move a master
+ )
+ {
+ $context->finish(1,0,$time);
+ return;
+ }
+ else
+ {
+ #Creating a new collection item
+ $newIter = $self->{model}->append($self->convertIterToChildIter($targetIter));
+ $refreshCountNeeded = 1;
+ }
+ }
+ else
+ {
+ my $origPath = $model->get_path($origIter);
+ if ($targetPath->get_depth == 1)
+ {
+ if ($origPath->get_depth == 1)
+ {
+ #Just moving a master item is not allowed
+ $context->finish(1,0,$time);
+ return;
+ }
+ else
+ {
+ #We get an item out of a collection
+ $newIter = $self->{model}->append(undef);
+ $collection = '';
+ }
+ }
+ else
+ {
+ #We are placing a collection item
+ $newIter = $self->{model}->append(
+ $self->convertIterToChildIter($model->iter_parent($targetIter))
+ );
+ $refreshCountNeeded = 1;
+ }
+ }
+
+ $self->{model}->set($newIter, @origData);
+ if ($self->{addCount})
+ {
+ # Refreshing target
+ $self->refreshCount($self->{model}->iter_parent($newIter))
+ if ($refreshCountNeeded);
+
+ # Refreshing origin
+ # We remove 1 to the count because the original has not been removed yet
+ # It will be removed when returning from this method
+ $self->refreshCount($self->{model}->get_iter($origParentPath), 0, -1)
+ if $origParentPath;
+ }
+ #$origIter = $treeview->get_selection->get_selected;
+ $origIter = $self->getCurrentIter;
+ #$self->removeParentIfNeeded($origIter);
+
+ # Removing previous instances in other collections
+ $self->removeOtherInstances($origCollection, $origIdx);
+
+ $self->{parent}->{items}->setValue($origIdx, $self->{collectionField}, $collection);
+ $context->finish(1,1,$time);
+ $self->select($origIdx);
+ $self->{parent}->markAsUpdated;
+ }
+ }
+
+ sub removeOtherInstances
+ {
+ my ($self, $collection, $idx, $fullCollection) = @_;
+ if ($collection)
+ {
+ my $collectionArray =
+ $self->transformValue(
+ $fullCollection || $self->{parent}->{items}->getValue($idx, $self->{collectionField}),
+ $self->{collectionField},
+ 0,
+ $self->{groupItems}
+ );
+ if (ref($collectionArray) eq 'ARRAY')
+ {
+ foreach (@$collectionArray)
+ {
+ next if $_ eq $collection;
+ $self->removeInCollection($_, $idx);
+ }
+ }
+
+ }
+ }
+
+ sub removeParentIfNeeded
+ {
+ my ($self, $iter) = @_;
+ #Destroy the previous auto-generated item if there was only one child
+ my $parentIter = $self->{model}->iter_parent($self->convertIterToChildIter($iter));
+ if ($parentIter && ($self->{model}->iter_n_children($parentIter) <= 1))
+ {
+ $self->{model}->remove($parentIter);
+ }
+ }
+
+ sub removeFromModel
+ {
+ my ($self, $iter) = @_;
+ my $parentToRemove = undef;
+
+ my $parentIter = $self->{model}->iter_parent($iter);
+ my $refreshCountNeeded = 0;
+ if ($parentIter)
+ {
+ if ($self->{model}->iter_n_children($parentIter) <= 1)
+ {
+ $parentToRemove = $parentIter;
+ }
+ else
+ {
+ # If we removed the 1st one, we should change the index of the master
+ # to be the new 1st
+ my $removedIdx = $self->convertChildIterToIdx($iter);
+ my $firstIdx = $self->convertChildIterToIdx($self->{model}->iter_children($parentIter));
+ if ($firstIdx == $removedIdx)
+ {
+ my $newIdx = $self->convertChildIterToIdx($self->{model}->iter_nth_child($parentIter, 1));
+ $self->{model}->set($parentIter, $self->{idxColumn}, $newIdx);
+ }
+ }
+ # Update count if needed
+ if (($self->{addCount})
+ && ($self->{model}->get($iter, $self->{visibleCol}))
+ && ($self->{model}->get($parentIter, $self->{visibleCol})))
+ {
+ $refreshCountNeeded = 1;
+ }
+
+ }
+
+ $self->{model}->remove($iter);
+ $self->refreshCount($parentIter) if $refreshCountNeeded;
+ $self->{model}->remove($parentToRemove) if $parentToRemove;
+ }
+
+ sub isUsingDate
+ {
+ my ($self) = @_;
+ return $self->{isUsingDate};
+ }
+
+ sub setSortOrder
+ {
+ my ($self, $order, $splash, $willFilter) = @_;
+ $self->{orderSet} = 1;
+ my $progressNeeded = ($splash && !$willFilter);
+ my ($realOrder, $field) = ($self->{preferences}->sortOrder, $self->{preferences}->sortField);
+ my $step;
+ if ($progressNeeded)
+ {
+ $step = GCUtils::round($self->{count} / 7);
+ $splash->setProgressForItemsSort(2*$step);
+ }
+ $self->{sorter}->set_sort_column_id($self->{fieldToId}->{$field},
+ $realOrder ? 'ascending' : 'descending');
+ $self->{list}->set_search_column($self->{fieldToId}->{$field});
+ $self->{sorter}->set_default_sort_func(undef, undef);
+ $splash->setProgressForItemsSort(4*$step) if $progressNeeded;
+ }
+
+ sub testIter
+ {
+ my ($self, $filter, $items, $iter) = @_;
+ my $idx = $self->convertChildIterToIdx($iter);
+ my $displayed;
+ if (exists $self->{testCache}->[$idx])
+ {
+ $displayed = $self->{testCache}->[$idx];
+ }
+ else
+ {
+ $displayed = $self->{testCache}->[$idx] = $filter->test($items->[$idx]);
+ # We increment only here to count only unique items
+ $self->{count}++ if $displayed;
+ }
+ $self->{model}->set($iter,
+ $self->{visibleCol},
+ $displayed
+ );
+ return $displayed;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $items, $refresh, $splash) = @_;
+ $self->{count} = 0;
+ $self->{testCache} = [];
+ $self->{tester} = $filter;
+ my $idx = 0;
+ my $iter = $self->{model}->get_iter_first;
+ while ($iter)
+ {
+ $splash->setProgressForItemsSort($idx++) if $splash;
+ if ($self->{model}->iter_has_child($iter))
+ {
+ my $showParent = 0;
+ my $childIter = $self->{model}->iter_children($iter);
+ while ($childIter)
+ {
+ my $displayed = GCDetailedList::testIter($self, $filter, $items, $childIter);
+ $showParent ||= $displayed;
+ $childIter = $self->{model}->iter_next($childIter);
+ }
+ $self->{model}->set($iter,
+ $self->{visibleCol},
+ $showParent
+ );
+ }
+ else
+ {
+ GCDetailedList::testIter($self, $filter, $items, $iter);
+ }
+ $iter = $self->{model}->iter_next($iter);
+ }
+ $self->{filter}->refilter;
+ $self->refreshCounts if ($self->{addCount});
+ my $currentIter = $self->getCurrentIter;
+ return $self->convertIterToIdx($currentIter)
+ if $currentIter;
+ $idx = $self->convertIterToIdx($self->{completeModel}->get_iter_first);
+ return $idx;
+ }
+
+ sub getPixbufFromCache
+ {
+ my ($self, $path) = @_;
+
+ my $realPath = GCUtils::getDisplayedImage($path,
+ $self->{parent}->{defaultImage},
+ $self->{parent}->{options}->file);
+
+ if (! $self->{cache}->{$realPath})
+ {
+ my $pixbuf;
+ eval {
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($realPath);
+ };
+ $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{parent}->{defaultImage})
+ if $@;
+
+ $pixbuf = GCUtils::scaleMaxPixbuf($pixbuf,
+ $self->{imgWidth},
+ $self->{imgHeight},
+ $self->{withImage});
+ $self->{cache}->{$realPath} = $pixbuf;
+ }
+ return $self->{cache}->{$realPath};
+ }
+
+ sub clearCache
+ {
+ my $self = shift;
+ $self->{cache} = {};
+ }
+
+ sub reset
+ {
+ my $self = shift;
+ $self->{list}->set_model(undef);
+ $self->{model}->clear;
+ $self->{alreadyInserted} = {};
+ $self->{currentIdx} = 0;
+ $self->{nextItemIdx} = -1;
+
+ $self->setGroupingInformation;
+ }
+
+ sub done
+ {
+ my $self = shift;
+ $self->{list}->set_model($self->{completeModel});
+ $self->refreshCounts if ($self->{addCount});
+ }
+
+ sub refreshCount
+ {
+ my ($self, $iter, $added, $offset) = @_;
+
+ my $subIter = $self->{subModel}->convert_child_iter_to_iter($iter);
+ my $nbChildren = $subIter
+ ? $self->{subModel}->iter_n_children($subIter)
+ : ($added ? 1 : 0);
+ $nbChildren += $offset if defined $offset;
+ # Version below still works if the orders of filter and sorter are inverted
+ #my $nbChildren = 0;
+ #my $childIter = $self->{model}->iter_children($iter);
+ #while ($childIter)
+ #{
+ # $nbChildren++ if $self->{model}->get($childIter, $self->{visibleCol});
+ # $childIter = $self->{model}->iter_next($childIter);
+ #}
+ my $original = $self->getIterCollection($iter);
+ my $generated = "$original ($nbChildren)";
+ $self->{model}->set($iter,
+ $self->{fieldToId}->{$self->{generatedField}},
+ $generated);
+ $self->{originalValue}->{$generated} = $original;
+ $self->{model}->set($iter, $self->{visibleCol}, $nbChildren);
+ }
+
+ sub refreshCounts
+ {
+ my $self = shift;
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ if ($model->iter_has_child($iter))
+ {
+ $self->refreshCount($iter);
+ }
+ return 0;
+ });
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field, $isGeneratedMaster, $multiAllowed, $isForSort, $forceArray) = @_;
+
+ my $type = '';
+ $type = $self->{parent}->{model}->{fieldsInfo}->{$field}->{type}
+ if defined $self->{parent}->{model}->{fieldsInfo}->{$field}->{type};
+
+ if ($type eq 'image')
+ {
+ $value = ($isGeneratedMaster ? undef : $self->getPixbufFromCache($value));
+ }
+ else
+ {
+ $value = $self->{parent}->transformValue($value, $field, ($multiAllowed && $self->{multi}));
+ }
+ if ($isForSort)
+ {
+ if ($type eq 'date')
+ {
+ $value = GCPreProcess::reverseDate($value);
+ }
+ else
+ {
+ $value = uc $value;
+ }
+ }
+ if ($forceArray)
+ {
+ if (ref($value) ne 'ARRAY')
+ {
+ my @array = ($value);
+ $value = \@array;
+ }
+ }
+ return $value;
+ }
+
+ sub convertChildPathToPath
+ {
+ my ($self, $path) = @_;
+
+ my $result = $path;
+ $result = $self->{subModel}->convert_child_path_to_path($result);
+ $result = $self->{completeModel}->convert_child_path_to_path($result)
+ if $result;
+ return $result;
+ }
+
+ sub getIterCollection
+ {
+ my ($self, $iter, $model) = @_;
+ $model ||= $self->{model};
+ my $val = ($model->get($iter))[$self->{generatedIndex}];
+ if ($self->{addCount} && ($val =~ / \(\d+\)$/))
+ {
+ $val = $self->{originalValue}->{$val}
+ if exists $self->{originalValue}->{$val};
+ }
+ return $val;
+ }
+
+ # This one should be called with a sorted/filtered iterator
+ sub convertIterToIdx
+ {
+ my ($self, $iter) = @_;
+ return 0 if ! $iter;
+ # If we have a master, we return idx from its 1st displayed child
+ if ($self->{completeModel}->iter_has_child($iter))
+ {
+ $iter = $self->{completeModel}->iter_children($iter);
+ }
+ return $self->{completeModel}->get_value($iter, $self->{idxColumn});
+ }
+
+ # This one should be called with an iterator from real model
+ sub convertChildIterToIdx
+ {
+ my ($self, $iter) = @_;
+ return 0 if ! $iter;
+ return ($self->{model}->get($iter))[$self->{idxColumn}];
+ }
+
+ sub getCurrentIdx
+ {
+ my $self = shift;
+ return $self->convertIterToIdx($self->getCurrentIter);
+ }
+
+ sub findMaster
+ {
+ my ($self, $collection) = @_;
+ my $realCollection = $self->{parent}->transformTitle($collection);
+ my $master = $self->{model}->get_iter_first;
+
+ while ($master)
+ {
+ return $master if ($self->{model}->iter_has_child($master))
+ && ($self->getIterCollection($master) eq $realCollection);
+ $master = $self->{model}->iter_next($master);
+ }
+ return undef;
+ }
+
+ sub removeInCollection
+ {
+ my ($self, $collec, $idx) = @_;
+ my $master = $self->findMaster($collec);
+ my $iter = $self->{model}->iter_nth_child($master, 0) || $master;
+ while ($iter)
+ {
+ last if $idx == $self->convertChildIterToIdx($iter);
+ $iter = $self->{model}->iter_next($iter);
+ }
+ if ($iter)
+ {
+ my $removedCurrent = ($self->{selectedIterString} eq $self->{currentIterString});
+ $self->removeFromModel($iter);
+ $self->{currentRemoved} = $removedCurrent;
+ }
+ }
+
+ sub createRowsData
+ {
+ my ($self, $info, $idx, $withTest) = @_;
+ my @data;
+ my $col = 0;
+ my $displayed = 1;
+ if ($withTest)
+ {
+ $displayed = $self->{tester}->test($info)
+ if $self->{tester};
+ $self->{testCache}->[$idx] = $displayed;
+ }
+ foreach my $field(@{$self->{fieldsArray}})
+ {
+ my $value = $self->transformValue($info->{$field}, $field, $info->{isGeneratedMaster});
+ push @data, $col, $value;
+ $col++;
+ }
+ push @data, $col++, $idx;
+ push @data, $col++, $displayed;
+ push @data, $col++, $self->transformValue($info->{$self->{secondaryField}})
+ if $self->{addSecondary};
+ return @data;
+ }
+
+ sub addItem
+ {
+ my ($self, $info, $immediate) = @_;
+
+ $self->{nextItemIdx}++;
+ $self->{count}++;
+
+ my $collection = $self->transformValue($info->{$self->{collectionField}}, $self->{collectionField},
+ 0, $self->{groupItems});
+
+ #Creating data;
+ my @data = $self->createRowsData($info, $self->{nextItemIdx});
+
+ if (
+ (! defined $collection)
+ || ($collection eq '')
+ || (!$self->{groupItems})
+ || (
+ (ref($collection) eq 'ARRAY')
+ && (
+ (! scalar @$collection)
+ || ((scalar @$collection == 1) && ((! defined $collection->[0]) || $collection->[0] eq ''))
+ )
+ )
+ )
+ {
+ #Simple entry
+ $self->{model}->set($self->{model}->append(undef), @data);
+ return;
+ }
+
+ if (ref($collection) ne 'ARRAY')
+ {
+ my @array = ($collection);
+ $collection = \@array;
+ }
+ foreach (@$collection)
+ {
+ next if $_ eq '';
+ if (exists $self->{alreadyInserted}->{$_})
+ {
+ #Master already exists
+ my $master;
+ $master = $self->findMaster($_);
+ my $childIter = $self->{model}->append($master);
+ $self->{model}->set($childIter, @data);
+ }
+ else
+ {
+ #No master and we are a child;
+ #Create the master
+ my $master = $self->{model}->append(undef);
+ $self->{alreadyInserted}->{$_} = 1;
+ my $masterName = $_;
+ my %info = (
+ $self->{generatedField} => $masterName,
+ #$self->{collectionField} => $_,
+ isGeneratedMaster => 1
+ );
+ my @masterData = $self->createRowsData(\%info, -1);
+ $self->{model}->set($master, @masterData);
+ #Insert the child
+ my $childIter = $self->{model}->append($master);
+ $self->{model}->set($childIter, @data);
+ }
+ }
+ }
+
+ sub getNextIter
+ {
+ my ($self, $iter, $indexes) = @_;
+ # Return index of iter following current one in view
+ my $nextIter = $self->{completeModel}->iter_next($iter);
+ if (!$nextIter)
+ {
+ my $parentIter = $self->{completeModel}->iter_parent($iter);
+ if ($parentIter)
+ {
+ $nextIter = $self->{completeModel}->iter_next($parentIter);
+ }
+ if (!$nextIter)
+ {
+ my $nbChildren = $self->{completeModel}->iter_n_children($parentIter);
+ if ($nbChildren > 1)
+ {
+ $nextIter = $self->{completeModel}->iter_nth_child(
+ $parentIter,
+ $self->{completeModel}->iter_n_children($parentIter) - 2
+ );
+ }
+ else
+ {
+ $nextIter = $self->{completeModel}->iter_nth_child(undef, 0);
+ }
+ }
+ }
+ my $idx = $self->convertIterToIdx($nextIter);
+
+ # If the one we got is in the list of the removed ones,
+ # We don't try to get another one, but we return the 1st one
+ if (GCUtils::inArrayTest($idx, @$indexes))
+ {
+ $nextIter = $self->{completeModel}->iter_nth_child(undef, 0);
+ $idx = $self->convertIterToIdx($nextIter);
+ }
+
+ return ($nextIter, $idx);
+ }
+
+ sub select
+ {
+ my ($self, $idx, $init) = @_;
+ my $currentIter;
+ if ($idx == -1)
+ {
+ $self->{currentIterString} = '0';
+ $currentIter = $self->{completeModel}->get_iter_first;
+ }
+ else
+ {
+ $self->convertIdxToIter($idx);
+ $self->{currentIterString} = '0' if ! $self->{currentIterString};
+ $currentIter = $self->getCurrentIterFromString;
+ }
+ $idx = $self->convertIterToIdx($currentIter);
+ return if !$currentIter;
+ if ($init)
+ {
+ my $parent = $self->{completeModel}->iter_parent($currentIter);
+ if ($parent)
+ {
+ my $treePath = $self->{completeModel}->get_path($parent);
+ if (!$self->{list}->row_expanded($treePath))
+ {
+ $self->{currentIterString} = $self->convertIterToString($parent);
+ $idx = $self->getCurrentIdx;
+ }
+ }
+ if ($self->{completeModel}->iter_has_child($currentIter))
+ {
+ $currentIter = $self->{completeModel}->iter_children($currentIter);
+ $idx = $self->convertIterToIdx($currentIter);
+ $self->{currentIterString} = $self->convertIterToString($currentIter);
+ }
+ }
+ $self->{list}->expand_to_path(Gtk2::TreePath->new($self->{currentIterString}))
+ if $self->{currentIterString} =~ /:/;
+ #Lock panel if we are on a master
+ $self->checkLock($currentIter);
+ if ($self->{list}->get_model)
+ {
+ $self->selectIter($currentIter);
+ }
+ return $idx;
+ }
+
+ sub checkLock
+ {
+ my ($self, $iter) = @_;
+ $iter = $self->getCurrentIter if !$iter;
+ if ($self->{completeModel}->iter_n_children($iter) > 0)
+ {
+ $self->{parent}->{panel}->lock(1);
+ }
+ else
+ {
+ $self->{parent}->{panel}->lock(0);
+ }
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+
+ my $path = $self->{list}->get_selection->get_selected_rows;
+ $self->{list}->scroll_to_cell($path) if $path;
+ }
+
+ sub changeCurrent
+ {
+ my ($self, $previous, $new, $idx, $wantSelect) = @_;
+ my @data = ();
+ my $col = 0;
+ my $refilterNeeded = 0;
+ my $currentIter = $self->getCurrentIterFromString;
+ return $idx if !$currentIter;
+ my $currentDepth = $self->{completeModel}->get_path($currentIter)->get_depth;
+ my $newIdx = $idx;
+ if (($currentDepth == 1)
+ && $self->{completeModel}->iter_has_child($currentIter))
+ {
+ # We do nothing for generated masters
+ return $newIdx;
+ }
+ $idx = $self->convertIterToIdx($currentIter);
+
+ my $previousCollection = $self->transformValue($previous->{$self->{collectionField}}, $self->{collectionField});
+ my $newCollection = $self->transformValue($new->{$self->{collectionField}}, $self->{collectionField});
+ @data = $self->createRowsData($new, $idx, 1);
+ # If we hide it, we select next one
+ # We double the index because @data contains both values and indexes
+ my $visible = $data[2 * $self->{visibleCol} + 1];
+ if (! $visible)
+ {
+ my $nextIter;
+ ($nextIter, $newIdx) = $self->getNextIter($currentIter);
+ $self->selectIter($nextIter, 1) if $nextIter && $wantSelect;
+ $self->{count}--;
+ }
+
+ if ($self->{groupItems})
+ {
+ if ($previousCollection ne $newCollection)
+ {
+ my $previousCollectionArray;
+ my $newCollectionArray;
+ #An item is integrated or moved into a collection
+ #First we find its master
+ my @parents;
+
+ #Changing collection
+ $previousCollectionArray = $self->transformValue($previous->{$self->{collectionField}}, $self->{collectionField}, 0, $self->{groupItems}, 0, 1);
+ $newCollectionArray = $self->transformValue($new->{$self->{collectionField}}, $self->{collectionField}, 0, $self->{groupItems}, 0, 1);
+ foreach my $collec(@$newCollectionArray)
+ {
+ next if $collec eq '';
+ push @parents, $self->findMaster($collec);
+
+ if (!$parents[-1])
+ {
+ $refilterNeeded = 1;
+ #We have to create a new parent
+ #Create the master
+ $parents[-1] = $self->{model}->append(undef);
+ $self->{alreadyInserted}->{$newCollection} = 1;
+ my %info = (
+ $self->{generatedField} => $collec,
+ $self->{collectionField} => $newCollection,
+ isGeneratedMaster => 1
+ );
+ my @masterData = $self->createRowsData(\%info, -1);
+ $self->{model}->set($parents[-1], @masterData);
+ }
+ else
+ {
+ # The parent already exists
+ # Check if the child were already there
+
+ # If it was, we remove it from parents
+ pop @parents if GCUtils::inArrayTest($collec, @$previousCollectionArray);
+ }
+ }
+
+ my $childIter = 0;
+ if (!scalar @$newCollectionArray)
+ {
+ $childIter = $self->{model}->append(undef);
+ $self->{model}->set($childIter, @data);
+ }
+ else
+ {
+ foreach my $parent(@parents)
+ {
+ #First we insert it at correct position
+ my $cIter = $self->{model}->append($parent);
+ $self->{model}->set($cIter, @data);
+ # We point to the 1st one
+ $childIter = $cIter if !$childIter;
+ # Update count if needed
+ $self->refreshCount($parent, 1) if ($self->{addCount});
+ }
+ }
+
+ #First we store if we are removing the one that has been selected
+ $self->{currentRemoved} = ($self->{selectedIterString} eq $self->{currentIterString});
+
+ # For generated master, we could have copies of our item in many places.
+ # So we need to loop on all the previous collections
+ # If we have a real master, we have juste one occurrence, the current one
+ if (!scalar @$previousCollectionArray)
+ {
+ $self->removeInCollection(undef, $idx);
+ }
+ else
+ {
+ foreach my $collec(@$previousCollectionArray)
+ {
+ $self->removeInCollection($collec, $idx)
+ if !GCUtils::inArrayTest($collec, @$newCollectionArray);
+ }
+ }
+ if ($childIter)
+ {
+ my $childPath = $self->{model}->get_path($childIter);
+ $childPath = $self->convertChildPathToPath($childPath);
+ if ($childPath)
+ {
+ $self->{list}->expand_to_path($childPath);
+ $self->selectIter(
+ $self->{completeModel}->get_iter($childPath)
+ ) if $self->{currentRemoved} && $visible;
+ }
+ }
+ }
+ else
+ {
+ $self->{model}->foreach(sub {
+ my ($model, $path, $iter) = @_;
+ return 0 if $idx != $self->convertChildIterToIdx($iter);
+ $model->set($iter, @data);
+ return 0;
+ });
+ }
+ }
+ else
+ {
+ $self->{model}->set(
+ $self->convertIterToChildIter($currentIter),
+ @data
+ );
+ }
+
+ # Update count for each parents only if we are not changing collection
+ # Because we already did it otherwise
+ if ((! $visible)
+ && ($self->{groupItems})
+ && ($previousCollection eq $newCollection))
+ {
+ my $collectionArray = $self->transformValue($new->{$self->{collectionField}},
+ $self->{collectionField},
+ 0,
+ 1,
+ 0,
+ 1);
+ foreach my $collec(@$collectionArray)
+ {
+ next if $collec eq '';
+ $self->refreshCount($self->findMaster($collec))
+ if ($self->{addCount});
+ }
+ }
+
+ #my $iter = $self->{list}->get_selection->get_selected;
+ my $iter = $self->getCurrentIter;
+ $self->{selectedIterString} = $self->convertIterToString($iter);
+ $self->{currentIterString} = $self->{selectedIterString};
+ $self->showCurrent;
+ $self->{filter}->refilter if $refilterNeeded;
+ return $newIdx;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCLang.pm b/lib/gcstar/GCLang.pm
new file mode 100644
index 0000000..8751dff
--- /dev/null
+++ b/lib/gcstar/GCLang.pm
@@ -0,0 +1,274 @@
+{
+ package GCLang;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use base 'Exporter';
+our @EXPORT = qw(%langs);
+
+use File::Basename;
+use FindBin qw($RealBin $Script);
+use GCUtils 'glob';
+
+our %langs;
+our $loaded = 0;
+
+sub loadLang
+{
+ my ($lang, $nameOnly) = @_;
+
+ if ($nameOnly)
+ {
+ # We directly read the file here to save time and memory
+ open LANG, $ENV{GCS_LIB_DIR}."/GCLang/$lang/GCstar.pm" or return 0;
+ binmode(LANG, ':utf8' );
+ while (<LANG>)
+ {
+ next if !/LangName/;
+ /'?LangName'?\s*=>\s*'(.*)'/;
+ $langs{$lang} = {'LangName' => $1};
+ last;
+ }
+ close LANG;
+ }
+ else
+ {
+ eval "use GCLang::${lang}::GCstar";
+ my %tmpLang;
+ eval "%tmpLang = %GCLang::${lang}::lang";
+ return 0 if !%tmpLang;
+ $langs{$lang} = \%tmpLang;
+ }
+ return 1;
+}
+
+sub loadLangs
+{
+ my $lang = shift;
+
+ return if $loaded;
+ if ($lang)
+ {
+ return 0 if !loadLang($lang);
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCLang/*')
+ {
+ next if /CVS/ || /pm$/ || /$lang/;
+ my $lang = basename($_);
+ loadLang($lang, 1);
+ #$langs{$lang} = {'LangName' => $langs{$lang}{LangName}};
+ #eval "no GCLang::${lang}::GCstar";
+ }
+ }
+ else
+ {
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCLang/*')
+ {
+ next if /CVS/ || /pm$/;
+ my $lang = basename($_);
+ loadLang($lang);
+ }
+ }
+ $loaded = 1;
+ return 1;
+}
+
+sub loadPluginsLangs
+{
+ foreach (glob $ENV{GCS_LIB_DIR}.'/GCLang/*')
+ {
+ next if /CVS/ || /pm$/;
+ my $lang = basename($_);
+ foreach my $dir(glob $ENV{GCS_LIB_DIR}."/GCLang/$lang/*")
+ {
+ next if /\.pm$/;
+ foreach my $plugin(glob "$dir/*.pm")
+ {
+ my $module = basename($dir);
+ my %tmpLang;
+ ($plugin = basename($plugin)) =~ s/\.pm$//;
+ eval "use GCLang::".$lang."::".$module."::".$plugin."\n";
+ eval "%tmpLang = %GCLang::".$lang."::".$module."::".$plugin."::lang";
+ foreach my $key(keys %tmpLang)
+ {
+ $langs{$lang}->{$module.'/'.$plugin.".pm '".$key."'"} = $tmpLang{$key};
+ }
+ }
+ }
+ }
+
+}
+
+sub languageDirection
+{
+ my $lang = shift;
+
+ $lang =~ m/([a-z]*)/;
+ if ($1 eq 'ar')
+ {
+ # Langauge is RTL
+ return 'RTL';
+ }
+ else
+ {
+ return 'LTR';
+ }
+}
+
+# Used to convert a model-specific string to the full string (eg "New {1}" -> "New game")
+sub updateModelSpecificStrings
+{
+ my ($self) = @_;
+
+ # We need to make a copy of the original language strings, without the model-specific strings
+ if (!$self->{originalLang})
+ {
+ %{$self->{originalLang}} = %{$self->{lang}};
+ }
+
+ my $itemStrings = $self->{model}->{lang}->{Items};
+ # Add default lower case version if it doesn't exist, if the language has support for it
+ if (ref $itemStrings eq 'HASH')
+ {
+ foreach (keys %{$itemStrings})
+ {
+ next if /lowercase/;
+ next if exists $itemStrings->{'lowercase'.$_};
+ $itemStrings->{'lowercase'.$_} = lc $itemStrings->{$_};
+ }
+ }
+ # Now, go and replace any model-specific strings
+ foreach my $string (keys %{$self->{lang}})
+ {
+ $self->{lang}->{$string} = $self->{originalLang}->{$string};
+ if (ref $itemStrings eq 'HASH')
+ {
+ $self->{lang}->{$string} =~ s/{(.*)}/$itemStrings->{$1}/e;
+ }
+ else
+ {
+ $self->{lang}->{$string} =~ s/{(.*)}/$itemStrings/e;
+ }
+ }
+}
+
+# Used to convert a single model-specific string to the full string (eg "New {1}" -> "New game")
+sub getGenericModelString
+{
+ my ($self, $string) = @_;
+ my $itemStrings = $self->{model}->{lang}->{Items};
+ # Add default lower case version if it doesn't exist, if the language has support for it
+ if (ref $itemStrings eq 'HASH')
+ {
+ foreach (keys %{$itemStrings})
+ {
+ next if /lowercase/;
+ next if exists $itemStrings->{'lowercase'.$_};
+ $itemStrings->{'lowercase'.$_} = lc $itemStrings->{$_};
+ }
+ }
+
+ my $fixedString = $string;
+ if (ref $itemStrings eq 'HASH')
+ {
+ $fixedString =~ s/{(.*)}/$itemStrings->{$1}/e;
+ }
+ else
+ {
+ $fixedString =~ s/{(.*)}/$itemStrings/e;
+ }
+ return $fixedString;
+}
+
+# Used to check languages (which translation are missing)
+# Usage: perl -e "use GCLang; GCLang::checkLangs"
+sub checkLangs
+{
+ my @langsToCheck = @_;
+
+ my $ref = 'EN';
+ #my $otherRef = 'FR';
+
+ loadLangs;
+ loadPluginsLangs;
+
+ my @langsList = scalar @langsToCheck ? @langsToCheck : keys %langs;
+
+ my %results;
+ foreach (sort keys %{$langs{$ref}})
+ {
+ foreach my $langName(@langsList)
+ {
+ next if $langName eq $ref;
+ if (! exists $langs{$langName}->{$_})
+ {
+ push @{$results{$langName}{error}}, $_;
+ }
+ else
+ {
+ #next if $langName eq $otherRef;
+ push @{$results{$langName}{warning}}, $_
+ if ($langs{$langName}->{$_} eq $langs{$ref}->{$_})
+ # || ($langs{$langName}->{$_} eq $langs{$otherRef}->{$_});
+ }
+ }
+ }
+
+ foreach (sort keys %results)
+ {
+ print "\n\nLang $_\n-------\n\n";
+ print "Errors:\n\n";
+ foreach my $value(@{$results{$_}{error}})
+ {
+ next if $value =~ m|^GC.*?/|;
+ print "'$value' => '",$langs{$ref}->{$value},"',\n";
+ }
+ print "\n";
+ foreach my $value(@{$results{$_}{error}})
+ {
+ next if $value !~ m|^GC.*?/|;
+ print "$value => '",$langs{$ref}->{$value},"',\n";
+ }
+ next if $ENV{GCS_ERRORS_ONLY} eq 'YES';
+ print "\nWarnings:\n\n";
+ foreach my $value(@{$results{$_}{warning}})
+ {
+ next if $value =~ m|^GC.*?/|;
+ print "'$value' => '",$langs{$_}->{$value},"',\n";
+ }
+ print "\n";
+ foreach my $value(@{$results{$_}{warning}})
+ {
+ next if $value !~ m|^GC.*?/|;
+ print "$value => '",$langs{$_}->{$value},"',\n";
+ }
+ }
+}
+
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..96692e3
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportCSV.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::AR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'تضمين أسماء الحقول بالأعلى',
+ 'Separator' => 'الÙاصلة',
+ 'Replacement' => 'إستبدال الÙاصلة بـ',
+ 'Charset' => 'الترميز',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..c87fc2f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::AR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..e692fa5
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportHTML.pm
@@ -0,0 +1,76 @@
+{
+ package GCLang::AR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'قالب غير صالح',
+ 'UseFile' => 'قم بإستعمال المل٠أدناه',
+ 'TemplateExternalFile' => 'القالب',
+ 'WithJS' => 'إستعمل Javascript',
+ 'FileTemplate' => 'قالب:',
+ 'Preview' => 'معاينة',
+ 'NoPreview' => 'المعاينة غير متاحة',
+ 'Title' => 'عنوان الصÙحة',
+ 'InfoFile' => 'قائمة الأÙلام ÙÙŠ الملÙ: ',
+ 'InfoDir' => 'الصور ÙÙŠ المجلد: ',
+ 'HeightImg' => 'إرتÙاع الصور التي سيتم تصديرها (بالبكسل): ',
+ 'OpenFileInBrowser' => 'Ùتح المل٠المنشئ بواسطة متصÙØ­ الإنترنت',
+ 'Note' => 'تم إنشاء القائمة بواسطة <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'أدخل نص البحث',
+ 'SearchType1' => 'عنوان Ùقط',
+ 'SearchType2' => 'معلومات كاملة',
+ 'SearchButton' => 'بحث',
+ 'SearchTitle' => 'عرض الأÙلام الماطيقة للمعيار السابق Ùقط',
+ 'AllButton' => 'الكل',
+ 'AllTitle' => 'عرض كل الأÙلام',
+ 'Expand' => 'توسيع الكل',
+ 'ExpandTitle' => 'عرض معلومات كل الأÙلام',
+ 'Collapse' => 'طي الكل',
+ 'CollapseTitle' => 'طي كل معلومات الأÙلام',
+ 'Borrowed' => 'تمت إستعارته من قبل: ',
+ 'NotBorrowed' => 'متاح',
+ 'Top' => 'للأعلى',
+ 'Bottom' => 'للأسÙÙ„',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..984b4bf
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::AR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..7edff66
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportSQL.pm
@@ -0,0 +1,53 @@
+
+{
+ package GCLang::AR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'تضمين تعليمة DROP',
+ 'WithCreate' => 'تضمين تعليمة CREATE',
+ 'TableName' => 'إسم الجدول',
+ 'InfoFile' => 'مل٠SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..3f8163c
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::AR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'أرشÙØ© للملÙ: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..a36c7d2
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCExport/GCExportXML.pm
@@ -0,0 +1,53 @@
+{
+ package GCLang::AR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'مل٠القالب',
+ 'ModelText' => 'نص القالب',
+ 'Models' => 'قالب سيتم إستعماله',
+ 'UseFile' => 'إستعمل الملÙ',
+ 'UseModel' => 'إستعمل مربع النص',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..7622dca
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,51 @@
+{
+ package GCLang::AR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'مكان البحث',
+ 'Default' => 'مسار Alexandria الإÙتراضي',
+ 'Specified' => 'المسار المحدّد أدناه',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..ff92e5f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportCSV.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::AR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'الترميز',
+ 'Header' => 'تجاهل السطر الأول',
+ 'Separator' => 'الÙاصلة',
+ 'Plugin' => 'موقع سيتم إستعماله',
+ 'UseFirst' => 'حدد أول نتيجة',
+ 'SearchField' => 'Search for items using',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..e72f5fa
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::AR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..8d5a41e
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::AR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'نسخ الصور',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..a424172
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportList.pm
@@ -0,0 +1,54 @@
+{
+ package GCLang::AR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'قائمة الأسماء',
+ 'Plugin' => 'موقع سيتم إستعماله',
+ 'UseFirst' => 'حدد أول نتيجة',
+ 'CommentAuto' => 'عنصر سيتم إستيراده بشكل تلقائي',
+ 'CommentSite' => 'موقع إنترنت: ',
+ 'CommentTitle' => 'عنوان: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3f98efc
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::AR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..3029f9f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCImport/GCImportTellico.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::AR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'المل٠لا يدعم مجموعة Tellico ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..a03bc0b
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::AR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..6f866c0
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::AR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..61d58e9
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::AR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/AR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..f72cc67
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::AR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة الكتب',
+ Items => 'الكتب',
+ NewItem => 'كتاب جديد',
+
+ Isbn => 'ISBN',
+ Title => 'العنوان',
+ Cover => 'الغلاÙ',
+ Authors => 'المؤلÙون',
+ Publisher => 'الناشر',
+ Publication => 'تاريخ النشر',
+ Language => 'اللغة',
+ Genre => 'النوع',
+ Serie => 'سلسلة',
+ Rank => 'الرتبة',
+ Bookdescription => 'الوصÙ',
+ Pages => 'صÙحات',
+ Read => 'Ù‚Ùرء',
+ Acquisition => 'تاريخ الحصول على الكتاب',
+ Edition => 'الطبعة',
+ Format => 'الصيغة',
+ Comments => 'تعليقات',
+ Url => 'صÙحة الإنترنت',
+ Translator => 'المترجم',
+ Artist => 'الرسّام',
+ DigitalFile => 'Digital version',
+
+ General => 'عام',
+ Details => 'تÙاصيل',
+
+ ReadNo => 'لم ÙŠÙقرء',
+ ReadYes => 'Ù‚Ùرء',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/AR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..ccb8bad
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::AR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة نقديّة',
+ Items => 'نقود',
+ NewItem => 'نقد جديد',
+
+ Name => 'الإسم',
+ Country => 'البلد',
+ Year => 'العام',
+ Currency => 'العملة',
+ Value => 'القيمة',
+ Picture => 'الصورة الرئيسية',
+ Diameter => 'القطر',
+ Metal => 'معدني',
+ Edge => 'الحاÙØ©',
+ Edge1 => 'الحاÙØ© 1',
+ Edge2 => 'الحاÙØ© 2',
+ Edge3 => 'الحاÙØ© 3',
+ Edge4 => 'الحاÙØ© 4',
+ Head => 'الترويسة',
+ Tail => 'التذييل',
+ Comments => 'تعليقات',
+ History => 'التاريخ',
+ Website => 'موقع الإنترنت',
+ Estimate => 'التخمين',
+ References => 'المراجع',
+ Type => 'النوع',
+ Coin => 'العملة',
+ Banknote => 'ملاحظة المصرÙ',
+
+ Main => 'عام',
+ Description => 'الوصÙ',
+ Other => 'معلومات أخرى',
+ Pictures => 'الصور',
+
+ Condition => 'الشروط (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/AR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..4e0fa7d
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::AR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/AR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..d303348
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCfilms.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::AR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة الأÙلام',
+ Items => 'Ø£Ùلام',
+ NewItem => 'Ùيلم جديد',
+
+
+ Id => 'الرقم المعرّÙ',
+ Title => 'العنوان',
+ Date => 'التاريخ',
+ Time => 'المدّة الزمنية',
+ Director => 'المخرج',
+ Country => 'البلد',
+ MinimumAge => 'أقل عمر',
+ Genre => 'النوع',
+ Image => 'صورة',
+ Original => 'العنوان الأصلي',
+ Actors => 'الممثلون',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'تعليقات',
+ Synopsis => 'الخلاصة',
+ Seen => 'متى عÙرض',
+ Number => '# مرة',
+ Format => 'الصيغة',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'صÙحة الإنترنت',
+ Audio => 'الصوت',
+ Video => 'صيغة الÙيديو',
+ Trailer => 'مل٠الÙيديو',
+ Serie => 'سلسلة',
+ Rank => 'الرتبة',
+ Subtitles => 'الترجمة الثانوية',
+ Added => 'تاريخ الإضاÙØ©',
+
+ SeenYes => 'عًرض',
+ SeenNo => 'لم يًعرض',
+
+ AgeUnrated => 'لم يتم تقييمه',
+ AgeAll => 'كل الأعمال',
+ AgeParent => 'التوجيه الأبوي',
+
+ Main => 'عناصر رئيسية',
+ General => 'عام',
+ Details => 'تÙاصيل',
+
+ Information => 'معلومات',
+ Languages => 'لغات',
+ Encoding => 'ترميز',
+
+ FilterAudienceAge => 'عمر الجمهور',
+ FilterSeenNo => 'لم يتم عرضه حتى الآن',
+ FilterSeenYes => 'تم عرضه',
+ FilterRatingSelect => 'تم تقييمه على الأقل...',
+
+ ExtractSize => 'قياس',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCgames.pm b/lib/gcstar/GCLang/AR/GCModels/GCgames.pm
new file mode 100644
index 0000000..e23d7eb
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCgames.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::AR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة ألعاب الÙيديو',
+ Items => 'ألعاب',
+ NewItem => 'لعبة جديدة',
+
+ Id => 'الرقم المعرّÙ',
+ Ean => 'EAN',
+ Name => 'الإسم',
+ Platform => 'منصة التشغيل',
+ Players => 'عدد اللاّعبين',
+ Released => 'تاريخ الإصدار',
+ Editor => 'المحرّر',
+ Developer => 'المطوّر',
+ Genre => 'النوع',
+ Box => 'صورة العلبة',
+ Case => 'الحالة',
+ Manual => 'دليل الإستخدام',
+ Completion => 'الإكمال (%)',
+ Executable => 'مل٠تنÙيذي',
+ Description => 'الوصÙ',
+ Codes => 'شيÙرات',
+ Code => 'شيÙرة',
+ Effect => 'تأثير',
+ Secrets => 'أسرار',
+ Screenshots => 'لقطات',
+ Screenshot1 => 'أول لقطة',
+ Screenshot2 => 'ثاني لقطة',
+ Comments => 'تعليقات',
+ Url => 'صÙحة الإنترنت',
+ Unlockables => 'قابلة لإلغاء الأقÙال',
+ Unlockable => 'قابلة لإلغاء القÙÙ„',
+ Howto => 'كيÙية إلغاء القÙÙ„',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'عام',
+ Details => 'تÙاصيل',
+ Tips => 'تلميحات',
+ Information => 'معلومات',
+
+ FilterRatingSelect => 'التقييم على الأقل...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..a45ec28
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::AR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/AR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..34fe51a
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::AR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/AR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..921457f
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCmusics.pm
@@ -0,0 +1,78 @@
+{
+ package GCLang::AR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# webmaster@hali-sy.com
+# bashir.storm@gmail.com
+# hali83@cec.sy
+# MY Blog:
+# http://www.hali-sy.com/blog
+#
+###################################################
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'مجموعة الموسيقا',
+ Items => 'ألبومات',
+ NewItem => 'ألبوم جديد',
+
+ Unique => 'ISRC/EAN',
+ Title => 'العنوان',
+ Cover => 'الغلاÙ',
+ Artist => 'الÙنّان',
+ Format => 'الصيغة',
+ Running => 'وقت التشغيل',
+ Release => 'تاريخ الإصدار',
+ Genre => 'النوع',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'قائمة المسارات',
+ Number => 'الرقم',
+ Track => 'العنوان',
+ Time => 'الزمن',
+
+ Composer => 'الملحّن',
+ Producer => 'المنتج',
+ Playlist => 'قائمة القراءة',
+ Comments => 'تعليقات',
+ Label => 'تسمية',
+ Url => 'صÙحة الإنترنت',
+
+ General => 'عام',
+ Details => 'تÙاصيل',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..4821839
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::AR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..e8b414b
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::AR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..4596fa3
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::AR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/AR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..70d3b0b
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::AR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCModels/GCwines.pm b/lib/gcstar/GCLang/AR/GCModels/GCwines.pm
new file mode 100644
index 0000000..db10bdd
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::AR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/AR/GCstar.pm b/lib/gcstar/GCLang/AR/GCstar.pm
new file mode 100644
index 0000000..f5bdd58
--- /dev/null
+++ b/lib/gcstar/GCLang/AR/GCstar.pm
@@ -0,0 +1,692 @@
+{
+ package GCLang::AR;
+
+ use utf8;
+###################################################
+#
+# This file translated by :
+# Muhammad Bashir Al-Noimi
+# Contact me:
+# mhdbnoimi@gmail.com
+# bashir.storm@gmail.com
+# mbnoimi@gmail.com
+# MY Blog:
+# http://mbnoimi.net/
+#
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Arabic عربي',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>تحذير</b>:
+
+المعلومات التي يتم تحميلها من الإنترنت (عن طريق
+ملحقات البحث) تستعمل Ùقط من أجل <b>الإستعمال الشخصي</b>.
+
+من أجل تحديد موقع الإنترنت المناسب لتحميل البيانات، بإمكانك
+إستعمال <b>الزر الواقع تحت تÙاصيل العنصر </b>.',
+
+
+ 'AllItemsFiltered' => 'لم يتم العثور على أي عنصر من خلال معيار البحث الذي قمت بتخصيصه', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'تم تنصيبه ضمن ',
+ 'InstallMandatory' => 'مكونات أساسية',
+ 'InstallOptional' => 'مكونات إختيارية',
+ 'InstallErrorMissing' => 'خطأ : مكونات بيرل التالية يجب أن يتم تنصيبها: ',
+ 'InstallPrompt' => 'مجلد التنصيب [/usr/local]: ',
+ 'InstallEnd' => 'نهاية التنصيب',
+ 'InstallNoError' => 'لا توجد أخطاء',
+ 'InstallLaunch' => 'لتشغيل البرنامج يجب إستدعاء نسخة واحدة ',
+ 'InstallDirectory' => 'المجلد الرئيسي',
+ 'InstallTitle' => 'تنصيب جي سي ستار',
+ 'InstallDependencies' => 'الإعتمادية',
+ 'InstallPath' => 'مسار',
+ 'InstallOptions' => 'خيارات',
+ 'InstallSelectDirectory' => 'قم بتحديد مجلد التنصيب',
+ 'InstallWithClean' => 'إزالة الملÙات الموجودة ضمن مجلد التنصيب',
+ 'InstallWithMenu' => 'إضاÙØ© جي سي ستار لقائمة البرامج',
+ 'InstallNoPermission' => 'خطأ : ليس لديك سماحية الكتابة ضمن المجلد المحدد',
+ 'InstallMissingMandatory' => 'إعتماديات أساسية Ù…Ùقودة. ليس بإمكانك تنصيب جي سي ستار إلا بعد إضاÙØ© الإعتماديات الرئيسية لنظامك.',
+ 'InstallMissingOptional' => 'بعض الإعتماديات الإختيارية Ù…Ùقودة كما هو موضح أدناه. يمكن تنصيب جي سي ستار لكن بعض الميزات لن تكون متوÙرة للعمل.',
+ 'InstallMissingNone' => 'لا توجد إعتماديات Ù…Ùقودة. بإمكانك الإستمرار Ùˆ تنصيب جي سي ستار.',
+ 'InstallOK' => 'مواÙÙ‚',
+ 'InstallMissing' => 'Ù…Ùقود',
+ 'InstallMissingFor' => 'Ù…Ùقود',
+ 'InstallCleanDirectory' => 'إزالة ملÙات جي سي ستار من المجلد: ',
+ 'InstallCopyDirectory' => 'نسخ الملÙات للمجلد: ',
+ 'InstallCopyDesktop' => 'نسخ مل٠سطح المكتب إلى: ',
+
+#Update
+ 'UpdateUseProxy' => 'البروكسي الذي سيتم إستعماله (قم بالنقر على Enter ÙÙŠ حال عدم وجود بروكسي): ',
+ 'UpdateNoPermission' => 'لا توجد سماحية للكتابة ضمن هذا المجلّد ',
+ 'UpdateNone' => 'لم يتم العثور على تحديث جديد',
+ 'UpdateFileNotFound' => 'لم يتم العثور على الملÙ',
+
+#Splash
+ 'SplashInit' => 'تهيئة',
+ 'SplashLoad' => 'تحميل المجموعات',
+ 'SplashDisplay' => 'عرض المجموعات',
+ 'SplashSort' => 'ترتيب المجموعات',
+ 'SplashDone' => 'جاهز',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'يبدو أنك كنت تستعمل جي سي Ùيلم من قبل. هل ترغب بإستيراد البيانات من جي سي Ùيلم إلى جي سي ستار؟',
+ 'GCfilmsImportOptions' => 'إعدادات',
+ 'GCfilmsImportData' => 'قائمة الأÙلام',
+
+#Menus
+ 'MenuFile' => '_ملÙ',
+ 'MenuNewList' => '_مجموعة جديدة',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_المجموعات السابقة',
+ 'MenuLend' => 'إظهار العناصر _المستعرضة سابقاً', # Accepts model codes
+ 'MenuImport' => '_إستيراد',
+ 'MenuExport' => '_تصدير',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_تحرير',
+ 'MenuDuplicate' => 'مضاعÙØ© العنصر', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_حذ٠العنصر', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_تغيير حقول المجموعة',
+ 'MenuEditLockItems' => '_إقÙال المجموعة',
+
+ 'MenuDisplay' => 'ت_صÙية',
+ 'MenuSavedSearches' => 'Ø­Ùظ البحث',
+ 'MenuSavedSearchesSave' => 'Ø­Ùظ البحث الحالي',
+ 'MenuSavedSearchesEdit' => 'تعديل بحث محÙوظ',
+ 'MenuAdvancedSearch' => 'ب_حث متقدّم',
+ 'MenuViewAllItems' => 'عرض _كل العناصر', # Accepts model codes
+ 'MenuNoFilter' => '_أي شيء',
+
+ 'MenuConfiguration' => '_إعدادات',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_المعلومات المعروضة',
+ 'MenuBorrowers' => '_إستعارة',
+ 'MenuToolbarConfiguration' => '_عناصر شريط الأدوات',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'نم_ط التحويل',
+
+ 'MenuBookmarks' => '_محÙوظات',
+ 'MenuBookmarksAdd' => '_أض٠الجموعة الحالية',
+ 'MenuBookmarksEdit' => '_تحرير المحÙوظات',
+
+ 'MenuHelp' => '_مساعدة',
+ 'MenuHelpContent' => '_المحتوى',
+ 'MenuAllPlugins' => 'عرض الملحقات',
+ 'MenuBugReport' => 'الإبلاغ عن خطأ',
+ 'MenuAbout' => '_حول جي سي ستار',
+
+ 'MenuNewWindow' => 'عرض العنصر بناÙذة _جديدة', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'توسيع الكل',
+ 'ContextCollapseAll' => 'طي الكل',
+ 'ContextChooseImage' => 'قم بإختيار صورة',
+ 'ContextOpenWith' => 'Ùتح بواسطة',
+ 'ContextImageEditor' => 'محرر الصور',
+ 'ContextImgFront' => 'الواجهة',
+ 'ContextImgBack' => 'الخلÙية',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'قم بإدخال قيمة',
+
+ 'RemoveConfirm' => 'هل أنت متأكد من حذ٠هذا العنصر؟', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'عنصر جديد',
+ 'NewItemTooltip' => 'إضاÙØ© عنصر جديد',
+ 'NoItemFound' => 'لم يتم العثور على أي شيء. هل تود البحث ضمن موقع آخر؟',
+ 'OpenList' => 'قم بتحديد مجموعة',
+ 'SaveList' => 'قم بتحديد مسار Ø­Ùظ المجموعة',
+ 'SaveListTooltip' => 'Ø­Ùظ المجموعة الحالية',
+ 'SaveUnsavedChanges' => 'لم يتم Ø­Ùظ التعديلات على مجموعتك لم تÙØ­Ùظ. هل تريد Ø­Ùظ التعديلات؟',
+ 'SaveDontSave' => 'لا تحÙظ',
+ 'PreferencesTooltip' => 'تÙضيلات البرنامج',
+ 'ViewTooltip' => 'تغيير عرض المجموعة',
+ 'PlayTooltip' => 'قراءة مل٠الÙيديو المرتبط بالعنصر', # Accepts model codes
+ 'PlayFileNotFound' => 'المل٠الذي سيتم إستدعاؤه غير موجود ÙÙŠ هذا المسار:',
+ 'PlayRetry' => 'إعادة القراءة',
+
+ 'StatusSave' => 'الحÙظ جاري...',
+ 'StatusLoad' => 'التحميل جاري...',
+ 'StatusSearch' => 'البحث جاري...',
+ 'StatusGetInfo' => 'الحصول على المعلومات...',
+ 'StatusGetImage' => 'الحصول على الصورة...',
+
+ 'SaveError' => 'غير قادر على Ø­Ùظ قائمة العناصر. من Ùضلك قم بÙحص سماحيات الكتابة على القرص',
+ 'OpenError' => 'غير قادر على Ùتح قائمة العناصر. من Ùضلك قم بÙحص سماحيات القرص',
+ 'OpenFormatError' => 'غير قادر على Ùتح قائمة العناصر. تأكد من صحة التنسيق',
+ 'OpenVersionWarning' => 'المجموعة تم Ø­Ùظها بواسطة عدة إصدارات من جي سي ستار. إذا قمت بحÙظها هنالك إحتمال أن تÙقد بعض البيانات.',
+ 'OpenVersionQuestion' => 'هل لا تزال ترغب بالإستمرار؟',
+ 'ImageError' => 'المسار المحدّد من أجل Ø­Ùظ الصوّر غير صالح. من Ùضلك قم بتحديد مسار آخر',
+ 'OptionsCreationError'=> 'غير قادر على إنشاء مل٠الخيارات: ',
+ 'OptionsOpenError'=> 'غير قادر على Ùتح مل٠الخيارات: ',
+ 'OptionsSaveError'=> 'غير قادر على Ø­Ùظ مل٠الخيارات: ',
+ 'ErrorModelNotFound' => 'النموذج غير موجود: ',
+ 'ErrorModelUserDir' => 'النماذج المعرÙØ© من قبل المستخدم موجودة ضمن: ',
+
+ 'RandomTooltip' => 'ما الذي ترغب برؤيته هذا المساء؟',
+ 'RandomError'=> 'لم يتم تحديد أي عنصر', # Accepts model codes
+ 'RandomEnd'=> 'لا توجد عناصر أكثر من ذلك', # Accepts model codes
+ 'RandomNextTip'=> 'الإقتراح التالي',
+ 'RandomOkTip'=> 'قبول هذا العنصر',
+
+ 'AboutTitle' => 'حول جي سي ستار',
+ 'AboutDesc' => 'لإدارة المجموعات',
+ 'AboutVersion' => 'إصدار',
+ 'AboutTeam' => 'Ùريق',
+ 'AboutWho' => 'مدير المشروع، مبرمج: Christian Jodar (Tian)
+مبرمج: Nyall Dawson (Zombiepig)
+مبرمج: TPF
+مبرمج: Adolfo González
+',
+ 'AboutLicense' => 'المشروع تم تطويره Ùˆ توزيعه ÙˆÙÙ‚ رخصة البرامج Ù…Ùتوحة المصدر GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'دعم اللغة العربية: محمد بشير النعيمي
+http://mbnoimi.net/
+mhdbnoimi@gmail.com
+bashir.storm@gmail.com
+mbnoimi@gmail.com',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+ تم أنجاز الشعار و تصميم الويب من قبل le Spektre',
+
+ 'ToolbarRandom' => 'هذه اللّيلة',
+
+ 'UnsavedCollection' => 'مجموعة لم يتم Ø­Ùظها',
+ 'ModelsSelect' => 'حدّد نوع المجموعة',
+ 'ModelsPersonal' => 'نماذج شخصية',
+ 'ModelsDefault' => 'نماذج Ø¥Ùتراضية',
+ 'ModelsList' => 'تعري٠المجموعة',
+ 'ModelSettings' => 'إعدادات المجموعة',
+ 'ModelNewType' => 'مجموعة جديدة',
+ 'ModelName' => 'إسم المجموعة: ',
+ 'ModelFields' => 'حقول',
+ 'ModelOptions' => 'خيارات',
+ 'ModelFilters' => 'مرشحات تصÙية',
+ 'ModelNewField' => 'حقل جديد',
+ 'ModelFieldInformation' => 'معلومات',
+ 'ModelFieldName' => 'تسمية:',
+ 'ModelFieldType' => 'نوع:',
+ 'ModelFieldGroup' => 'مجموعة:',
+ 'ModelFieldValues' => 'القيم',
+ 'ModelFieldInit' => 'Ø¥Ùتراضي:',
+ 'ModelFieldMin' => 'الحد الأدنى:',
+ 'ModelFieldMax' => 'الحد الأعلى:',
+ 'ModelFieldList' => 'قائمة القيم:',
+ 'ModelFieldListLegend' => '<i>كل قيمة تÙصل عن الأخرى بÙاصلة</i>',
+ 'ModelFieldDisplayAs' => 'عرض بهيئة: ',
+ 'ModelFieldDisplayAsText' => 'نص',
+ 'ModelFieldDisplayAsGraphical' => 'عنصر تقييم',
+ 'ModelFieldTypeShortText' => 'نص قصير',
+ 'ModelFieldTypeLongText' => 'نص طويل',
+ 'ModelFieldTypeYesNo' => 'نعم/لا',
+ 'ModelFieldTypeNumber' => 'عدد',
+ 'ModelFieldTypeDate' => 'تاريخ',
+ 'ModelFieldTypeOptions' => 'قائمة قيم ذات تعري٠مسبق',
+ 'ModelFieldTypeImage' => 'صورة',
+ 'ModelFieldTypeSingleList' => 'قائمة بسيطة',
+ 'ModelFieldTypeFile' => 'ملÙ',
+ 'ModelFieldTypeFormatted' => 'يعتمد على الحقول الأخرى',
+ 'ModelFieldParameters' => 'وسائط',
+ 'ModelFieldHasHistory' => 'إستعمال المحÙوظات',
+ 'ModelFieldFlat' => 'عرض ضمن صÙÙ‘ واحد',
+ 'ModelFieldStep' => 'خطوة الزيادة:',
+ 'ModelFieldFileFormat' => 'تنسيق الملÙ:',
+ 'ModelFieldFileFile' => 'مل٠بسيط',
+ 'ModelFieldFileImage' => 'صورة',
+ 'ModelFieldFileVideo' => 'Ùيديو',
+ 'ModelFieldFileAudio' => 'صوت',
+ 'ModelFieldFileProgram' => 'برنامج',
+ 'ModelFieldFileUrl' => 'رابط',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'حقول للأستعمال',
+ 'ModelOptionsFieldsAuto' => 'تلقائي',
+ 'ModelOptionsFieldsNone' => 'لا شيء',
+ 'ModelOptionsFieldsTitle' => 'حسب العنوان',
+ 'ModelOptionsFieldsId' => 'حسب المعرّÙ',
+ 'ModelOptionsFieldsCover' => 'حسب الغلاÙ',
+ 'ModelOptionsFieldsPlay' => 'من أجل زر القراءة',
+ 'ModelCollectionSettings' => 'إعدادات المجموعة',
+ 'ModelCollectionSettingsLending' => 'إمكانية إعارة العناصر',
+ 'ModelCollectionSettingsTagging' => 'عناصر يسمح بوسمها',
+ 'ModelFilterActivated' => 'عرض ضمن صندوق البحث',
+ 'ModelFilterComparison' => 'مقارنة',
+ 'ModelFilterContain' => 'يحتوي',
+ 'ModelFilterDoesNotContain' => 'لا يحتوي على',
+ 'ModelFilterRegexp' => 'تعبير منتظم',
+ 'ModelFilterRange' => 'مجال',
+ 'ModelFilterNumeric' => 'المقارنة عددية',
+ 'ModelFilterQuick' => 'إنشاء تصÙية سريعة',
+ 'ModelTooltipName' => 'إستعمل إسماً من أجل إعادة إستعمال هذا النموذج لمجموعات أخرى. ÙÙŠ حال كان Ùارغاً، الإعدادات سيتم تخزينها مباشرة
+ضمن مل٠المجموعة Ù†Ùسه',
+ 'ModelTooltipLabel' => 'إسم الحقل كما سيتم إظهاره',
+ 'ModelTooltipGroup' => 'يستعمل من أجل تجميع الحقول. جميع العناصر التي لا تحتوي على قيم سيتم تجميعها ضمن مجموعة Ø¥Ùتراضية',
+ 'ModelTooltipHistory' => 'القيم المدخلة سابقاً سيتم تخزينها ضمن قائمة مرتبطة بالحقل',
+ 'ModelTooltipFormat' => 'تستعمل هذه الصيغة لتخصيص طريقة Ùتح المل٠بإستعمال زر القراءة',
+ 'ModelTooltipLending' => 'سيتم إضاÙØ© بعض الحقول من أجل إدارة الإستعارة',
+ 'ModelTooltipTagging' => 'إضاÙØ© بعض الحقول من أجل إدارة الوسوم',
+ 'ModelTooltipNumeric' => 'سيتم معاملة جميع المقارنات على أنها أعداد',
+ 'ModelTooltipQuick' => 'سيتم إضاÙØ© قائمة Ùرعية ضمن قائمة التصÙية',
+
+ 'ResultsTitle' => 'حدد عنصر', # Accepts model codes
+ 'ResultsNextTip' => 'البحث ضمن الموقع',
+ 'ResultsPreview' => 'معاينة',
+ 'ResultsInfo' => 'بإمكانك إضاÙØ© عدة عناصر للمجموعة عن طريق النقر المستمر على زر Ctrl أو Shift ثم إختيار العنصر', # Accepts model codes
+
+ 'OptionsTitle' => 'التÙضيلات',
+ 'OptionsExpertMode' => 'متقدّم',
+ 'OptionsPrograms' => 'تخصيص التطبيقات الإÙتراضية ضمن البرنامج، سيتم إستعمال Ø¥Ùتراضيات النظام ÙÙŠ حال ترك الحقل Ùارغاً',
+ 'OptionsBrowser' => 'متصÙّح الإنترنت',
+ 'OptionsPlayer' => 'قارئ الÙيديو',
+ 'OptionsAudio' => 'قارئ الصوت',
+ 'OptionsImageEditor' => 'محرر الصور',
+ 'OptionsCdDevice' => 'جهاز القرص المدمج',
+ 'OptionsImages' => 'مجلد الصوّر',
+ 'OptionsUseRelativePaths' => 'إستعمال المسارات النسبية من أجل الصوّر',
+ 'OptionsLayout' => 'تخطيط العرض',
+ 'OptionsStatus' => 'عرض شريط الحالة',
+ 'OptionsUseStars' => 'إستعمال النجوم من أجل عرض التقييم',
+ 'OptionsWarning' => 'تحذير: جميع التعديلات ستظهر عند إعادة تشغيل البرنامج، و لن تظهر مباشرة الآن',
+ 'OptionsRemoveConfirm' => 'إظهار رسالة تأكيد حذ٠العنصر',
+ 'OptionsAutoSave' => 'Ø­Ùظ المجموعة بشكل تلقائي',
+ 'OptionsAutoLoad' => 'Ùتح المجموعة السابقة عند بدء تشغيل البرنامج',
+ 'OptionsSplash' => 'عرض الشاشة الترحيبية',
+ 'OptionsTearoffMenus' => 'تمكين تثبيت القوائم',
+ 'OptionsSpellCheck' => 'إستعمال المدقق الإملائي ضمن حقول النص الطويلة',
+ 'OptionsProgramTitle' => 'حدد البرنامج الذي سيتم إستعماله',
+ 'OptionsPlugins' => 'الموقع الذي سيتم جلب البيانات منه',
+ 'OptionsAskPlugins' => 'سؤال جميع المواقع',
+ 'OptionsPluginsMulti' => 'عدد معيّن من المواقع',
+ 'OptionsPluginsMultiAsk' => 'سؤال عدد معين من المواقع',
+ 'OptionsPluginsMultiPerField' => 'Many sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each field we will fill the field with the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'تخصيص قائمة المواقع',
+ 'OptionsAskImport' => 'حدد الحقول التي سيتم إستيرادها',
+ 'OptionsProxy' => 'إستعمل البروكسي',
+ 'OptionsCookieJar' => 'إستعمال مل٠الكوكي',
+ 'OptionsLang' => 'لغة',
+ 'OptionsMain' => 'عام',
+ 'OptionsPaths' => 'مسارات',
+ 'OptionsInternet' => 'إنترنت',
+ 'OptionsConveniences' => 'ميّزات',
+ 'OptionsDisplay' => 'عرض',
+ 'OptionsToolbar' => 'شريط الأدوات',
+ 'OptionsToolbars' => {0 => 'بلا', 1 => 'صغير', 2 => 'كبير'},
+ 'OptionsToolbarPosition' => 'توضّع',
+ 'OptionsToolbarPositions' => {0 => 'ÙÙŠ الأعلى', 1 => 'ÙÙŠ الأسÙÙ„', 2 => 'ÙÙŠ اليسار', 3 => 'ÙÙŠ اليمين'},
+ 'OptionsExpandersMode' => 'طريقة إحتواء العناصر الكبيرة',
+ 'OptionsExpandersModes' => {'asis' => 'لا تÙعل شيء', 'cut' => 'إقتطاع', 'wrap' => 'إلتÙا٠السطر'},
+ 'OptionsDateFormat' => 'صيغة التاريخ',
+ 'OptionsDateFormatTooltip' => 'صيغة التاريخ. القيمة الإÙتراضية هي: %d/%m/%Y',
+ 'OptionsView' => 'قائمة العناصر',
+ 'OptionsViews' => {0 => 'نص', 1 => 'صورة', 2 => 'تÙاصيل'},
+ 'OptionsColumns' => 'أعمدة',
+ 'OptionsMailer' => 'إرسال البريد الإلكتروني بواسطة',
+ 'OptionsSMTP' => 'الملقم',
+ 'OptionsFrom' => 'عنوان بريدك الإلكتروني',
+
+ 'OptionsTransform' => 'وضع مقطع التعري٠بنهاية العناوين',
+ 'OptionsArticles' => 'مقطع التعري٠(كل مقطع Ù…Ùصول عن الآخر بÙاصلة)',
+ 'OptionsSearchStop' => 'السماح بإحباط عملية البحث',
+ 'OptionsBigPics' => 'إستعمال الصور بقياس كبير ÙÙŠ حال توÙرهم',
+
+ 'OptionsAlwaysOriginal' => 'استعمل العنوان الرئيسي كعنوان أصلي إن لم يتم تخصيصه',
+ 'OptionsRestoreAccelerators' => 'إستعادة الإختصارات الإÙتراضية',
+ 'OptionsHistory' => 'حجم المحÙوظات',
+ 'OptionsClearHistory' => 'مسح المحÙوظات',
+ 'OptionsStyle' => 'مظهرية العرض',
+ 'OptionsDontAsk' => 'لا تسألني مرة أخرى',
+ 'OptionsPathProgramsGroup' => 'تطبيقات',
+ 'OptionsProgramsSystem' => 'إستعمال البرامج المعرÙØ© من قبل النظام',
+ 'OptionsProgramsUser' => 'إستعمال البرامج المعرÙØ© من قبل المستخدم',
+ 'OptionsProgramsSet' => 'تخصيص البرامج',
+ 'OptionsPathImagesGroup' => 'صور',
+ 'OptionsInternetDataGroup' => 'استيراد البيانات',
+ 'OptionsInternetSettingsGroup' => 'إعدادات',
+ 'OptionsDisplayInformationGroup' => 'عرض المعلومات',
+
+ 'OptionsDisplayArticlesGroup' => 'مقاطع التعريÙ',
+ 'OptionsImagesDisplayGroup' => 'عرض',
+ 'OptionsImagesStyleGroup' => 'نمط',
+ 'OptionsDetailedPreferencesGroup' => 'تÙضيلات',
+#0
+ 'OptionsFeaturesConveniencesGroup' => 'وسائل الراحة',
+ 'OptionsPicturesFormat' => 'البادئة التي ستستعمل للصوّر',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'عنوان أو اسم العنصر المرتبط',
+ 'OptionsPicturesWorkingDir' => 'الصيغة %WORKING_DIR% . سيتم إستبدالها بمجلد المجموعة (تستعمل Ùقط ÙÙŠ بداية المسار)',
+ 'OptionsPicturesFileBase' => 'الصيغة %FILE_BASE% سيتم إستبدالها بواسطة إسم مل٠المجموعة دون اللاحقة (.gcs)',
+ 'OptionsPicturesWorkingDirError' => 'الصيغة %WORKING_DIR% يمكن إستعمالها Ùقط ÙÙŠ بداية المسار للصور',
+ 'OptionsConfigureMailers' => 'تهيئة برامج البريد الإلكتروني',
+
+ 'ImagesOptionsButton' => 'إعدادات',
+ 'ImagesOptionsTitle' => 'إعدادات قائمة الصوّر',
+ 'ImagesOptionsSelectColor' => 'حدد لون',
+ 'ImagesOptionsUseOverlays' => 'عرض ضمن إطار زجاجي',
+ 'ImagesOptionsBg' => 'خلÙية',
+ 'ImagesOptionsBgPicture' => 'إستعمل صورة الخلÙية',
+ 'ImagesOptionsFg'=> 'تحديد',
+ 'ImagesOptionsBgTooltip' => 'تغيير لون الخلÙية',
+ 'ImagesOptionsFgTooltip'=> 'تغيير لون التحديد',
+ 'ImagesOptionsResizeImgList' => 'تغيير عدد الأعمدة بشكل تلقائي',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'حجم',
+ 'ImagesOptionsSizeList' => {0 => 'صغير جداً', 1 => 'صغير', 2 => 'متوسط', 3 => 'كبير', 4 => 'كبير جداً'},
+ 'ImagesOptionsSizeTooltip' => 'حدد حجم الصورة',
+
+ 'DetailedOptionsTitle' => 'إعدادات قائمة تÙاصيل',
+ 'DetailedOptionsImageSize' => 'قياس الصوّر',
+ 'DetailedOptionsGroupItems' => 'تجميع العناصر بواسطة',
+ 'DetailedOptionsSecondarySort' => 'ترتيب الحقول الÙرعية',
+ 'DetailedOptionsFields' => 'حدد التي الحقول التي سيتم عرضها',
+ 'DetailedOptionsGroupedFirst' => 'Ùرز العناصر الغير مجمّعة',
+ 'DetailedOptionsAddCount' => 'إضاÙØ© عدد العناصر ضمن التصنيÙات',
+ 'ExtractButton' => 'معلومات',
+ 'ExtractTitle' => 'معلومات الملÙ',
+ 'ExtractImport' => 'إستعمل القيم',
+
+ 'FieldsListOpen' => 'Ùتح قائمة الحقول من ملÙ',
+ 'FieldsListSave' => 'Ø­Ùظ قائمة الحقول لملÙ',
+ 'FieldsListError' => 'لا يمكن إستعمال قائمة الحقول مع هذا النوع من المجموعات',
+ 'FieldsListIgnore' => '--- تجاهل',
+
+ 'ExportTitle' => 'تصدير قائمة العناصر',
+ 'ExportFilter' => 'تصدير العناصر المعروضة Ùقط',
+ 'ExportFieldsTitle' => 'حقول سيتم تصديرها',
+ 'ExportFieldsTip' => 'حدد الحقول التي تود تصديرها',
+ 'ExportWithPictures' => 'نسخ الصّور لمجلّد Ùرعي',
+ 'ExportSortBy' => 'ترتيب حسب',
+ 'ExportOrder' => 'ترتيب',
+
+ 'ImportListTitle' => 'إستيراد قائمة عناصر أخرى',
+ 'ImportExportData' => 'بيانات',
+ 'ImportExportFile' => 'ملÙ',
+ 'ImportExportFieldsUnused' => 'حقول عير مستعملة',
+ 'ImportExportFieldsUsed' => 'حقول مستعملة',
+ 'ImportExportFieldsFill' => 'إضاÙØ© الكل',
+ 'ImportExportFieldsClear' => 'إزالة الكل',
+ 'ImportExportFieldsEmpty' => 'يجب تحديد حقل واحد على الأقل',
+ 'ImportExportFileEmpty' => 'يجب تخصيص إسم الملÙ',
+ 'ImportFieldsTitle' => 'حقول سيتم إستيرادها',
+ 'ImportFieldsTip' => 'حدد الحقول التي تريد إستيرادها',
+ 'ImportNewList' => 'إنشاء مجموعة جديدة',
+ 'ImportCurrentList' => 'إضاÙØ© للمجموعة الحالية',
+ 'ImportDropError' => 'حدث خطأ أثناء Ùتح الملÙ. القائمة السابقة سيعاد تحميلها من جديد',
+ 'ImportGenerateId' => 'إنشاء رقم معرّ٠من أجل كل عنصر',
+
+ 'FileChooserOpenFile' => 'قم بتحديد مل٠ليتم إستعاله',
+ 'FileChooserDirectory' => 'مجلد',
+ 'FileChooserOpenDirectory' => 'حدد مجلد',
+ 'FileChooserOverwrite' => 'المل٠موجود مسبقاً. هل تود إستبداله؟',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'مدمج',
+ 'PanelReadOnly' => 'للقراءة Ùقط',
+ 'PanelForm' => 'صÙحات',
+
+ 'PanelSearchButton' => 'جلب المعلومات',
+ 'PanelSearchTip' => 'البحث بالإنترنت عن المعلومات التي تحمل هذا الإسم',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'إنقر على الصورة من أجل تحديد واحدة أخرى ',
+ 'PanelImageTipView' => ' إنقر على الصورة من أجل مشاهدة القياس الأصلي',
+ 'PanelImageTipMenu' => ' إنقر على الزر الأيمن للÙأرة من أجل مزيد من الخيارات',
+ 'PanelImageTitle' => 'حدد صورة',
+ 'PanelImageNoImage' => 'لا توجد صورة',
+ 'PanelSelectFileTitle' => 'حدد ملÙ',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'إستعادة الإÙتراضيات',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'من',
+ 'PanelTo' =>'إلى',
+
+ 'PanelWeb' => 'عرض المعلومات',
+ 'PanelWebTip' => 'عرض المعلومات من الإنترنت حول هذا العنصر', # Accepts model codes
+ 'PanelRemoveTip' => 'حذ٠العنصر الحالي', # Accepts model codes
+
+ 'PanelDateSelect' => 'حدد التاريخ',
+ 'PanelNobody' => 'لا أحد',
+ 'PanelUnknown' => 'غير معروÙ',
+ 'PanelAdded' => 'إضاÙØ© التاريخ',
+ 'PanelRating' => 'تقييم',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'المكان',
+
+ 'PanelLending' => 'إعارة',
+ 'PanelBorrower' => 'مستعير',
+
+ 'PanelLendDate' => 'تاريخ الإعارة',
+ 'PanelHistory' => 'تاريخ الإعارة',
+ 'PanelReturned' => 'عنصر Ù…Ùعاد', # Accepts model codes
+ 'PanelReturnDate' => 'تاريخ الإعادة',
+ 'PanelLendedYes' => 'Ù…Ùعار',
+ 'PanelLendedNo' => 'متاح',
+
+ 'PanelTags' => 'وسوم',
+ 'PanelFavourite' => 'محÙوظات',
+ 'TagsAssigned' => 'وسوم مستعملة',
+
+ 'PanelUser' => 'حقول المستخدم',
+
+ 'CheckUndef' => 'اما',
+ 'CheckYes' => 'نعم',
+ 'CheckNo' => 'لا',
+
+ 'ToolbarAll' => 'عرض الكل',
+ 'ToolbarAllTooltip' => 'عرض كل العناصر',
+ 'ToolbarGroupBy' => 'تجميع حسب',
+ 'ToolbarGroupByTooltip' => 'حدد الحقل الذي سيستعمل من أجل تجميع عناصر القائمة',
+ 'ToolbarQuickSearch' => 'بحث سريع',
+ 'ToolbarQuickSearchLabel' => 'بحث',
+ 'ToolbarQuickSearchTooltip' => 'قم بتحديد الحقل الذي سيتم البحث ضمنه.',
+ 'ToolbarSeparator' => ' Ùاصل',
+
+ 'PluginsTitle' => 'البحث عن عنصر',
+ 'PluginsQuery' => 'إستعلام',
+ 'PluginsFrame' => 'موقع البحث',
+ 'PluginsLogo' => 'الشعار',
+ 'PluginsName' => 'الإسم',
+ 'PluginsSearchFields' => 'حقول البحث',
+ 'PluginsAuthor' => 'المؤلÙ',
+ 'PluginsLang' => 'اللغة',
+ 'PluginsUseSite' => 'أستخدم الموقع المحدّد من أجل عمليات البحث المستقبلية',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'إعدادات الإستعارة',
+ 'BorrowersList' => 'المستعيرون',
+ 'BorrowersName' => 'إسم',
+ 'BorrowersEmail' => 'بريد إلكتروني',
+ 'BorrowersAdd' => 'إضاÙØ©',
+ 'BorrowersRemove' => 'إزالة',
+ 'BorrowersEdit' => 'تحرير',
+ 'BorrowersTemplate' => 'قالب البريد',
+ 'BorrowersSubject' => 'عنوان الرسالة',
+ 'BorrowersNotice1' => '%1 سيتم إستبداله بإسم المستعير',
+ 'BorrowersNotice2' => '%2 سيتم إستبداله بعنوان العنصر',
+ 'BorrowersNotice3' => '%3 سيتم إستبداله بتاريخ الإستعارة',
+
+ 'BorrowersImportTitle' => 'إستيراد معلومات المستعيرين',
+ 'BorrowersImportType' => 'تنسيق الملÙ:',
+ 'BorrowersImportFile' => 'ملÙ:',
+
+ 'BorrowedTitle' => 'عناصر Ù…Ùعارة', # Accepts model codes
+ 'BorrowedDate' => 'منذ',
+ 'BorrowedDisplayInPanel' => 'عرض العنصر ÙÙŠ الناÙذة الرئيسية', # Accepts model codes
+
+ 'MailTitle' => 'إرسال رسالة إلكترونية',
+ 'MailFrom' => 'من: ',
+ 'MailTo' => 'إلى: ',
+ 'MailSubject' => 'عنوان الرسالة: ',
+ 'MailSmtpError' => 'حدث خطأ لدى محاولة الإتصال بملقم SMTP',
+ 'MailSendmailError' => 'حدث خطأ لدى محاولة الإتصال بواسطة Sendmail',
+
+ 'SearchTooltip' => 'البحث بعن عنصر', # Accepts model codes
+ 'SearchTitle' => 'البحث عن عنصر', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'حقل سيتم إستبداله',
+ 'QueryReplaceOld' => 'القيمة الحالية',
+ 'QueryReplaceNew' => 'قيمة جديدة',
+ 'QueryReplaceLaunch' => 'إستبدال',
+
+ 'ImportWindowTitle' => 'حدد الحقول التي سيتم إستيرادها',
+ 'ImportViewPicture' => 'عرض الصورة',
+ 'ImportSelectAll' => 'تحديد الكل',
+ 'ImportSelectNone' => 'إلغاء التحديد',
+
+ 'MultiSiteTitle' => 'مواقع سيتم إستعمالها ÙÙŠ عمليات البحث',
+ 'MultiSiteUnused' => 'ملحقات غير مستعملة',
+ 'MultiSiteUsed' => 'ملحقات مستعملة',
+ 'MultiSiteLang' => 'قم بتعبئة القائمة بالملحقات العربية',
+ 'MultiSiteEmptyError' => 'لديك قائمة مواقع Ùارغة',
+ 'MultiSiteClear' => 'مسح القائمة',
+
+ 'DisplayOptionsTitle' => 'عناصر سيتم عرضها',
+ 'DisplayOptionsAll' => 'تحديد الكل',
+ 'DisplayOptionsSearch' => 'زر البحث',
+
+ 'GenresTitle' => 'نوع التحويل',
+ 'GenresCategoryName' => 'نوع سيتمل استعماله',
+ 'GenresCategoryMembers' => 'نوع سيتم استبداله',
+ 'GenresLoad' => 'Ùتح قائمة',
+ 'GenresExport' => 'Ø­Ùظ القائمة لملÙ',
+ 'GenresModify' => 'تحرير التحويل',
+
+ 'PropertiesName' => 'إسم المجموعة',
+ 'PropertiesLang' => 'رمز اللغة',
+ 'PropertiesOwner' => 'المالك',
+ 'PropertiesEmail' => 'بريد إلكتروني',
+ 'PropertiesDescription' => 'الوصÙ',
+ 'PropertiesFile' => 'معلومات الملÙ',
+ 'PropertiesFilePath' => 'مسار كامل',
+ 'PropertiesItemsNumber' => 'عدد المرات', # Accepts model codes
+ 'PropertiesFileSize' => 'حجم',
+ 'PropertiesFileSizeSymbols' => ['بايت', 'كيلوبايت', 'ميغابايت', 'جيجابايت', 'تيرابايت', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'خصائص المجموعة',
+ 'PropertiesDefaultPicture' => 'الصورة الإÙتراضية',
+
+ 'MailProgramsTitle' => 'برامج من أجل إرسال البريد الإلكتروني',
+ 'MailProgramsName' => 'الإسم',
+ 'MailProgramsCommand' => 'سطر الأوامر',
+ 'MailProgramsRestore' => 'أستعادة الإÙتراضيات',
+ 'MailProgramsAdd' => 'إضاÙØ© برنامج',
+ 'MailProgramsInstructions' => 'ÙÙŠ سطر الأوامر، البدائل التالية تقوم بـ:
+ %f يتم إستبدالها بعنوان البريد الإلكتروني للمستخدم.
+ %t يتم إستبدالها بعنوان البريد الإلكتروني للمستقبل.
+ %s يتم إستبدالها بعنوان الرسالة.
+ %b يتم إستبدالها بنص الرسالة.',
+
+ 'BookmarksBookmarks' => 'إشارات مرجعية',
+ 'BookmarksFolder' => 'مجلدات',
+ 'BookmarksLabel' => 'تسمية',
+ 'BookmarksPath' => 'مسار',
+ 'BookmarksNewFolder' => 'مجلد جديد',
+
+ 'AdvancedSearchType' => 'نوع البحث',
+ 'AdvancedSearchTypeAnd' => 'مطابقة كل المعايير', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'مطايقة معيار واحد على الأقل', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'المعيار',
+ 'AdvancedSearchAnyField' => 'أي حقل',
+ 'AdvancedSearchSaveTitle' => 'Ø­Ùظ البحث',
+ 'AdvancedSearchSaveName' => 'الإسم',
+ 'AdvancedSearchSaveOverwrite' => 'عملية بحث تم Ø­Ùظها سابقا تحمل Ù†Ùس التسمية. قم بإختيار تسمية أخرى.',
+ 'AdvancedSearchUseCase' => 'تحسس حالة الأحرÙ',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'تقرير الإبلاغ عن خطأ قام بتوليده جي سي ستار',
+ 'BugReportVersion' => 'الإصدار',
+ 'BugReportPlatform' => 'نظام التشغيل',
+ 'BugReportMessage' => 'رسالة الخطأ',
+ 'BugReportInformation' => 'معلومات إضاÙية',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..0d269e6
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::BG::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Включително имена на полета в горната чаÑÑ‚',
+ 'Separator' => 'Разделител',
+ 'Replacement' => 'Замени Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ñ',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..6f0cf6a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::BG::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..523a3ed
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::BG::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Използване Javascript',
+ 'FileTemplate' => 'Шаблон :',
+ 'Preview' => 'Предварителен изглед',
+ 'NoPreview' => 'ÐÑма наличен предварителен изглед',
+ 'Title' => 'Заглание на Ñтраница',
+ 'InfoFile' => 'СпиÑъкът на филми е във файл: ',
+ 'InfoDir' => 'ИзображениÑта Ñа в: ',
+ 'HeightImg' => 'ВиÑочина в (пикÑели) на Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° екÑпортиране: ',
+ 'OpenFileInBrowser' => 'ОтварÑне на Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» в уеб-четец',
+ 'Note' => 'СпиÑък, генериран от <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Въведете текÑÑ‚ за Ñ‚ÑŠÑ€Ñене',
+ 'SearchType1' => 'Само заглавие',
+ 'SearchType2' => 'Пълна информациÑ',
+ 'SearchButton' => 'ТърÑене',
+ 'SearchTitle' => 'Показване Ñамо на филми, отговарÑщи на предишните критерии',
+ 'AllButton' => 'Ð’Ñкички',
+ 'AllTitle' => 'Показване на вÑички филми',
+ 'Expand' => 'Разшири вÑички',
+ 'ExpandTitle' => 'Показване на цÑлата Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° филми',
+ 'Collapse' => 'Сгъване на вÑички',
+ 'CollapseTitle' => 'Сгъване на цÑлата Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° филми',
+ 'Borrowed' => 'Взет от: ',
+ 'NotBorrowed' => 'Ðаличен',
+ 'Top' => 'Горна чаÑÑ‚',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..49ecb10
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::BG::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..159da90
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::BG::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Включително DROP инÑтрукциÑ',
+ 'WithCreate' => 'Включително CREATE инÑтрукциÑ',
+ 'TableName' => 'Име на таблица',
+ 'InfoFile' => 'SQL файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..12f70bc
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::BG::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Ðрхивът е във файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..c84e405
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::BG::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Файл-шаблон',
+ 'ModelText' => 'ТекÑÑ‚ на шаблон',
+ 'Models' => 'Шаблон за използване',
+ 'UseFile' => 'Използване на файл',
+ 'UseModel' => 'Използване на текÑтова облаÑÑ‚',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..8fc4750
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::BG::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..3c4b98d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportCSV.pm
@@ -0,0 +1,43 @@
+{
+ package GCLang::BG::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Игнориране на Ð¿ÑŠÑ€Ð²Ð¸Ñ Ñ€ÐµÐ´',
+ 'Separator' => 'Разделител',
+ 'Plugin' => 'Сайт, който да бъде използван',
+ 'UseFirst' => 'Избер на Ð¿ÑŠÑ€Ð²Ð¸Ñ Ð°ÐºÐ¾ има много резултати',
+ 'SearchField' => 'Search for items using',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..be9e59d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::BG::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..d3bd629
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::BG::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportList.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportList.pm
new file mode 100644
index 0000000..608aee9
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::BG::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'СпиÑък заглавиÑ',
+ 'Plugin' => 'Сайт, който да бъде използван',
+ 'UseFirst' => 'Избер на Ð¿ÑŠÑ€Ð²Ð¸Ñ Ð°ÐºÐ¾ има много резултати',
+ 'CommentAuto' => 'Филмът е импортиран автоматично.',
+ 'CommentSite' => 'Уеб-Ñайт: ',
+ 'CommentTitle' => 'Заглавие: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3ec57b5
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::BG::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..657f7af
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::BG::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Файлът не е Tellico видео колекциÑ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..b250f4a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::BG::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..f95dc9e
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::BG::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..4426ac9
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::BG::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCbooks.pm b/lib/gcstar/GCLang/BG/GCModels/GCbooks.pm
new file mode 100644
index 0000000..a401bbd
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::BG::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => 'Books',
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'КолекциÑ',
+ Rank => 'Ранг',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCcoins.pm b/lib/gcstar/GCLang/BG/GCModels/GCcoins.pm
new file mode 100644
index 0000000..fbdade6
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::BG::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCcomics.pm b/lib/gcstar/GCLang/BG/GCModels/GCcomics.pm
new file mode 100644
index 0000000..a0f8aba
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::BG::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCfilms.pm b/lib/gcstar/GCLang/BG/GCModels/GCfilms.pm
new file mode 100644
index 0000000..b8014e3
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::BG::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Movies collection',
+ Items => 'Филми',
+ NewItem => 'Ðов филм',
+
+
+ Id => 'Id',
+ Title => 'Заглавие',
+ Date => 'Дата',
+ Time => 'ПродължителноÑÑ‚',
+ Director => 'РежиÑьор',
+ Country => 'Държава',
+ MinimumAge => 'Минимална възраÑÑ‚',
+ Genre => 'Жанр',
+ Image => 'Изображение',
+ Original => 'Оригинално заглавие',
+ Actors => 'УчаÑтват',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Коментари',
+ Synopsis => 'Резюме',
+ Seen => 'Гледан',
+ Number => '# на медии',
+ Format => 'Тип медиÑ',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Уеб',
+ Audio => 'Ðудио',
+ Video => 'Видео формат',
+ Trailer => 'Видео файл',
+ Serie => 'КолекциÑ',
+ Rank => 'Ранг',
+ Subtitles => 'Субтитри',
+
+ SeenYes => 'Показани',
+ SeenNo => 'Ðепоказани',
+
+ AgeUnrated => 'Без рейтинг',
+ AgeAll => 'Ð’Ñички възраÑти',
+ AgeParent => 'РъководÑтво на родителÑ',
+
+ Main => 'ОÑновни',
+ General => 'Общи',
+ Details => 'Детайли',
+
+ Information => 'ИнформациÑ',
+ Languages => 'Езици',
+ Encoding => 'Кодиране',
+
+ FilterAudienceAge => 'ЗрителÑка възраÑÑ‚',
+ FilterSeenNo => '_Още не показани',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Рейтинг най-малко...',
+
+ ExtractSize => 'Размер',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCgames.pm b/lib/gcstar/GCLang/BG/GCModels/GCgames.pm
new file mode 100644
index 0000000..f43aec9
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::BG::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Video games collection',
+ Items => 'Games',
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Players => 'Number of players',
+ Released => 'Release Date',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Unlockables => 'Unlockables',
+ Unlockable => 'Unlockable',
+ Howto => 'How to unlock',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..1ae618a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::BG::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCminicars.pm b/lib/gcstar/GCLang/BG/GCModels/GCminicars.pm
new file mode 100644
index 0000000..1491f8d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::BG::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCmusics.pm b/lib/gcstar/GCLang/BG/GCModels/GCmusics.pm
new file mode 100644
index 0000000..b55b554
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::BG::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => 'Albums',
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..47d7faa
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::BG::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..7b5f440
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::BG::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..05d869c
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::BG::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCstamps.pm b/lib/gcstar/GCLang/BG/GCModels/GCstamps.pm
new file mode 100644
index 0000000..1349d1d
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::BG::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCModels/GCwines.pm b/lib/gcstar/GCLang/BG/GCModels/GCwines.pm
new file mode 100644
index 0000000..2131d9a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::BG::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/BG/GCstar.pm b/lib/gcstar/GCLang/BG/GCstar.pm
new file mode 100644
index 0000000..17d1e5a
--- /dev/null
+++ b/lib/gcstar/GCLang/BG/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::BG;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Bulgarian',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Внимание</b>:
+
+ИнформациÑ, Ñвалена от уеб-Ñтраници (чрез приÑтавките за Ñ‚ÑŠÑ€Ñене) е
+ <b>Ñамо за лично ползване</b>.
+
+Ð’ÑÑкакво разпроÑтранение е забранено без <b>изричното ÑъглаÑие</b>
+на ÑобÑтвениците на Ñтраницата.
+
+За да определите ÐºÐ¾Ñ Ñтраница притежава информациÑта, можете
+да използвате <b>бутона под детайлите на филма</b>.',
+
+ 'AllItemsFiltered' => 'ÐÑма филм, отговарÑщ на критериите ви за Ñ‚ÑŠÑ€Ñене', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'ИнÑталиране в ',
+ 'InstallMandatory' => 'Задължителни компоненти',
+ 'InstallOptional' => 'Ðезадължителни компоненти',
+ 'InstallErrorMissing' => 'Грешка : Следните Perl компоненти Ñледва да Ñе инÑталират: ',
+ 'InstallPrompt' => 'ОÑновна Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° инÑталиране [/usr/local]: ',
+ 'InstallEnd' => 'Край на инÑталациÑта',
+ 'InstallNoError' => 'ÐÑма възникнали грешки',
+ 'InstallLaunch' => 'За да използвате приложението, можете да Ñтартирате ',
+ 'InstallDirectory' => 'Базова директориÑ',
+ 'InstallTitle' => 'GCstar инÑталациÑ',
+ 'InstallDependencies' => 'ЗавиÑимоÑти',
+ 'InstallPath' => 'Пътека',
+ 'InstallOptions' => 'ÐаÑтройки',
+ 'InstallSelectDirectory' => 'Изберете базова Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° инÑталациÑ',
+ 'InstallWithClean' => 'Премахване на файлове в инÑтлационната директориÑ',
+ 'InstallWithMenu' => 'ДобавÑне на GCstar в менюто',
+ 'InstallNoPermission' => 'Грешка: ÐÑмате права за пиÑане в избраната директориÑ',
+ 'InstallMissingMandatory' => 'ЛипÑват задължителни модули. ÐÑма да Ñте в ÑÑŠÑтоÑние да инÑталирате GCstar преди те да бъдат добавени на вашата ÑиÑтема.',
+ 'InstallMissingOptional' => 'ÐÑкои незадължителни завиÑимоÑти липÑват. Ð¢ÐµÑ…Ð½Ð¸Ñ ÑпиÑък е предоÑтавен по-долу. GCstar може да бъде инÑталиран, но нÑкои негови функции нÑма да бъдат налични.',
+ 'InstallMissingNone' => 'ÐÑма липÑващи завиÑимоÑти. Можете да продължите Ñ Ð¸Ð½ÑталациÑта на GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'ЛипÑващ',
+ 'InstallMissingFor' => 'ЛипÑващ за',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy to use (just press enter if none): ',
+ 'UpdateNoPermission' => 'Write permission denied in this directory: ',
+ 'UpdateNone' => 'No update have been found',
+ 'UpdateFileNotFound' => 'File not found',
+
+#Splash
+ 'SplashInit' => 'ИнициализациÑ',
+ 'SplashLoad' => 'Зареждане на колекциÑта',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Готово',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'It seems you were using GCfilms before. What do you want to import from GCfilms to GCstar (it won\'t impact GCfilms if you still want to use it)?',
+ 'GCfilmsImportOptions' => 'Settings',
+ 'GCfilmsImportData' => 'Movies list',
+
+#Menus
+ 'MenuFile' => '_Файл',
+ 'MenuNewList' => '_Ðова колекциÑ',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Скоро използвани колекции',
+ 'MenuLend' => 'Показване на заети филми', # Accepts model codes
+ 'MenuImport' => '_Импорт',
+ 'MenuExport' => '_ЕкÑпорт',
+ 'MenuAddItem' => '_Add Item', # Accepts model codes
+
+ 'MenuEdit' => '_Редактиране',
+ 'MenuDuplicate' => '_Дубликат на филм', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Премахване на филм', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_Заключване на колекциÑ',
+
+ 'MenuDisplay' => 'Ф_илтър',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Показване на _вÑички филми', # Accepts model codes
+ 'MenuNoFilter' => '_Ð’ÑÑкакъв',
+
+ 'MenuConfiguration' => '_ÐаÑтройки',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Показана информациÑ',
+ 'MenuBorrowers' => '_Ðаематели',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Конвертиране на жанр',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Помощ',
+ 'MenuHelpContent' => '_Помощ',
+ 'MenuAllPlugins' => 'View _plugins',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => '_ОтноÑно GCstar',
+
+ 'MenuNewWindow' => 'Показване на филм в _Ðов Прозорец', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand all',
+ 'ContextCollapseAll' => 'Collapse all',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Сигурни ли Ñте, че желаето премахването на филма?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'ДобавÑне на нов филм', # Accepts model codes
+ 'NoItemFound' => 'Ðе е намерен филм. Желаети ли Ñ‚ÑŠÑ€Ñене в друг Ñайт?',
+ 'OpenList' => 'ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ колекциÑ',
+ 'SaveList' => 'ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ къде да Ñе Ñъхрани колекциÑта',
+ 'SaveListTooltip' => 'СъхранÑване на текуща колекциÑ',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'УÑтановете предпочитаниÑта Ñи',
+ 'ViewTooltip' => 'ПромÑна на изгледа на колекциÑ',
+ 'PlayTooltip' => 'Възпроизвеждане на видео, аÑоцииран Ñ Ñ„Ð¸Ð»Ð¼', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Извършва Ñе Ñ‚ÑŠÑ€Ñене...',
+ 'StatusGetInfo' => 'Получаване на информациÑ...',
+ 'StatusGetImage' => 'Получаване на изображение...',
+
+ 'SaveError' => 'СпиÑъкът Ñ Ñ„Ð¸Ð»Ð¼Ð¸ не може да бъде Ñъхранен . ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÑ‚Ðµ правата за доÑтъп и наличното диÑково проÑтранÑтво.',
+ 'OpenError' => 'СпиÑъкът Ñ Ñ„Ð¸Ð»Ð¼Ð¸ не може да бъде отворен. ÐœÐ¾Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐµÐ½Ñ‚Ðµ правата за доÑтъп.',
+ 'OpenFormatError' => 'СпиÑъкът Ñ Ñ„Ð¸Ð»Ð¼Ð¸ не може да бъде отворен.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Избраната Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð·Ð° ÑъхранÑване на Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ е коректна. ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ друга.',
+ 'OptionsCreationError'=> 'Файлът Ñ Ð½Ð°Ñтройки не може да бъде Ñъздаден: ',
+ 'OptionsOpenError'=> 'Файлът Ñ Ð½Ð°Ñтройки не може да бъде отворен: ',
+ 'OptionsSaveError'=> 'Файлът Ñ Ð½Ð°Ñтройки не може да бъде Ñъхранен:',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Какво да Ñе гледа тази вечер?',
+ 'RandomError'=> 'ÐÑме филми, които да не Ñте гледали', # Accepts model codes
+ 'RandomEnd'=> 'ÐÑма повече филми', # Accepts model codes
+ 'RandomNextTip'=> 'Следващо предложение',
+ 'RandomOkTip'=> 'Приемане на този филм',
+
+ 'AboutTitle' => 'ОтноÑно GCstar',
+ 'AboutDesc' => 'Gtk2 каталог на филми',
+ 'AboutVersion' => 'ВерÑиÑ',
+ 'AboutTeam' => 'Екип',
+ 'AboutWho' => 'Christian Jodar (Tian): Мениджър на проекта, ПрограмиÑÑ‚
+Nyall Dawson (Zombiepig): ПрограмиÑÑ‚
+TPF: ПрограмиÑÑ‚
+Adolfo González: ПрограмиÑÑ‚
+',
+
+ 'AboutLicense' => 'РазпроÑтранÑва Ñе под уÑловиÑта на GNU GPL
+Ðвтор на логото le Spektre',
+ 'AboutTranslation' => 'БългарÑкиÑÑ‚ превод е направен от Филип Ðндонов',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Лого и дизайн на Ñтраницата от le Spektre',
+
+ 'ToolbarRandom' => 'Довечера',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Select a collection type',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Избор на филм', # Accepts model codes
+ 'ResultsNextTip' => 'ТърÑене в Ñледващ Ñайт',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'ПредпочитаниÑ',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Уеб-четец',
+ 'OptionsPlayer' => 'Видео плеър',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Image Editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ',
+ 'OptionsUseRelativePaths' => 'Използване на отноÑителни пътеки към изображениÑ',
+ 'OptionsLayout' => 'Оформление',
+ 'OptionsStatus' => 'Показване на ÑтатуÑ-лента',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Внимание: Промените нÑма да имат ефект докато приложението не бъде реÑтартирано.',
+ 'OptionsRemoveConfirm' => 'ИзиÑване на потвърждение преди изтриване',
+ 'OptionsAutoSave' => 'Ðвтоматично ÑъхранÑване на колекциÑ',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Показване на splash екран',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Избор на програма, коÑто да бъде използвана',
+ 'OptionsPlugins' => 'Сайтове, от които да Ñе получава информациÑ',
+ 'OptionsAskPlugins' => 'Питане (Ð’Ñички Ñайтове)',
+ 'OptionsPluginsMulti' => 'Много Ñайтове',
+ 'OptionsPluginsMultiAsk' => 'Питане (Много Ñайтове)',
+ 'OptionsPluginsMultiPerField' => 'Много Ñайтове (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'УÑтановÑване на ÑпиÑък',
+ 'OptionsAskImport' => 'Избор на полета, които да бъдат импортирани',
+ 'OptionsProxy' => 'Използване на proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Език',
+ 'OptionsMain' => 'ОÑновен',
+ 'OptionsPaths' => 'Пътеки',
+ 'OptionsInternet' => 'Интернет',
+ 'OptionsConveniences' => 'СвойÑтва',
+ 'OptionsDisplay' => 'ДиÑплей',
+ 'OptionsToolbar' => 'Лента Ñ Ð¸Ð½Ñтрументи',
+ 'OptionsToolbars' => {0 => 'Без', 1 => 'Малък', 2 => 'ГолÑм', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'ПозициÑ',
+ 'OptionsToolbarPositions' => {0 => 'Горе', 1 => 'Долу', 2 => 'ЛÑво', 3 => 'ДÑÑно'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'ДиÑплей',
+ 'OptionsViews' => {0 => 'Техт', 1 => 'Изображение', 2 => 'Детайлно'},
+ 'OptionsColumns' => 'Колони',
+ 'OptionsMailer' => 'Програма за електронна поща',
+ 'OptionsSMTP' => 'Сървър',
+ 'OptionsFrom' => 'ВашиÑÑ‚ адреÑ',
+ 'OptionsTransform' => 'ПоÑтавÑне на Ñтатиите в ÐºÑ€Ð°Ñ Ð½Ð° заглавиÑта',
+ 'OptionsArticles' => 'Статии (Разделени ÑÑŠÑ Ð·Ð°Ð¿ÐµÑ‚Ð°Ñ)',
+ 'OptionsSearchStop' => 'ПозволÑване прекъÑване на Ñ‚ÑŠÑ€Ñенето',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Използване на оÑновното заглавие ако оригиналното не е предÑтавено',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Размер на иÑториÑта',
+ 'OptionsClearHistory' => 'ИзчиÑтване на иÑториÑта',
+ 'OptionsStyle' => 'Кожа',
+ 'OptionsDontAsk' => 'Ðе питай повече',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'ÐаÑтройки',
+ 'ImagesOptionsTitle' => 'ÐаÑтройки за ÑпиÑък Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ',
+ 'ImagesOptionsSelectColor' => 'Избор на цвÑÑ‚',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Фон',
+ 'ImagesOptionsBgPicture' => 'Използване на изображение за фон',
+ 'ImagesOptionsFg'=> 'Избор',
+ 'ImagesOptionsBgTooltip' => 'ПромÑна на фонов цвÑÑ‚',
+ 'ImagesOptionsFgTooltip'=> 'ПромÑна на избран цвÑÑ‚',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Размер',
+ 'ImagesOptionsSizeList' => {0 => 'Много малък', 1 => 'Малък', 2 => 'Среден', 3 => 'ГолÑм', 4 => 'Много голÑм'},
+ 'ImagesOptionsSizeTooltip' => 'Избор на размер на изображение',
+
+ 'DetailedOptionsTitle' => 'ÐаÑтройки за детайлен ÑпиÑък',
+ 'DetailedOptionsImageSize' => 'Размер на изображение',
+ 'DetailedOptionsGroupItems' => 'Group items by',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'ИЗбор на приÑтели за показване',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'ИнформациÑ',
+ 'ExtractTitle' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð° видео файл',
+ 'ExtractImport' => 'Използване на ÑтойноÑти',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'ЕкÑпортиране на ÑпиÑък Ñ Ñ„Ð¸Ð»Ð¼Ð¸',
+ 'ExportFilter' => 'ЕкÑпортиране Ñамо на показани филми',
+ 'ExportFieldsTitle' => 'Полета, които да бъдат екÑпортирани',
+ 'ExportFieldsTip' => 'Избор на полета, които да бъдат екÑпортирани',
+ 'ExportWithPictures' => 'Копиране на изображениÑта в под-директориÑ',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Импортиране на друг ÑпиÑък Ñ Ñ„Ð¸Ð»Ð¼Ð¸',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Файл',
+ 'ImportExportFieldsUnused' => 'Ðеизползвани полета',
+ 'ImportExportFieldsUsed' => 'Използвани полета',
+ 'ImportExportFieldsFill' => 'ДобавÑне на вÑички',
+ 'ImportExportFieldsClear' => 'Премахване на вÑички',
+ 'ImportExportFieldsEmpty' => 'Ðеобходимо е да изберете поне едно поле',
+ 'ImportExportFileEmpty' => 'Ðеобходимо е да определите име на файл',
+ 'ImportFieldsTitle' => 'Полета, които да бъдат импортирани',
+ 'ImportFieldsTip' => 'Избор на полета, които желаете да бъдат импортирани',
+ 'ImportNewList' => 'Създаване на нова колекциÑ',
+ 'ImportCurrentList' => 'ДобавÑне към текущата колекциÑ',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'ÐœÐ¾Ð»Ñ Ð¸Ð·Ð±ÐµÑ€ÐµÑ‚Ðµ друг файл',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Избор на директориÑ',
+ 'FileChooserOverwrite' => 'Този файл вече ÑъщеÑтвува. Желаете ли презапиÑ?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Компактен',
+ 'PanelReadOnly' => 'Само за четене',
+ 'PanelForm' => 'Табове',
+
+ 'PanelSearchButton' => 'Добиване на информациÑ',
+ 'PanelSearchTip' => 'ТърÑене в уеб за Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñно това заглавие',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Щракнете върху изображението за да изберете друго.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' ДеÑен бутон за повече възможноÑти.',
+ 'PanelImageTitle' => 'Избор на изображение',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Избор на файл',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'Показване на информациÑ',
+ 'PanelWebTip' => 'Показване на Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ñ‚ уеб за този филм', # Accepts model codes
+ 'PanelRemoveTip' => 'Премахване на текущ филм', # Accepts model codes
+
+ 'PanelDateSelect' => 'Избор на дата',
+ 'PanelNobody' => 'Ðикой',
+ 'PanelUnknown' => 'ÐеизвеÑтен',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Рейтинг',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'МеÑтоположение',
+
+ 'PanelLending' => 'Заемане',
+ 'PanelBorrower' => 'Взел',
+ 'PanelLendDate' => 'Ðе е наличен от',
+ 'PanelHistory' => 'ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ð° заемането',
+ 'PanelReturned' => 'Върнат филм', # Accepts model codes
+ 'PanelReturnDate' => 'Дата на връщане',
+ 'PanelLendedYes' => 'Даден',
+ 'PanelLendedNo' => 'Ðаличен',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Без значение',
+ 'CheckYes' => 'Да',
+ 'CheckNo' => 'Ðе',
+
+ 'ToolbarAll' => 'Показване на вÑички',
+ 'ToolbarAllTooltip' => 'Показване на вÑички филми',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'ТърÑене на филм',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Сайт за Ñ‚ÑŠÑ€Ñене',
+ 'PluginsLogo' => 'Лого',
+ 'PluginsName' => 'Име',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Ðвтор',
+ 'PluginsLang' => 'Език',
+ 'PluginsUseSite' => 'Използване на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñайт за бъдещи Ñ‚ÑŠÑ€ÑениÑ',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Конфигуриране на наемателÑ',
+ 'BorrowersList' => 'Ðаематели',
+ 'BorrowersName' => 'Име',
+ 'BorrowersEmail' => 'Е-поща',
+ 'BorrowersAdd' => 'ДобавÑне',
+ 'BorrowersRemove' => 'Премахване',
+ 'BorrowersEdit' => 'Редактиране',
+ 'BorrowersTemplate' => 'Шаблон за пиÑмо',
+ 'BorrowersSubject' => 'Заглавие на пиÑмото',
+ 'BorrowersNotice1' => '%1 ще бъде заменено Ñ Ð¸Ð¼ÐµÑ‚Ð¾ на наемателÑ',
+ 'BorrowersNotice2' => '%2 ще бъде заменено ÑÑŠÑ Ð·Ð°Ð³Ð»Ð°Ð²Ð¸ÐµÑ‚Ð¾ на филма',
+ 'BorrowersNotice3' => '%3 ще бъде заменено Ñ Ð´Ð°Ñ‚Ð°Ñ‚Ð° на заемане',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Дадени филми', # Accepts model codes
+ 'BorrowedDate' => 'От',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Изпращане на е-поща',
+ 'MailFrom' => 'От: ',
+ 'MailTo' => 'До: ',
+ 'MailSubject' => 'Заглавие: ',
+ 'MailSmtpError' => 'Проблем при Ñвързване ÑÑŠÑ SMTP Ñървър',
+ 'MailSendmailError' => 'Проблем при Ñтартиране на sendmail',
+
+ 'SearchTooltip' => 'ТърÑене на вÑички филми', # Accepts model codes
+ 'SearchTitle' => 'ТърÑене на филм', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Текущо име',
+ 'QueryReplaceNew' => 'Ðово име',
+ 'QueryReplaceLaunch' => 'Replace',
+
+ 'ImportWindowTitle' => 'Избор на приÑтели, които да бъдат импортирани',
+ 'ImportViewPicture' => 'Показване на изображение',
+ 'ImportSelectAll' => 'Избор на вÑички',
+ 'ImportSelectNone' => 'Премахване на избор',
+
+ 'MultiSiteTitle' => 'Сайтове които да бъдат използвани за Ñ‚ÑŠÑ€Ñене',
+ 'MultiSiteUnused' => 'Ðеизползвани приÑтавки',
+ 'MultiSiteUsed' => 'ПриÑтавки, които да бъдат използвани',
+ 'MultiSiteLang' => 'Попълване на ÑпиÑъка Ñ Ð°Ð½Ð³Ð»Ð¸Ð¹Ñки приÑтавки',
+ 'MultiSiteEmptyError' => 'Вие имате празен ÑпиÑък ÑÑŠÑ Ñайтове',
+ 'MultiSiteClear' => 'ИзчиÑтване на ÑпиÑъка',
+
+ 'DisplayOptionsTitle' => 'Ðеща за показване',
+ 'DisplayOptionsAll' => 'Избор на вÑички',
+ 'DisplayOptionsSearch' => 'Бутон за Ñ‚ÑŠÑ€Ñене',
+
+ 'GenresTitle' => 'Конвертиране на жанр',
+ 'GenresCategoryName' => 'Използване на жанр',
+ 'GenresCategoryMembers' => 'Жанр за подмÑна',
+ 'GenresLoad' => 'Зареждане на ÑпиÑък',
+ 'GenresExport' => 'СъхранÑване на ÑпиÑък във файл',
+ 'GenresModify' => 'Редактиране на конвертирането',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..5fff8e4
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CA::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inclou els noms dels camps a sobre',
+ 'Separator' => 'Delimitador',
+ 'Replacement' => 'Substitueix el delimitador amb',
+ 'Charset' => 'Joc de caràcters',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..d91a1fd
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CA::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..36a86f5
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::CA::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Fitxer de plantilla invàlid',
+ 'UseFile' => 'Utilitza el fitxer especificat abaix',
+ 'TemplateExternalFile' => 'Fitxer de plantilla',
+ 'WithJS' => 'Utilitza Javascript',
+ 'FileTemplate' => 'Plantilla:',
+ 'Preview' => 'Vista prèvia',
+ 'NoPreview' => 'Vista prèvia no disponible',
+ 'Title' => 'Títol de la pàgina',
+ 'InfoFile' => 'El llistat de les pel·lícules es troba a l\'arxiu: ',
+ 'InfoDir' => 'Les imatges es troben a: ',
+ 'HeightImg' => 'Alçada en píxels de les imatges a exportar: ',
+ 'OpenFileInBrowser' => 'Obri el fitxer generat en el navegador web',
+ 'Note' => 'Llistat generat amb <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduíeu el text a cercar',
+ 'SearchType1' => 'Només el Títol',
+ 'SearchType2' => 'Tota la informació',
+ 'SearchButton' => 'Cerca',
+ 'SearchTitle' => 'Mostra només les pel·lícules coincidents amb els criteris anteriors',
+ 'AllButton' => 'Totes',
+ 'AllTitle' => 'Mostra totes les pel·lícules',
+ 'Expand' => 'Tots desplegats',
+ 'ExpandTitle' => 'Mostrar la informació de totes les pel·lícules',
+ 'Collapse' => 'Tots plegats',
+ 'CollapseTitle' => 'Oculta la informació de totes les pel·lícules',
+ 'Borrowed' => 'Prestatari: ',
+ 'NotBorrowed' => 'Disponible',
+ 'Top' => 'Amunt',
+ 'Bottom' => 'Devall',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..8297c90
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CA::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Nom de la base de dades',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..e5b7683
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CA::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inclou una instrucció DROP',
+ 'WithCreate' => 'Inclou una instrucció CREATE',
+ 'TableName' => 'Nom de la taula',
+ 'InfoFile' => 'Fitxer SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..d907044
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CA::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'L\'arxiu .tar.gz es troba a: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..129377c
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::CA::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fitxer plantilla',
+ 'ModelText' => 'Text de plantilla',
+ 'Models' => 'Plantilla a utilitzar',
+ 'UseFile' => 'Utilitza el fitxer',
+ 'UseModel' => 'Utilitza la zona de text',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9a14b8f
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::CA::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'On l\'hauria de cercar',
+ 'Default' => 'Directori predeterminat d\'Alexandria',
+ 'Specified' => 'Directori especificat a sota',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d85084f
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportCSV.pm
@@ -0,0 +1,43 @@
+{
+ package GCLang::CA::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Joc de caràcters',
+ 'Header' => 'Ignora la primera línia',
+ 'Separator' => 'Delimitador',
+ 'Plugin' => 'Lloc a utilitzar',
+ 'UseFirst' => 'Selecciona el primer si hi ha molts resultats',
+ 'SearchField' => 'Cercar articles mitjançant',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..5e17dde
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CA::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Carpeta',
+ 'Recursive' => 'Navega per sub-carpetes',
+ 'Suffixes' => 'Sufixes o extensions dels fitxers',
+ 'SuffixesTooltip' => 'Una llista separada per comes de sufixes o extensions de fitxters a considerar',
+ 'Remove' => 'Per ser borrats dels noms',
+ 'RemoveTooltip' => 'Una llista separada per comes de paraules que haurien de ser borrades dels noms de fitxers per a crear els noms que es desen',
+ 'Ask'=> 'Pregunta',
+ 'AskEnd'=> 'Pregunta al final',
+ 'AddWithoutInfo'=> 'Afegeix sense informació',
+ 'DontAdd'=> 'No afegeixis',
+ 'TakeFirst' => 'Selecciona primer',
+ 'MultipleResult'=> 'Ignora quan hi ha més d\'un resultat',
+ 'MultipleResultTooltip'=> 'El fitxer s\'afegirà sense recollir la informació si hi ha més d\'un resutat',
+ 'RemoveWholeWord' => 'Elimina només paraules senceres',
+ 'NoResult'=> 'Sense resultats',
+ 'NoResultTooltip'=> 'Què feim quan no es retorna un resultat',
+ 'RemoveTooltipWholeWord' => 'Les paraules s\'eliminaran només si apareixen com paraules senceres',
+ 'RemoveRegularExpr' => 'Expressió regular',
+ 'RemoveTooltipRegularExpr' => 'Es considera que \'Esser eliminat dels noms\' és una expressió regular',
+ 'SkipFileAlreadyInCollection' => 'Només afegeix fitxers nous',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Només afegeix fitxers que encara no estiguin en la col·lecció',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'basat en el camí cencer',
+ 'SkipFileFileName' => 'basat en el nom del fitxer',
+ 'SkipFileFileNameAndUpdate' => 'basat en el nom del fitxer (però actualitza el camí a la col·lecció)',
+ 'InfoFromFileNameRegExp' => 'Analitza el nom de fitxer amb aquesta expressió regular',
+ 'InfoFromFileNameRegExpTooltip' => 'Utilitza aquest per treure informació del nom de fitxer (després d\'eliminar l\'extensió). Deixa-ho buid si no fa falta. Camps coneguts: $T:Títol, $A:Títol alfabetitzat, $Y:Data de sortida, $S:Temporada, $E:Episodi, $N:Nom alfabetitzat de la sèrie , $x:Número de part, $y: Número total de parts',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..e1b7eef
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CA::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copia les imatges',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportList.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportList.pm
new file mode 100644
index 0000000..ad17559
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CA::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Llista de noms',
+ 'Plugin' => 'Lloc a utilitzar',
+ 'UseFirst' => 'Selecciona el primer si hi ha molts resultats',
+ 'CommentAuto' => 'Element importat automàticament.',
+ 'CommentSite' => 'Lloc web: ',
+ 'CommentTitle' => 'Títol: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..6fe44a9
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::CA::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..0d2469c
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CA::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'El fitxer no és una colecció Tellico compatible',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..e8893cf
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCTVepisodes.pm
@@ -0,0 +1,45 @@
+{
+ package GCLang::CA::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'Col·lecció de sèries (episodis) de TV',
+ Items => 'Episodis',
+ NewItem => 'Nou episodi',
+ NewSeries => 'Nova sèrie',
+ Episode => 'Episodi',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..8b80841
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::CA::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de sèries de televisió',
+ Items => { 0 => 'Sèries',
+ 1 => 'Sèrie',
+ X => 'Sèries',
+ lowercase1 => 'sèrie',
+ lowercaseX => 'sèries'
+ },
+ NewItem => 'Sèrie nova',
+ Name => 'Nom',
+ Season => 'Temporada',
+ Part => 'Part',
+ Episodes => 'Episodis',
+ FirstAired => 'Primera emissió',
+ Time => 'Durada de l\'episodi',
+ Producer => 'Productor',
+ Music => 'Música',
+ );
+ importTranslation('films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..4941aff
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::CA::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCbooks.pm b/lib/gcstar/GCLang/CA/GCModels/GCbooks.pm
new file mode 100644
index 0000000..364eeed
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CA::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de llibres',
+ Items => 'Llibres',
+ NewItem => 'Nou llibre',
+
+ Isbn => 'ISBN',
+ Title => 'Títol',
+ Cover => 'Coberta',
+ Authors => 'Autors',
+ Publisher => 'Editorial',
+ Publication => 'Data de publicació',
+ Language => 'Idioma',
+ Genre => 'Gènere',
+ Serie => 'Sèrie',
+ Rank => 'Capítol',
+ Bookdescription => 'Descripció',
+ Pages => 'Pàgines',
+ Read => 'Llegit',
+ Acquisition => 'Data d\'adquisició',
+ Edition => 'Edició',
+ Format => 'Format',
+ Comments => 'Comentaris',
+ Url => 'Pàgina Web',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detalls',
+
+ ReadNo => 'Sense llegir',
+ ReadYes => 'Llegit',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCcoins.pm b/lib/gcstar/GCLang/CA/GCModels/GCcoins.pm
new file mode 100644
index 0000000..7b9c148
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::CA::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de monedes',
+ Items => 'Monedes',
+ NewItem => 'Moneda nova',
+
+ Name => 'Nom',
+ Country => 'País',
+ Year => 'Any',
+ Currency => 'Divisa',
+ Value => 'Valor',
+ Picture => 'Imatge principal',
+ Diameter => 'Diàmetre',
+ Metal => 'Metall',
+ Edge => 'Tall',
+ Edge1 => 'Tall 1',
+ Edge2 => 'Tall 2',
+ Edge3 => 'Tall 3',
+ Edge4 => 'Tall 4',
+ Head => 'Cara',
+ Tail => 'Creu',
+ Comments => 'Comentaris',
+ History => 'Història',
+ Website => 'Lloc web',
+ Estimate => 'Estimat',
+ References => 'Referències',
+ Type => 'Tipus',
+ Coin => 'Moneda',
+ Banknote => 'Nota del banc',
+
+ Main => 'Principal',
+ Description => 'Descripció',
+ Other => 'Altra informació',
+ Pictures => 'Imatges',
+
+ Condition => 'Condició (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCcomics.pm b/lib/gcstar/GCLang/CA/GCModels/GCcomics.pm
new file mode 100644
index 0000000..87527e5
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::CA::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCfilms.pm b/lib/gcstar/GCLang/CA/GCModels/GCfilms.pm
new file mode 100644
index 0000000..19dd082
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::CA::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de pel·lícules',
+ Items => 'Pel·lícules',
+ NewItem => 'Nova pel·lícula',
+
+
+ Id => 'Id',
+ Title => 'Títol',
+ Date => 'Data de sortida',
+ Time => 'Durada',
+ Director => 'Director',
+ Country => 'Nacionalitat',
+ MinimumAge => 'Edat mínima',
+ Genre => 'Gèneres',
+ Image => 'Imatge',
+ Original => 'Títol original',
+ Actors => 'Actors',
+ Actor => 'Actor',
+ Role => 'Paper',
+ Comment => 'Comentaris',
+ Synopsis => 'Sinopsi',
+ Seen => 'Vista',
+ Number => 'Número de suport',
+ Format => 'Suport',
+ Region => 'Regió',
+ Identifier => 'Identificador',
+ Url => 'Pàgina web',
+ Audio => 'Audio',
+ Video => 'Format de vídeo',
+ Trailer => 'Fitxer de vídeo',
+ Serie => 'Sèrie',
+ Rank => 'Capítol',
+ Subtitles => 'Subtítols',
+ Added => 'Afegida el (data)',
+
+ SeenYes => 'Vista',
+ SeenNo => 'Sense veure',
+
+ AgeUnrated => 'Desconeguda',
+ AgeAll => 'Cap',
+ AgeParent => 'Control patern',
+
+ Main => 'Elements principals',
+ General => 'General',
+ Details => 'Detalls',
+ Lending => 'Préstec',
+
+ Information => 'Informació',
+ Languages => 'Idiomes',
+ Encoding => 'Codificació',
+
+ FilterAudienceAge => 'Edat mínima',
+ FilterSeenNo => '_No vistes',
+ FilterSeenYes => '_Vistes',
+ FilterRatingSelect => 'Valoració al _menys igual a...',
+
+ ExtractSize => 'Mida',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCgames.pm b/lib/gcstar/GCLang/CA/GCModels/GCgames.pm
new file mode 100644
index 0000000..0221755
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCgames.pm
@@ -0,0 +1,83 @@
+{
+ package GCLang::CA::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de Vídeo jocs',
+ Items => {0 => 'Joc',
+ 1 => 'Joc',
+ X => 'Jocs'
+ },
+ NewItem => 'Joc nou',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plataforma',
+ Players => 'Nombre de jugadors',
+ Released => 'Data de publicació',
+ Editor => 'Editorial',
+ Developer => 'Desenvolupador',
+ Genre => 'Gènere',
+ Box => 'Caràtula',
+ Case => 'Capça',
+ Manual => 'Manual d\'instruccions',
+ Completion => 'Completat (%)',
+ Executable => 'Executable',
+ Description => 'Descripció',
+ Codes => 'Codis',
+ Code => 'Codi',
+ Effect => 'Efecte',
+ Secrets => 'Secrets',
+ Screenshots => 'Captures de pantalla',
+ Screenshot1 => 'Primera captura de pantalla',
+ Screenshot2 => 'Segona captura de pantalla',
+ Comments => 'Comentaris',
+ Url => 'Pàgina Web',
+ Unlockables => 'Desbloquejables',
+ Unlockable => 'Desbloquejable',
+ Howto => 'Com desbloquejar',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Regió',
+ SerialNumber => 'Número de sèrie',
+
+ General => 'General',
+ Details => 'Detalls',
+ Tips => 'Consells',
+ Information => 'Informació',
+
+ FilterRatingSelect => 'Valoració al _menys...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..284fe36
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CA::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCminicars.pm b/lib/gcstar/GCLang/CA/GCModels/GCminicars.pm
new file mode 100644
index 0000000..84f9484
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::CA::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'Nou vehicle',
+ Currency => 'Moneda',
+
+# Main fields
+
+ Main => 'Informació principal',
+
+ Name => 'Nom',
+ Exchange => 'Per a vendre o canviar',
+ Wanted => 'El vull',
+ Rating1 => 'Classificació principal',
+ Picture1 => 'Imatge principal',
+ Scale => 'Escala',
+ Manufacturer => 'Fabricant',
+ Constructor => 'Constructor',
+ Type1 => 'Tipus',
+ Modele => 'Model',
+ Version => 'Versió',
+ Color => 'Color del Model',
+ Pub => 'Avís',
+ Year => 'Any',
+ Reference => 'Referència',
+ Kit => 'En forma de kit',
+ Transformation => 'Transformació personal',
+ Comments1 => 'Comentaris',
+
+# Details fields
+
+ Details => 'Detalls',
+
+ MiscCharacteristics => 'Característiques diverses',
+ Material => 'Material',
+ Molding => 'Motlle',
+ Condition => 'Condició',
+ Edition => 'Edició',
+ Collectiontype => 'Nom de la col·lecció',
+ Serial => 'Sèrie',
+ Serialnumber => 'Número de sèrie',
+ Designed => 'Data de Disseny',
+ Madein => 'Data de fabricació',
+ Box1 => 'Tipus de capça',
+ Box2 => 'Descripció de la capça',
+ Containbox => 'Contingut de la capça',
+ Rating2 => 'Realisme',
+ Rating3 => 'Acabat',
+ Acquisition => 'Data d\'adquisició',
+ Location => 'Lloc d\'adquisició',
+ Buyprice => 'Preu d\'adquisició',
+ Estimate => 'Estimació',
+ Comments2 => 'Comentaris',
+ Decorationset => 'Conjunt de decoració',
+ Characters => 'Personatges',
+ CarFromFilm => 'Pel·lícula del cotxe',
+ Filmcar => 'Pel·lícula relacionada al vehicle',
+ Filmpart => 'Part de la pel·lícula/episodi',
+ Parts => 'Nombre de parts',
+ VehiculeDetails => 'Detalls del vehicle',
+ Detailsparts => 'Detalls de les parts',
+ Detailsdecorations => 'Tipus de decoracions',
+ Decorations => 'Nombre de decoracions',
+ Lwh => 'Llarg / ample / alt',
+ Weight => 'Pes',
+ Framecar => 'Xassís',
+ Bodycar => 'Carrosseria',
+ Colormirror => 'Color del model',
+ Interior => 'Interior',
+ Wheels => 'Rodes',
+ Registrationnumber1 => 'Número de registre frontal',
+ Registrationnumber2 => 'Número de registre posterior',
+ RacingCar => 'Cotxe de carreres',
+ Course => 'Carrera',
+ Courselocation => 'Lloc de la carrera',
+ Courseyear => 'Data de la carrera',
+ Team => 'Equip',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Nombre de vehicle',
+ Pub2 => 'Publicistes',
+ Finishline => 'Posició final',
+ Steeringwheel => 'Posició del volant',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catàlegs',
+
+ OfficialPicture => 'Imatge oficial',
+ Barcode => 'Codi de barres',
+ Referencemirror => 'Referència',
+ Year3 => 'Data de disponibilitat',
+ CatalogCoverPicture => 'Portada',
+ CatalogPagePicture => 'Pàgina',
+ Catalogyear => 'Any del catàleg',
+ Catalogedition => 'Edició del catàleg',
+ Catalogpage => 'Pàgina del catàleg',
+ Catalogprice => 'Preu del catàleg',
+ Personalref => 'Referència personal',
+ Websitem => 'Pàgina web del fabricant del vehicle petit',
+ Websitec => 'Pàgina web del fabricant del vehicle real',
+ Websiteo => 'Enllaç interesant',
+ Comments3 => 'Comentaris',
+
+# Pictures fields
+
+ Pictures => 'Imatges',
+
+ OthersComments => 'Observacions generals',
+ OthersDetails => 'Altres detalls',
+ Top1 => 'Amunt',
+ Back1 => 'Avall',
+ AVG => 'Frontal esquerra',
+ AV => 'Davant',
+ AVD => 'Frontal dreta',
+ G => 'Esquerra',
+ BOX => 'Capça',
+ D => 'Dreta',
+ ARG => 'Posterior esquerra',
+ AR => 'Darrera',
+ ARD => 'Posterior dreta',
+ Others => 'Altres',
+
+# PanelLending fields
+
+ LendingExplanation => 'Canvis útils durant les temporades d\'exhibicions',
+ PanelLending => 'Préstecs (per a exhibicions)',
+ Comments4 => 'Comentaris',
+
+# Realmodel fields
+
+ Realmodel => 'Vehicle real',
+
+ Difference => 'Diferències amb la miniatura',
+ Front2 => 'Davant',
+ Back2 => 'Darrera',
+ Comments5 => 'Comentaris',
+
+ References => 'Referències',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCmusics.pm b/lib/gcstar/GCLang/CA/GCModels/GCmusics.pm
new file mode 100644
index 0000000..81f6049
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::CA::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de música',
+ Items => 'Àlbums',
+ NewItem => 'Nou àlbum',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Títol',
+ Cover => 'Portada',
+ Artist => 'Artista',
+ Format => 'Format',
+ Running => 'Durada',
+ Release => 'Data de publicació',
+ Genre => 'Gènere',
+ Origin => 'Origen',
+
+#For tracks list
+ Tracks => 'Llista de cançons',
+ Number => 'Nombre',
+ Track => 'Títol',
+ Time => 'Durada',
+
+ Composer => 'Compositor',
+ Producer => 'Productor',
+ Playlist => 'Llista de reproducció',
+ Comments => 'Comentaris',
+ Label => 'Etiqueta',
+ Url => 'Pàgina Web',
+
+ General => 'General',
+ Details => 'Detalls',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..4404abb
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::CA::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..9c7c04e
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::CA::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de targetes intel·ligents',
+ Items => {0 => 'Targeta intel·ligent',
+ 1 => 'Targeta intel·ligent',
+ X => 'Targetes intel·ligents'},
+ NewItem => 'Nova targeta intel·ligent',
+ Currency => 'Moneda',
+
+ Help => 'Ajuda pels camps',
+ Help1 => 'Ajuda',
+
+# Traduction des Champs "Main"
+
+ Main => 'La targenta intel·ligent',
+
+ Cover => 'Imatge',
+
+ Name => 'Nom',
+ Exchange => 'Per a canviar o vendre',
+ Wanted => 'La vull',
+ Rating1 => 'Classificació global',
+ TheSmartCard => 'La targeta intel·ligent, devant, derrera',
+
+ Country => 'País',
+ Color => 'Color',
+ Type1 => 'Tipus de targeta',
+ Type2 => 'Tipus de xip',
+ Dimension => 'Llarg / Ample / Gruix',
+
+ Box => 'Capça',
+ Chip => 'Xip',
+ Year1 => 'Any edició',
+ Year2 => 'Any de validesa',
+ Condition => 'Condició',
+ Charge => 'Targeta recarregable',
+ Variety => 'Varietat',
+
+ Edition => 'Nombre d\'exemplars',
+ Serial => 'Número de sèrie',
+ Theme => 'Tema',
+
+ Acquisition => 'Adquirida en',
+
+ Catalog0 => 'Catàleg',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Referència',
+ Reference1 => 'Referència Phonecote / Infopuce (YT)',
+ Reference2 => 'Referència La Cote en Poche',
+ Reference3 => 'Altra referència',
+
+ Quotationnew00 => 'Quota per a la nova targeta',
+ Quotationnew10 => 'Quota Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quota La Cote en Poche',
+ Quotationnew30 => 'Quota altra',
+ Quotationold00 => 'Quota per a la targeta usada',
+ Quotationold10 => 'Quota Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quota La Cote en Poche',
+ Quotationold30 => 'Altra quota',
+
+ Title1 => 'Títol',
+
+ Unit => 'Unitats / nombre de minuts',
+
+ Pressed => 'Tipus d\'impressió',
+ Location => 'Lloc d\'impressió',
+
+ Comments1 => 'Comentaris',
+
+ Others => 'Altres',
+ Weight => 'Pes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..449c3a3
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::CA::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de programari',
+ Items => {0 => 'Aplicació',
+ 1 => 'Aplicació',
+ X => 'Aplicacions',
+ lowercase1 => 'aplicació',
+ lowercaseX => 'aplicacions'},
+ NewItem => 'Aplicació Nova',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plataforma',
+ Released => 'Data de sortida',
+ Homepage => 'Pàgina web',
+ Editor => 'Editor',
+ Developer => 'Desenvolupador',
+ Category => 'Categoria',
+ NumberOfCopies => 'Còpies',
+ Price => 'Preu',
+ Box => 'Imatge de la caixa',
+ Case => 'Cas',
+ Manual => 'Manual d\'instruccions',
+ Executable => 'Executable',
+ Description => 'Descripció',
+ License => 'Llicència',
+ Commercial => 'Comercial',
+ FreewareNoncommercial => 'Freeware (per a us no comercial)',
+ OtherOpenSource => 'Altre codi obert',
+ PublicDomain => 'Domini públic',
+ OtherLicense => 'Altre',
+ Registration => 'Registre',
+ RegistrationInfo => 'Informació de registre',
+ RegInfo => 'Informació de registre',
+ RegistrationName => 'Nom d\'usuari',
+ RegistrationNumber => 'Número de registre',
+ PanelRegistration => 'Informació de registre',
+ RegistrationComments => 'Informació o cometaris adicionals',
+ Screenshots => 'Captures de pantalla',
+ Screenshot1 => 'Captura de la primera pantalla',
+ Screenshot2 => 'Captura de la segona pantalla',
+ Comments => 'Comentaris',
+ Url => 'Pàgina web',
+ General => 'General',
+ Details => 'Detalls',
+ Information => 'Informació',
+
+ FilterRatingSelect => 'Qualificació com a _Mínim...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCstamps.pm b/lib/gcstar/GCLang/CA/GCModels/GCstamps.pm
new file mode 100644
index 0000000..ae34f19
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::CA::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCModels/GCwines.pm b/lib/gcstar/GCLang/CA/GCModels/GCwines.pm
new file mode 100644
index 0000000..a11a2b5
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::CA::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Col·lecció de vins',
+ Items => 'Vins',
+ NewItem => 'Nou vi',
+
+ Name => 'Nom',
+ Designation => 'Designació',
+ Vintage => 'Vermada',
+ Vineyard => 'Vinya',
+ Type => 'Tipus',
+ Grapes => 'Reïm',
+ Soil => 'Sol',
+ Producer => 'Productor',
+ Country => 'Païs',
+ Volume => 'Volum (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medalles/Premis',
+
+ Storage => 'Celler',
+ Location => 'Lloc',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantitat',
+ Acquisition => 'Adquisició',
+ PurchaseDate => 'Data de compra',
+ PurchasePrice => 'Preu de compra',
+ Gift => 'Regal',
+ BottleLabel => 'Etiqueta de la botella',
+ Website => 'Referències al web',
+
+ Tasted => 'Tastat',
+ Comments => 'Comentaris',
+ Serving => 'Porció',
+ TastingField => 'Notes de degustació',
+
+ General => 'General',
+ Details => 'Detalls',
+ Tasting => 'Degustació',
+
+ TastedNo => 'No tastat',
+ TastedYes => 'Tastat',
+
+ FilterRange => 'Rang',
+ FilterTastedNo => '_Encara no tastat',
+ FilterTastedYes => 'Ja _tastat',
+ FilterRatingSelect => 'Valoració al _menys...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CA/GCstar.pm b/lib/gcstar/GCLang/CA/GCstar.pm
new file mode 100644
index 0000000..c741c5f
--- /dev/null
+++ b/lib/gcstar/GCLang/CA/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::CA;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Català',
+
+ 'Separator' => ' : ',
+
+ 'Warning' => '<b>Avís</b>:
+
+La informació descarregada des d\'Internet (gràcies als
+connectors de cerca) és només per a <b>ús personal</b>
+
+Qualsevol redistribució queda prohibida <b>sense
+l\'autorització explícita dels respectius webs</b>.
+
+Per a saber quin és el web al que pertany la informació,
+podeu usar <b>el botó situat devall dels detalls de la pel·lícula</b>.',
+
+ 'AllItemsFiltered' => 'Cap pel·lícula compleix amb els criteris de filtrat', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instal·la a ',
+ 'InstallMandatory' => 'Components obligatoris',
+ 'InstallOptional' => 'Components opcionals',
+ 'InstallErrorMissing' => 'Error: els components següents han d\'instal·lar-se: ',
+ 'InstallPrompt' => 'Directori predeterminat per a la instal·lació [/usr/local]: ',
+ 'InstallEnd' => 'Fi de la instal·lació',
+ 'InstallNoError' => 'Cap error',
+ 'InstallLaunch' => 'Per utilitzar l\'aplicació, executa ',
+ 'InstallDirectory' => 'Repertori bàsic',
+ 'InstallTitle' => 'Instal·lació de GCstar',
+ 'InstallDependencies' => 'Dependències',
+ 'InstallPath' => 'Camí',
+ 'InstallOptions' => 'Opcions',
+ 'InstallSelectDirectory' => 'Trieu el directori per a la instal·lació',
+ 'InstallWithClean' => 'Elimina arxius del directori d\'instal·lació.',
+ 'InstallWithMenu' => 'Afegeix GCstar al menú d\'Aplicacions',
+ 'InstallNoPermission' => 'Error: No teniu permisos per a instal·lar en el directori seleccionat!!',
+ 'InstallMissingMandatory' => 'Algunes dependències obligatòries no estan disponibles. No podreu instal·lar GCstar fins que s\'instal·lin en el sistema.',
+ 'InstallMissingOptional' => 'Algunes dependències opcionals no estan disponibles. Es detallen a sota. GCstar s\'instal·larà amb algunes funcions deshabilitades.',
+ 'InstallMissingNone' => 'Dependències satisfetes. Podeu continuar i instal·lar GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'No disponible',
+ 'InstallMissingFor' => 'No disponible per',
+ 'InstallCleanDirectory' => 'Eliminats els fitxers de GCstar del directori: ',
+ 'InstallCopyDirectory' => 'Copiant fitxers en el directori: ',
+ 'InstallCopyDesktop' => 'Copiant el fitxer .desktop a: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy a utilitzar (si no n\'utilitzeu cap presioneu la tecla de retorn): ',
+ 'UpdateNoPermission' => 'Permís d\'escriptura denegat en aquest directori: ',
+ 'UpdateNone' => 'No s\'ha trobat cap actualització',
+ 'UpdateFileNotFound' => 'Fitxer no trobat',
+
+#Splash
+ 'SplashInit' => 'Inicialització',
+ 'SplashLoad' => 'Carregant pel·lícules',
+ 'SplashDisplay' => 'Mostrant Col·lecció',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Fet',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sembla que heu emprat GCfilms abans. Voleu importar des de GCfilms a GCstar (no afectarà a GCfilms si el voleu seguir utilitzant)?',
+ 'GCfilmsImportOptions' => 'Configuració',
+ 'GCfilmsImportData' => 'Llista de pel.lícules',
+
+#Menus
+ 'MenuFile' => '_Fitxer',
+ 'MenuNewList' => '_Nova llista de pel·lícules',
+ 'MenuStats' => 'Estadístiques',
+ 'MenuHistory' => '_Fitxers oberts recentment',
+ 'MenuLend' => '_Mostra pel·lícules prestades', # Accepts model codes
+ 'MenuImport' => '_Importa',
+ 'MenuExport' => '_Exporta',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Edita',
+ 'MenuDuplicate' => '_Duplica pel·lícula', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Esborra pel·lícula actual', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Canvia camps Col·lecció',
+ 'MenuEditLockItems' => '_Bloqueja la informació',
+
+ 'MenuDisplay' => '_Visualitza',
+ 'MenuSavedSearches' => 'Cerques desades',
+ 'MenuSavedSearchesSave' => 'Desa la cerca actual',
+ 'MenuSavedSearchesEdit' => 'Modica cerques desades',
+ 'MenuAdvancedSearch' => '_Cerca avançada',
+ 'MenuViewAllItems' => '_Mostra tots les elements', # Accepts model codes
+ 'MenuNoFilter' => '_Tot',
+
+ 'MenuConfiguration' => '_Configura',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Informació a mostrar',
+ 'MenuBorrowers' => '_Prestataris',
+ 'MenuToolbarConfiguration' => '_Controls de la barra d\'eines',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversió de gèneres',
+
+ 'MenuBookmarks' => 'Les _meves Col·leccions',
+ 'MenuBookmarksAdd' => '_Afegeix Col·lecció actual',
+ 'MenuBookmarksEdit' => '_Edita Col·leccions marcades',
+
+ 'MenuHelp' => '_?',
+ 'MenuHelpContent' => '_?',
+ 'MenuAllPlugins' => 'Mostra _complements',
+ 'MenuBugReport' => 'Comunica un _error',
+ 'MenuAbout' => 'A propòsit de _GCstar',
+
+ 'MenuNewWindow' => 'Mostra elements a una nova finestra', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandeix tots',
+ 'ContextCollapseAll' => 'Colapsa tots',
+ 'ContextChooseImage' => 'Tria _Imatge',
+ 'ContextImageEditor' => 'Obri amb l\'editor d\'imatges',
+ 'ContextOpenWith' => 'Obri _amb',
+ 'ContextImgFront' => 'A sobre',
+ 'ContextImgBack' => 'A sota',
+ 'ContextChooseFile' => 'Tria un fitxer',
+ 'ContextChooseFolder' => 'Tria una carpeta',
+
+ 'DialogEnterNumber' => 'Entreu un valor',
+
+ 'RemoveConfirm' => 'Realment voleu eliminar aquesta pel·lícula?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Nou element', # Accepts model codes
+ 'NewItemTooltip' => 'Afegeix un nou element', # Accepts model codes
+ 'NoItemFound' => 'Cap element trobat. Voleu intentar una nova cerca a un altre lloc?',
+ 'OpenList' => 'Seleccioneu una col·lecció',
+ 'SaveList' => 'Seleccioneu on voleu desar la col·lecció',
+ 'SaveListTooltip' => 'Desa la col·lecció actual',
+ 'SaveUnsavedChanges' => 'Hi ha canvis no desats a la Col·lecció. Voleu desar-los?',
+ 'SaveDontSave' => 'No ho guardis',
+ 'PreferencesTooltip' => 'Canvia les preferències',
+ 'ViewTooltip' => 'Canvia el tipus de col·lecció',
+ 'PlayTooltip' => 'Reprodueix el vídeo associat a l\'element', # Accepts model codes
+ 'PlayFileNotFound' => 'El fitxer a reproduir no s\'ha trobat en aquest lloc:',
+ 'PlayRetry' => 'Torna-ho a intentar',
+
+ 'StatusSave' => 'Desant...',
+ 'StatusLoad' => 'Carregant...',
+ 'StatusSearch' => 'Cercant...',
+ 'StatusGetInfo' => 'Descarregant la informació...',
+ 'StatusGetImage' => 'Descarregant la imatge...',
+
+ 'SaveError' => 'Impossible desar la llista d\'elements. Comproveu els permisos i l\'espai disponible en el disc.',
+ 'OpenError' => 'Impossible obrir la llista d\'elements. Comproveu els permisos.',
+ 'OpenFormatError' => 'Impossible obrir la llista d\'elements. El format pot ser incorrecte',
+ 'OpenVersionWarning' => 'La col·lecció s\'ha creat amb una versió més recent de GCstar. Si la deseu, podeu perdre dades.',
+ 'OpenVersionQuestion' => 'Encara voleu continuar?',
+ 'ImageError' => 'El directori triat per a desar les imatges no és correcte. Voleu triar-ne un altre?',
+ 'OptionsCreationError'=> 'Impossible crear el fitxer d\'opcions: ',
+ 'OptionsOpenError'=> 'Impossible obrir el fitxer d\'opcions: ',
+ 'OptionsSaveError'=> 'Impossible desar el fitxer d\'opcions: ',
+ 'ErrorModelNotFound' => 'Model no trobat: ',
+ 'ErrorModelUserDir' => 'Els models definits per l\'usuari són a: ',
+
+ 'RandomTooltip' => 'Qué voleu veure aquesta nit?',
+ 'RandomError'=> 'No queden elements per a seleccionar', # Accepts model codes
+ 'RandomEnd'=> 'No hi ha més elements', # Accepts model codes
+ 'RandomNextTip'=> 'Següent suggerència',
+ 'RandomOkTip'=> 'Accepta aquest element',
+
+ 'AboutTitle' => 'A propòsit de GCstar',
+ 'AboutDesc' => 'Gtk2 Catàleg de pel·lícules',
+ 'AboutVersion' => 'Versió',
+ 'AboutTeam' => 'Equip',
+ 'AboutWho' => 'Christian Jodar (Tian): Gestió del projecte, Programació
+Nyall Dawson (Zombiepig): Programació
+TPF: Programació
+Adolfo González: Programació
+',
+ 'AboutLicense' => 'Distribuït segons els termes de la GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traducció: Ponç J. Llaneras',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo i disseny web per le Spektre',
+
+ 'ToolbarRandom' => 'Aquesta nit',
+
+ 'UnsavedCollection' => 'Col·lecció no desada',
+ 'ModelsSelect' => 'Seleccioneu un tipus de Col·lecció',
+ 'ModelsPersonal' => 'Models personals',
+ 'ModelsDefault' => 'Models predeterminats',
+ 'ModelsList' => 'Definició de Col·lecció',
+ 'ModelSettings' => 'Opcions de Col·lecció',
+ 'ModelNewType' => 'Nou tipus de Col·lecció',
+ 'ModelName' => 'Nom del tipus de Col·lecció:',
+ 'ModelFields' => 'Camps',
+ 'ModelOptions' => 'Opcions',
+ 'ModelFilters' => 'Filtres',
+ 'ModelNewField' => 'Nou camp',
+ 'ModelFieldInformation' => 'Informació',
+ 'ModelFieldName' => 'Etiqueta:',
+ 'ModelFieldType' => 'Tipus:',
+ 'ModelFieldGroup' => 'Grup:',
+ 'ModelFieldValues' => 'Valors',
+ 'ModelFieldInit' => 'Predeterminat:',
+ 'ModelFieldMin' => 'Mínim:',
+ 'ModelFieldMax' => 'Màxim:',
+ 'ModelFieldList' => 'Llista de valors:',
+ 'ModelFieldListLegend' => '<i>Separat per a coma</i>',
+ 'ModelFieldDisplayAs' => 'Mostra com:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Control de rati',
+ 'ModelFieldTypeShortText' => 'Text curt',
+ 'ModelFieldTypeLongText' => 'Text llarg',
+ 'ModelFieldTypeYesNo' => 'Sí/No',
+ 'ModelFieldTypeNumber' => 'Nombre',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Llista de valors predefinits',
+ 'ModelFieldTypeImage' => 'Imatge',
+ 'ModelFieldTypeSingleList' => 'Llista simple',
+ 'ModelFieldTypeFile' => 'Fitxer',
+ 'ModelFieldTypeFormatted' => 'Depèn d\'altres camps',
+ 'ModelFieldParameters' => 'Paràmetres',
+ 'ModelFieldHasHistory' => 'Utilitza un històric',
+ 'ModelFieldFlat' => 'Mostra amb una línia',
+ 'ModelFieldStep' => 'Increment:',
+ 'ModelFieldFileFormat' => 'Format del fitxer:',
+ 'ModelFieldFileFile' => 'Fitxer simple',
+ 'ModelFieldFileImage' => 'Imatge',
+ 'ModelFieldFileVideo' => 'Vídeo',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Camps a utilitzar',
+ 'ModelOptionsFieldsAuto' => 'Automàtic',
+ 'ModelOptionsFieldsNone' => 'Cap',
+ 'ModelOptionsFieldsTitle' => 'Com a títol',
+ 'ModelOptionsFieldsId' => 'Com a identificador',
+ 'ModelOptionsFieldsCover' => 'Com a coberta',
+ 'ModelOptionsFieldsPlay' => 'Com a botó de "Play"',
+ 'ModelCollectionSettings' => 'Opcions de col·lecció',
+ 'ModelCollectionSettingsLending' => 'Elements que es poden prestar',
+ 'ModelCollectionSettingsTagging' => 'Els elements es poden etiquetar',
+ 'ModelFilterActivated' => 'Hauria d\'estar al formulari de cerca',
+ 'ModelFilterComparison' => 'Comparació',
+ 'ModelFilterContain' => 'Conté',
+ 'ModelFilterDoesNotContain' => 'No conté',
+ 'ModelFilterRegexp' => 'Expressió regular',
+ 'ModelFilterRange' => 'Rang',
+ 'ModelFilterNumeric' => 'La comparació és numèrica',
+ 'ModelFilterQuick' => 'Crea un filtre ràpid',
+ 'ModelTooltipName' => 'Empra un nom per a reutilitzar aquest model per a moltes Col·leccions. Si està buid, les opcions es desaran directament dins la mateixa col·lecció',
+ 'ModelTooltipLabel' => 'El camp nom es mostrarà tal qual',
+ 'ModelTooltipGroup' => 'Utilitzat per agrupar camps. Els elements sense valor aquí estaran al grup predeterminat',
+ 'ModelTooltipHistory' => 'Els valors entrats anteriorment es desaran a una llista associada al camp',
+ 'ModelTooltipFormat' => 'Aquest format s\'utilitza per determinar l\'acció per obrir el fitxer amb el botó "Play"',
+ 'ModelTooltipLending' => 'Aquest afegirà alguns camps per manejar els préstecs',
+ 'ModelTooltipTagging' => 'Això afegirà alguns camps per manejar les etiquetes',
+ 'ModelTooltipNumeric' => 'Els valors es consideran com nombres per a la comparació',
+ 'ModelTooltipQuick' => 'Aquest afegirà un submenú al de filtres',
+
+ 'ResultsTitle' => 'Tria una pel·lícula', # Accepts model codes
+ 'ResultsNextTip' => 'Cerca en el següent lloc',
+ 'ResultsPreview' => 'Previsualitza',
+ 'ResultsInfo' => 'Podeu afegir múltiples elements a la col·lecció pitjant la tecla Ctrl o Majús i seleccionant-los', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferències',
+ 'OptionsExpertMode' => 'Mode Expert',
+ 'OptionsPrograms' => 'Especifiqueu els programes a utilitzar pels diferents continguts, deixau-ho en blanc per utilitzar els predeterminats del sistema',
+ 'OptionsBrowser' => 'Navegador d\'Internet',
+ 'OptionsPlayer' => 'Reproductor de vídeo',
+ 'OptionsAudio' => 'Reproductor d\'audio',
+ 'OptionsImageEditor' => 'Editor d\'imatges',
+ 'OptionsCdDevice' => 'Dispositiu de CD',
+ 'OptionsImages' => 'Directori d\'imatges',
+ 'OptionsUseRelativePaths' => 'Utilitza camins relatius per a les imatges',
+ 'OptionsLayout' => 'Disposició',
+ 'OptionsStatus' => 'Mostra la barra d\'estat',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Alerteu: Els canvis fets a n\'aquest formulari no es tindran en compte fins reiniciar l\'aplicació',
+ 'OptionsRemoveConfirm' => 'Demana confirmació abans d\'eliminar',
+ 'OptionsAutoSave' => 'Desa automàticament la col·lecció',
+ 'OptionsAutoLoad' => 'Carrega la col·lecció prèvia a l\'inici',
+ 'OptionsSplash' => 'Mostra la pantalla d\'inici',
+ 'OptionsTearoffMenus' => 'Activa els menús desplegables',
+ 'OptionsSpellCheck' => 'Utilitza la correcció ortogràfica pels camps de text llargs',
+ 'OptionsProgramTitle' => 'Tria el programa que ha d\'utilitzar-se',
+ 'OptionsPlugins' => 'Lloc per descarregar les fitxes',
+ 'OptionsAskPlugins' => 'Pregunta',
+ 'OptionsPluginsMulti' => 'Diversos llocs',
+ 'OptionsPluginsMultiAsk' => 'Pregunta (Diversos llocs)',
+ 'OptionsPluginsMultiPerField' => 'Molts llocs (per camp)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Molts llocs per ordre de selecció de camp',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Per a cada camp l\'omplirem amb la primera informació no buida començant per l\'esquerra',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Primer',
+ 'OptionsPluginsMultiPerFieldLast' => 'Darrer',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Elimina',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Llista de camps seleccionats buida',
+ 'OptionsPluginsList' => 'Defineix la llista',
+ 'OptionsAskImport' => 'Tria els camps que han d\'importar-se',
+ 'OptionsProxy' => 'Empra un proxy',
+ 'OptionsCookieJar' => 'Utilitza aquesta galeta jar',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Idioma',
+ 'OptionsPaths' => 'Directoris',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opcions',
+ 'OptionsDisplay' => 'Visualitza',
+ 'OptionsToolbar' => 'Barra d\'eines',
+ 'OptionsToolbars' => {0 => 'Cap', 1 => 'Petita', 2 => 'Gran', 3 => 'Ajustament per sistema'},
+ 'OptionsToolbarPosition' => 'Posició',
+ 'OptionsToolbarPositions' => {0 => 'Amunt', 1 => 'Avall', 2 => 'Esquerra', 3 => 'Dreta'},
+ 'OptionsExpandersMode' => 'Estensors massa llargs',
+ 'OptionsExpandersModes' => {'asis' => 'No facis res', 'cut' => 'Talla', 'wrap' => 'Divideix les línies'},
+ 'OptionsDateFormat' => 'Format de data',
+ 'OptionsDateFormatTooltip' => 'El format es l\'utilitzat per strftime(3). Per omissió és %d/%m/%Y',
+ 'OptionsView' => 'Llista dels elements',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Imatge', 2 => 'Detallada'},
+ 'OptionsColumns' => 'Columnes',
+ 'OptionsMailer' => 'Mètode d\'enviament dels correus electrònics',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'El vostre correu electrònic',
+ 'OptionsTransform' => 'Posar els articles al final dels títols',
+ 'OptionsArticles' => 'Articles (separats per una coma)',
+ 'OptionsSearchStop' => 'L\'usuari pot aturar las cerques',
+ 'OptionsBigPics' => 'Utilitza les imatges grans quan estiguin disponibles',
+ 'OptionsAlwaysOriginal' => 'Empra el títol principal com l\'original si no se\'n troba cap',
+ 'OptionsRestoreAccelerators' => 'Restaura acceleradors',
+ 'OptionsHistory' => 'Mida de l\'historial',
+ 'OptionsClearHistory' => 'Neteja l\'historial',
+ 'OptionsStyle' => 'Pell',
+ 'OptionsDontAsk' => 'No ho demanis mai més',
+ 'OptionsPathProgramsGroup' => 'Aplicacions',
+ 'OptionsProgramsSystem' => 'Utilitza els programes definits pel sistema',
+ 'OptionsProgramsUser' => 'Utilitza els programes especificats',
+ 'OptionsProgramsSet' => 'Estableix els programes',
+ 'OptionsPathImagesGroup' => 'Imatges',
+ 'OptionsInternetDataGroup' => 'Importa dades',
+ 'OptionsInternetSettingsGroup' => 'Opcions',
+ 'OptionsDisplayInformationGroup' => 'Mostra informació',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Mostra',
+ 'OptionsImagesStyleGroup' => 'Estil',
+ 'OptionsDetailedPreferencesGroup' => 'Preferències',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniències',
+ 'OptionsPicturesFormat' => 'Prefixe a emprar per a les imatges:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Títol o nom de l\'element associat',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% o . se substituirà amb el directori de la col·lecció (utilitzeu només en el principi del camí)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% se substituirà pel nom de la col·lecció sense el sufixe (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% només es pot emprar en el començament del camí per a les imatges',
+ 'OptionsConfigureMailers' => 'Configura els programes de correu',
+
+ 'ImagesOptionsButton' => 'Preferències',
+ 'ImagesOptionsTitle' => 'Preferències per al llistat d\'imatges',
+ 'ImagesOptionsSelectColor' => 'Trieu un color',
+ 'ImagesOptionsUseOverlays' => 'Utilitza superposició d\'imatges',
+ 'ImagesOptionsBg' => 'Fons',
+ 'ImagesOptionsBgPicture' => 'Empra una imatge de fons',
+ 'ImagesOptionsFg'=> 'Selecció',
+ 'ImagesOptionsBgTooltip' => 'Canvia el color de fons',
+ 'ImagesOptionsFgTooltip'=> 'Canvia el color de la selecció',
+ 'ImagesOptionsResizeImgList' => 'Canvia automàticament el nombre de columnes',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Mida',
+ 'ImagesOptionsSizeList' => {0 => 'Molt Petit', 1 => 'Petit', 2 => 'Mitjà', 3 => 'Gran', 4 => 'Molt Gran'},
+ 'ImagesOptionsSizeTooltip' => 'Trieu la mida de la imatge',
+
+ 'DetailedOptionsTitle' => 'Preferències del llistat detallat',
+ 'DetailedOptionsImageSize' => 'Mida de les imatges',
+ 'DetailedOptionsGroupItems' => 'Agrupar elements per',
+ 'DetailedOptionsSecondarySort' => 'Ordena els camps pels nins',
+ 'DetailedOptionsFields' => 'Trieu els camps a mostrar',
+ 'DetailedOptionsGroupedFirst' => 'Manté junts els elements orfes',
+ 'DetailedOptionsAddCount' => 'Afegeix el nombre d\'elements a les categories',
+
+ 'ExtractButton' => 'Informació',
+ 'ExtractTitle' => 'Informació del fitxer',
+ 'ExtractImport' => 'Utilitza els valors',
+
+ 'FieldsListOpen' => 'Carrega una llista de camps des d\'un fitxer',
+ 'FieldsListSave' => 'Desa una llista de camps a un fitxer',
+ 'FieldsListError' => 'Aquesta llista de camps no es pot utilitzar amb aquesta classe de Col·lecció',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exporta el llistat d\'elements',
+ 'ExportFilter' => 'Exporta només els elements mostrats',
+ 'ExportFieldsTitle' => 'Camps a exportar',
+ 'ExportFieldsTip' => 'Trieu els camps a exportar',
+ 'ExportWithPictures' => 'Copia les imatges a un subdirectori',
+ 'ExportSortBy' => 'Ordena per',
+ 'ExportOrder' => 'Ordre',
+
+ 'ImportListTitle' => 'Importa un altre llistat d\'elements',
+ 'ImportExportData' => 'Dades',
+ 'ImportExportFile' => 'fitxer',
+ 'ImportExportFieldsUnused' => 'Camps sense utilitzar',
+ 'ImportExportFieldsUsed' => 'Camps utilitzats',
+ 'ImportExportFieldsFill' => 'Tots els camps',
+ 'ImportExportFieldsClear' => 'Cap camp',
+ 'ImportExportFieldsEmpty' => 'Heu de marcar al menys un camp',
+ 'ImportExportFileEmpty' => 'Especifiqueu un nom per al fitxer',
+ 'ImportFieldsTitle' => 'Camps a importar',
+ 'ImportFieldsTip' => 'Trieu els camps a importar',
+ 'ImportNewList' => 'Crea un nou llistat',
+ 'ImportCurrentList' => 'Afegeix al llistat actual',
+ 'ImportDropError' => 'Hi ha hagut un error obrint al menys un fitxer. Es recarregarà el llistat anterior.',
+ 'ImportGenerateId' => 'Genera un identificador per a cada element',
+
+ 'FileChooserOpenFile' => 'Tria el fitxer a utilitzar',
+ 'FileChooserDirectory' => 'Directori',
+ 'FileChooserOpenDirectory' => 'Tria un directori',
+ 'FileChooserOverwrite' => 'Aquest fitxer ja existeix. Voleu substituir-lo?',
+ 'FileAllFiles' => 'Tots els fitxers',
+ 'FileVideoFiles' => 'Fitxers de vídeo',
+ 'FileEbookFiles' => 'Fitxers de llibres electrònics',
+ 'FileAudioFiles' => 'Fitxers de so',
+ 'FileGCstarFiles' => 'Col·leccions GCstar',
+
+ #Some default panels
+ 'PanelCompact' => 'Compacte',
+ 'PanelReadOnly' => 'Només de lectura',
+ 'PanelForm' => 'Pestanyes',
+
+ 'PanelSearchButton' => 'Cerca informació',
+ 'PanelSearchTip' => 'Cerca informació al web sobre aquest nom',
+ 'PanelSearchContextChooseOne' => 'Selecciona un lloc...',
+ 'PanelSearchContextMultiSite' => 'Utilitza "Molts llocs"',
+ 'PanelSearchContextMultiSitePerField' => 'Utilitza "Molts llocs per camp"',
+ 'PanelSearchContextOptions' => 'Canvia opcions...',
+ 'PanelImageTipOpen' => 'Feu clic a la imatge per triar-ne una altre.',
+ 'PanelImageTipView' => 'Feu clic a la imatge per veure-la a mida real.',
+ 'PanelImageTipMenu' => 'Feu clic amb el botó dret per a més opcions.',
+ 'PanelImageTitle' => 'Tria una imatge',
+ 'PanelImageNoImage' => 'Sense imatge',
+ 'PanelSelectFileTitle' => 'Tria un fitxer',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaura els valors per defecte',
+ 'PanelRefresh' => 'Actualitza',
+ 'PanelRefreshTip' => 'Actualitza la informació des del web',
+
+ 'PanelFrom' =>'De',
+ 'PanelTo' =>'Per a',
+
+ 'PanelWeb' => 'Veure la fitxa a Internet',
+ 'PanelWebTip' => 'Veure la fitxa de l\'element a Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Elimina l\'element actual', # Accepts model codes
+
+ 'PanelDateSelect' => 'Canvia la data',
+ 'PanelNobody' => 'Ningú',
+ 'PanelUnknown' => 'Desconegut',
+ 'PanelAdded' => 'Afegeix una data',
+ 'PanelRating' => 'Valoració',
+ 'PanelPressRating' => 'Valoració de la premsa',
+ 'PanelLocation' => 'Lloc',
+
+ 'PanelLending' => 'Préstec',
+ 'PanelBorrower' => 'Prestatari',
+ 'PanelLendDate' => 'Data',
+ 'PanelHistory' => 'Historial',
+ 'PanelReturned' => 'Element retornat', # Accepts model codes
+ 'PanelReturnDate' => 'Data de devolució',
+ 'PanelLendedYes' => 'Prestada',
+ 'PanelLendedNo' => 'Disponible',
+
+ 'PanelTags' => 'Etiquetes',
+ 'PanelFavourite' => 'Favorit',
+ 'TagsAssigned' => 'Etiquetes assignades',
+
+ 'PanelUser' => 'Camps d\'usuari',
+
+ 'CheckUndef' => 'Qualsevol',
+ 'CheckYes' => 'Sí',
+ 'CheckNo' => 'No',
+
+ 'ToolbarAll' => 'Mostra tots',
+ 'ToolbarAllTooltip' => 'Mostra tots els elements',
+ 'ToolbarGroupBy' => 'Agrupa per',
+ 'ToolbarGroupByTooltip' => 'Tria el camp per agrupar elements a la llista',
+ 'ToolbarQuickSearch' => 'Cerca ràpida',
+ 'ToolbarQuickSearchLabel' => 'Cerca',
+ 'ToolbarQuickSearchTooltip' => 'Seleccioneu el camp per a cercar. Entreu els termes de cerca i premeu Intro',
+ 'ToolbarSeparator' => ' Separador',
+
+ 'PluginsTitle' => 'Cerca un element',
+ 'PluginsQuery' => 'Petició',
+ 'PluginsFrame' => 'Lloc on cercar',
+ 'PluginsLogo' => 'Logotip',
+ 'PluginsName' => 'Nom',
+ 'PluginsSearchFields' => 'Camps de cerca',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Idioma',
+ 'PluginsUseSite' => 'Utilitza el lloc seleccionat per a futures cerques',
+ 'PluginsPreferredTooltip' => 'Lloc recomenat per GCstar',
+ 'PluginDisabled' => 'Desactivat',
+
+ 'BorrowersTitle' => 'Configuració dels prestataris',
+ 'BorrowersList' => 'Prestataris',
+ 'BorrowersName' => 'Nom',
+ 'BorrowersEmail' => 'Correu electrònic',
+ 'BorrowersAdd' => 'Afegeix',
+ 'BorrowersRemove' => 'Elimina',
+ 'BorrowersEdit' => 'Modifica',
+ 'BorrowersTemplate' => 'Model de correu electrònic',
+ 'BorrowersSubject' => 'Títol del correu electrònic',
+ 'BorrowersNotice1' => '%1 es substituirà pel nom del prestatari',
+ 'BorrowersNotice2' => '%2 es substituirà pel títol de l\'element',
+ 'BorrowersNotice3' => '%3 es substituirà per la data del préstec',
+
+ 'BorrowersImportTitle' => 'Importa informació dels prestataris',
+ 'BorrowersImportType' => 'Format del fitxer:',
+ 'BorrowersImportFile' => 'Fitxer:',
+
+ 'BorrowedTitle' => 'Elements prestats', # Accepts model codes
+ 'BorrowedDate' => 'Des del',
+ 'BorrowedDisplayInPanel' => 'Mostra l\'element a la finestra principal', # Accepts model codes
+
+ 'MailTitle' => 'Envia un correu electrònic',
+ 'MailFrom' => 'De: ',
+ 'MailTo' => 'A: ',
+ 'MailSubject' => 'Tema: ',
+ 'MailSmtpError' => 'Problema de connexió amb el servidor SMTP',
+ 'MailSendmailError' => 'Problema executant sendmail',
+
+ 'SearchTooltip' => 'Cerca a tots els elements', # Accepts model codes
+ 'SearchTitle' => 'Cerca elements', # Accepts model codes
+ 'SearchNoField' => 'No heu seleccionat cap camp a la finestra de cerca.
+Afegiu-ne alguns a la pestanya de filtres de la configuració de col·lecció.',
+
+ 'QueryReplaceField' => 'Camp per canviar',
+ 'QueryReplaceOld' => 'Nom actual',
+ 'QueryReplaceNew' => 'Nom nou',
+ 'QueryReplaceLaunch' => 'Canvia',
+
+ 'ImportWindowTitle' => 'Tria els camps que han d\'importar-se',
+ 'ImportViewPicture' => 'Mostra la imatge',
+ 'ImportSelectAll' => 'Selecciona-ho tot',
+ 'ImportSelectNone' => 'No seleccionis res',
+
+ 'MultiSiteTitle' => 'Llocs on cercar',
+ 'MultiSiteUnused' => 'Connectors no utilitzats',
+ 'MultiSiteUsed' => 'Connectors a utilitzar',
+ 'MultiSiteLang' => 'Utilitza tots els connectors espanyols',
+ 'MultiSiteEmptyError' => 'La llista de llocs està buida',
+ 'MultiSiteClear' => 'Buida la llista',
+
+ 'DisplayOptionsTitle' => 'Elements a mostrar',
+ 'DisplayOptionsAll' => 'Selecciona-ho tot',
+ 'DisplayOptionsSearch' => 'Cerca',
+
+ 'GenresTitle' => 'Conversió de gèneres',
+ 'GenresCategoryName' => 'Gènere a utilitzar',
+ 'GenresCategoryMembers' => 'Gèneres a canviar',
+ 'GenresLoad' => 'Carrega una llista predefinida',
+ 'GenresExport' => 'Desa la llista a un fitxer',
+ 'GenresModify' => 'Edita la conversió',
+
+ 'PropertiesName' => 'Nom de la col·lecció',
+ 'PropertiesLang' => 'Codi d\'idioma',
+ 'PropertiesOwner' => 'Propietari',
+ 'PropertiesEmail' => 'Correu electrònic',
+ 'PropertiesDescription' => 'Descripció',
+ 'PropertiesFile' => 'Informació del fitxer',
+ 'PropertiesFilePath' => 'Cami complet',
+ 'PropertiesItemsNumber' => 'Nombre d\'elements', # Accepts model codes
+ 'PropertiesFileSize' => 'Mida',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propietats de la col·lecció',
+ 'PropertiesDefaultPicture' => 'Imatge per omissió',
+
+ 'MailProgramsTitle' => 'Programes per enviar correu',
+ 'MailProgramsName' => 'Nom',
+ 'MailProgramsCommand' => 'Línia d\'ordres',
+ 'MailProgramsRestore' => 'Restaura els valors per defecte',
+ 'MailProgramsAdd' => 'Afegeix un programa',
+ 'MailProgramsInstructions' => 'A la línia d\'ordres, es fan algunes substitucions:
+ %f es substituirà pel correu electrònic de l\'usuari.
+ %t es substituirà per l\'adreça.
+ %s es substituirà pel subjecte del missatge.
+ %b es substituirà pel cos del missatge.',
+
+ 'BookmarksBookmarks' => 'Marques',
+ 'BookmarksFolder' => 'Directoris',
+ 'BookmarksLabel' => 'Etiqueta',
+ 'BookmarksPath' => 'Camí',
+ 'BookmarksNewFolder' => 'Nova carpeta',
+
+ 'AdvancedSearchType' => 'Tipus de cerca',
+ 'AdvancedSearchTypeAnd' => 'Elements que compleixen amb tots els criteris', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elements que compleixen al menys amb un criteri', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteri',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Desa la cerca',
+ 'AdvancedSearchSaveName' => 'Nom',
+ 'AdvancedSearchSaveOverwrite' => 'Ja existeix una cerca desada amb aquest nom. Trieu-ne un altre.',
+ 'AdvancedSearchUseCase' => 'Sensible a les majúscules',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignora els accents',
+
+ 'BugReportSubject' => 'Informe d\'error generat per GCstar',
+ 'BugReportVersion' => 'Versió',
+ 'BugReportPlatform' => 'Sistema Operatiu',
+ 'BugReportMessage' => 'Missatge d\'error',
+ 'BugReportInformation' => 'Informació adicional',
+
+#Statistics
+ 'Stats3DPie' => 'Pastís 3D',
+ 'StatsAccumulate' => 'Acumula valors',
+ 'StatsArea' => 'Àrees',
+ 'StatsBars' => 'Barres',
+ 'StatsDisplayNumber' => 'Mostra nombres',
+ 'StatsFieldToUse' => 'Camp a utilitzar',
+ 'StatsFontSize' => 'Mida de la font',
+ 'StatsGenerate' => 'Genera',
+ 'StatsHeight' => 'Alçada',
+ 'StatsHistory' => 'Història',
+ 'StatsKindOfGraph' => 'Tipus de gràfica',
+ 'StatsPie' => 'Pastís',
+ 'StatsSave' => 'Desa la imatge de les estadístiques a un fitxer',
+ 'StatsShowAllDates' => 'Mostra totes les dates',
+ 'StatsSortByNumber' => 'Ordena pel nombre de {lowercaseX}',
+ 'StatsWidth' => 'Amplada',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..ddc768d
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CS::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'VÄetnÄ› názvu polí nahoÅ™e',
+ 'Separator' => 'OddÄ›lovaÄ',
+ 'Replacement' => 'Nahradit oddÄ›lovaÄ tímto',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..7bfd2ce
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CS::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..0c0b970
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::CS::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Použít Javascript',
+ 'FileTemplate' => 'Å ablona:',
+ 'Preview' => 'Náhled',
+ 'NoPreview' => 'Náhled není k dispozici',
+ 'Title' => 'Název HTML stránky: ',
+ 'InfoFile' => 'Seznam filmů je v souboru: ',
+ 'InfoDir' => 'Obrázky jsou v: ',
+ 'HeightImg' => 'Výška obrázků (v pixelech): ',
+ 'OpenFileInBrowser' => 'Generovaný soubor otevřít ve webovém prohlížeÄi',
+ 'Note' => 'Seznam generován aplikací <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Zadejte text k vyhledání',
+ 'SearchType1' => 'Pouze název',
+ 'SearchType2' => 'VÅ¡echny informace',
+ 'SearchButton' => 'Hledání',
+ 'SearchTitle' => 'Vyhledá filmy, které vyhovují zadaným kritériím',
+ 'AllButton' => 'VÅ¡e',
+ 'AllTitle' => 'Zobrazí všechny filmy',
+ 'Expand' => 'Zobrazit vše',
+ 'ExpandTitle' => 'Zobrazí všechny informace o filmu',
+ 'Collapse' => 'Skrýt vše',
+ 'CollapseTitle' => 'Skryje všechny informace o filmu',
+ 'Borrowed' => 'Má půjÄeno: ',
+ 'NotBorrowed' => 'NepůjÄen',
+ 'Top' => 'Nahoře',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..d7dc51d
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::CS::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..60c40c2
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::CS::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'VÄetnÄ› instrukce DROP',
+ 'WithCreate' => 'VÄetnÄ› instrukce CREATE',
+ 'TableName' => 'Jméno tabulky',
+ 'InfoFile' => 'SQL soubor: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2cadd8f
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CS::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archív je v souboru: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..3ba9bed
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::CS::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Soubor Å¡ablony',
+ 'ModelText' => 'Text Å¡ablony',
+ 'Models' => 'Použít šablonu',
+ 'UseFile' => 'Použít soubor',
+ 'UseModel' => 'Použít oblast textu',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..952490c
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::CS::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Kde hledat', #Where should it search
+ 'Default' => 'Implicitní adresář Alexandrie',
+ 'Specified' => 'Adresář specifikovaný níže',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..eafe722
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CS::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignorovat první řádek',
+ 'Separator' => 'OddÄ›lovaÄ',
+ 'Plugin' => 'Použít server',
+ 'UseFirst' => 'Při více výsledcích použít první',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..03db588
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CS::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..84ae50b
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CS::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopírovat obrázky',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportList.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportList.pm
new file mode 100644
index 0000000..16c0e18
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CS::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Seznam názvů',
+ 'Plugin' => 'Použít server',
+ 'UseFirst' => 'Při více výsledcích použít první',
+ 'CommentAuto' => 'Film automaticky importován.',
+ 'CommentSite' => 'Server: ',
+ 'CommentTitle' => 'Název: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..9f33833
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::CS::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..f191f1e
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::CS::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Soubor není vytvořen aplikací Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..c913588
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::CS::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..611baeb
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::CS::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..8940f06
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::CS::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCbooks.pm b/lib/gcstar/GCLang/CS/GCModels/GCbooks.pm
new file mode 100644
index 0000000..89b0e84
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCbooks.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::CS::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka knih',
+ Items => sub {
+ my $number = shift;
+ return 'Kniha' if $number eq '1';
+ return 'Knihy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Knih';
+ },
+ NewItem => 'Nová kniha',
+
+ Isbn => 'ISBN',
+ Title => 'Název',
+ Cover => 'Obal',
+ Authors => 'Autoři',
+ Publisher => 'Vydavatel',
+ Publication => 'Datum vydání',
+ Language => 'Jazyk',
+ Genre => 'Žánr',
+ Serie => 'Sbírka',
+ Rank => 'Pořadí',
+ Bookdescription => 'Popis',
+ Pages => 'PoÄet stran',
+ Read => 'PÅ™eÄteno',
+ Acquisition => 'Datum pořízení',
+ Edition => 'Náklad',
+ Format => 'Rozměr',
+ Comments => 'Poznámky',
+ Url => 'Web',
+ Translator => 'Překladatel',
+ Artist => 'Ilustrace',
+ DigitalFile => 'Digital version',
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+
+ ReadNo => 'NepÅ™eÄteno',
+ ReadYes => 'PÅ™eÄteno',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCcoins.pm b/lib/gcstar/GCLang/CS/GCModels/GCcoins.pm
new file mode 100644
index 0000000..b19874e
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCcoins.pm
@@ -0,0 +1,107 @@
+{
+ package GCLang::CS::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka mincí',
+ Items => sub {
+ my $number = shift;
+ return 'Mince' if $number eq '1';
+ return 'Mince' if $number =~ /(?<!1)[2-4]$/;
+ return 'Mincí';
+ },
+ NewItem => 'Nová mince',
+
+ Name => 'Název',
+ Country => 'ZemÄ›',
+ Year => 'Rok',
+ Currency => 'Měna',
+ Value => 'Hodnota',
+ Picture => 'Hlavní obrázek',
+ Diameter => 'Průměr',
+ Metal => 'Kov',
+ Edge => 'Hrana',
+ Edge1 => 'Hrana 1',
+ Edge2 => 'Hrana 2',
+ Edge3 => 'Hrana 3',
+ Edge4 => 'Hrana 4',
+ Head => 'Hlava',
+ Tail => 'Orel',
+ Comments => 'Poznámky',
+ History => 'Historie',
+ Website => 'Webová stránka',
+ Estimate => 'Odhad',
+ References => 'Reference',
+ Type => 'Typ',
+ Coin => 'Mince',
+ Banknote => 'Bankovka',
+
+ Main => 'Hlavní',
+ Description => 'Popis',
+ Other => 'Další informace',
+ Pictures => 'Obrázky',
+
+ Condition => 'Stav (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCcomics.pm b/lib/gcstar/GCLang/CS/GCModels/GCcomics.pm
new file mode 100644
index 0000000..3f3e10b
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::CS::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCfilms.pm b/lib/gcstar/GCLang/CS/GCModels/GCfilms.pm
new file mode 100644
index 0000000..c22e53d
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCfilms.pm
@@ -0,0 +1,96 @@
+{
+ package GCLang::CS::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka filmů',
+ Items => sub {
+ my $number = shift;
+ return 'Film' if $number eq '1';
+ return 'Filmy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Filmů';
+ },
+ NewItem => 'Nový film',
+
+
+ Id => 'Id',
+ Title => 'Název',
+ Date => 'Datum',
+ Time => 'Délka',
+ Director => 'Režie',
+ Country => 'ZemÄ›',
+ MinimumAge => 'Věk',
+ Genre => 'Žánr',
+ Image => 'Obrázek',
+ Original => 'Původní název',
+ Actors => 'Obsazení',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Komentář',
+ Synopsis => 'Anotace',
+ Seen => 'Shlédnuto',
+ Number => 'PoÄet médií',
+ Format => 'Medium',
+ Region => 'Region',
+ Identifier => 'Identifikátor',
+ Url => 'Web',
+ Audio => 'Zvuk',
+ Video => 'Video formát',
+ Trailer => 'Soubor s filmem',
+ Serie => 'Sbírka',
+ Rank => 'Pořadí',
+ Subtitles => 'Titulky',
+
+ SeenYes => 'Shlédnuto',
+ SeenNo => 'Neshlédnuto',
+
+ AgeUnrated => 'Nestanoven',
+ AgeAll => 'Pro všechny',
+ AgeParent => 'Pod dozorem rodiÄů',
+
+ Main => 'Hlavní položky',
+ General => 'Hlavní',
+ Details => 'Detaily',
+
+ Information => 'Informace',
+ Languages => 'Jazyky',
+ Encoding => 'Kódování',
+
+ FilterAudienceAge => 'Věk diváka',
+ FilterSeenNo => '_Neshlédnuté filmy',
+ FilterSeenYes => '_Shlédnuté filmy',
+ FilterRatingSelect => '_Hodnocení minimálně...',
+
+ ExtractSize => 'Velikost',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCgames.pm b/lib/gcstar/GCLang/CS/GCModels/GCgames.pm
new file mode 100644
index 0000000..a16822f
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCgames.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::CS::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka her',
+ Items => sub {
+ my $number = shift;
+ return 'Hra' if $number eq '1';
+ return 'Hry' if $number =~ /(?<!1)[2-4]$/;
+ return 'Her';
+ },
+ NewItem => 'Nová hra',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Název',
+ Platform => 'Platforma',
+ Players => 'PoÄet hráÄů',
+ Released => 'Datum vydání',
+ Editor => 'Vydavatel',
+ Developer => 'Vývojář',
+ Genre => 'Žánr',
+ Box => 'Obrázek obalu',
+ Case => 'Obal',
+ Manual => 'Manuál',
+ Completion => 'DokonÄeno (%)',
+ Executable => 'Spustitelný soubor',
+ Description => 'Popis',
+ Codes => 'Cheaty',
+ Code => 'Cheat',
+ Effect => 'ÚÄel',
+ Secrets => 'Tajemství',
+ Screenshots => 'Snímek ze hry',
+ Screenshot1 => 'První snímek ze hry',
+ Screenshot2 => 'Druhý snímek ze hry',
+ Comments => 'Komentář',
+ Url => 'Web',
+ Unlockables => 'Možnosti odemÄení',
+ Unlockable => 'OdemÄení',
+ Howto => 'Jak odemknout',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+ Tips => 'Tipy',
+ Information => 'Informace',
+
+ FilterRatingSelect => 'Hodnocení _minimálně...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..8257a08
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::CS::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCminicars.pm b/lib/gcstar/GCLang/CS/GCModels/GCminicars.pm
new file mode 100644
index 0000000..18c9c20
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::CS::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCmusics.pm b/lib/gcstar/GCLang/CS/GCModels/GCmusics.pm
new file mode 100644
index 0000000..719bd39
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCmusics.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::CS::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka hudby',
+ Items => sub {
+ my $number = shift;
+ return 'Album' if $number eq '1';
+ return 'Alba' if $number =~ /(?<!1)[2-4]$/;
+ return 'Alb';
+ },
+ NewItem => 'Nové album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Název',
+ Cover => 'Obal',
+ Artist => 'Umělec',
+ Format => 'Formát',
+ Running => 'Délka',
+ Release => 'Datum vydání',
+ Genre => 'Žánr',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Seznam skladeb',
+ Number => 'Číslo',
+ Track => 'Název',
+ Time => 'ÄŒas',
+
+ Composer => 'Skladatel',
+ Producer => 'Producent',
+ Playlist => 'Playlist',
+ Comments => 'Poznámky',
+ Label => 'Vydavatel', #Label
+ Url => 'Webová stránka',
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..10a0117
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::CS::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..c312da1
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::CS::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..8745ae9
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::CS::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCstamps.pm b/lib/gcstar/GCLang/CS/GCModels/GCstamps.pm
new file mode 100644
index 0000000..d60bfa5
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::CS::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCModels/GCwines.pm b/lib/gcstar/GCLang/CS/GCModels/GCwines.pm
new file mode 100644
index 0000000..8d94535
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCModels/GCwines.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::CS::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Sbírka vín',
+ Items => sub {
+ my $number = shift;
+ return 'Víno' if $number eq '1';
+ return 'Vína' if $number =~ /(?<!1)[2-4]$/;
+ return 'Vín';
+ },
+ NewItem => 'Nové víno',
+
+ Name => 'Název',
+ Designation => 'Zatřídění',
+ Vintage => 'RoÄník',
+ Vineyard => 'Vinice',
+ Type => 'Typ',
+ Grapes => 'Hrozny',
+ Soil => 'Půda',
+ Producer => 'Výrobce',
+ Country => 'Původ',
+ Volume => 'Obsah (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Ocenění/Vyznamenání',
+
+ Storage => 'Uskladnění',
+ Location => 'Umístění',
+ ShelfIndex => 'Index',
+ Quantity => 'Množství',
+ Acquisition => 'Přírůstek', #Acquisition
+ PurchaseDate => 'Datum nákupu',
+ PurchasePrice => 'Nákupní cena',
+ Gift => 'Dar',
+ BottleLabel => 'Viněta',
+ Website => 'Zmínka na webu',
+
+ Tasted => 'Ochutnáno',
+ Comments => 'Poznámky',
+ Serving => 'Servírování', #Serving
+ TastingField => 'Poznámky k jakkosti', #Testing notes
+
+ General => 'Hlavní',
+ Details => 'Detaily',
+ Tasting => 'Ochutnávka',
+
+ TastedNo => 'Neochutnáno',
+ TastedYes => 'Ochutnáno',
+
+ FilterRange => '_Rozmezí',
+ FilterTastedNo => '_Neochutnáno',
+ FilterTastedYes => '_Ochutnáno',
+ FilterRatingSelect => '_Hodnocení minimálně...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/CS/GCstar.pm b/lib/gcstar/GCLang/CS/GCstar.pm
new file mode 100644
index 0000000..359f860
--- /dev/null
+++ b/lib/gcstar/GCLang/CS/GCstar.pm
@@ -0,0 +1,672 @@
+{
+ package GCLang::CS;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Czech',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Varování</b>:
+
+Informace získané ze serverů (vyhledávacím pluginem)
+jsou pouze pro <b>osobní použití</b>.
+
+Jakákoliv redistribuce je zakázána bez <b>přímého souhlasu</b> serverů.
+
+K rozlišení, který server vlastní dané informace, můžete použít
+<b>tlaÄítko pod detaily každé položky</b>.',
+
+ 'AllItemsFiltered' => 'Žádný záznam pro Vaše zadání', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instaluji do ',
+ 'InstallMandatory' => 'Povinné souÄásti',
+ 'InstallOptional' => 'Volitelné souÄásti',
+ 'InstallErrorMissing' => 'Chyba: Musí být nainstalovány následující komponenty Perlu: ',
+ 'InstallPrompt' => 'Základní adresář pro instalaci [/usr/local]: ',
+ 'InstallEnd' => 'Konec instalace',
+ 'InstallNoError' => 'Bez chyb',
+ 'InstallLaunch' => 'Před použitím aplikace musíte spustit ',
+ 'InstallDirectory' => 'Základní adresář',
+ 'InstallTitle' => 'Instalace GCstar',
+ 'InstallDependencies' => 'Závislosti',
+ 'InstallPath' => 'Cesta',
+ 'InstallOptions' => 'Volby',
+ 'InstallSelectDirectory' => 'Vyberte adresář pro instalaci',
+ 'InstallWithClean' => 'Odstraňte soubory z adresáře pro instalaci',
+ 'InstallWithMenu' => 'Přidat GCstar do menu Aplikace',
+ 'InstallNoPermission' => 'Chyba: Nemáte oprávnění k zápisu do zvoleného adresáře',
+ 'InstallMissingMandatory' => 'Povinné závislosti chybí. Instalace GCstar není možná, dokud nebudou přidány do systému.',
+ 'InstallMissingOptional' => 'NÄ›kolik volitelných souÄástí chybí. Jejich seznam je níže. GCstar může být nainstalován, ale nÄ›které vlastnosti nebudou dostupné.',
+ 'InstallMissingNone' => 'VÅ¡echny potÅ™ebné souÄásti jsou nainstalovány. Instalace může pokraÄovat.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Chybí',
+ 'InstallMissingFor' => 'Chybí',
+ 'InstallCleanDirectory' => 'Odstraňování souborů programu GCstar v adresáři: ',
+ 'InstallCopyDirectory' => 'Kopírování souborů do adresáře: ',
+ 'InstallCopyDesktop' => 'Kopírování souboru pracovní plochy do: ', #Copying desktop file in
+
+#Update
+ 'UpdateUseProxy' => 'Použít Proxy (pokud není potřeba, stiskni enter): ',
+ 'UpdateNoPermission' => 'Nemáte právo zápisu v tomto adresáři: ',
+ 'UpdateNone' => 'Update není k dispozici',
+ 'UpdateFileNotFound' => 'Soubor nenalezen',
+
+#Splash
+ 'SplashInit' => 'Inicializace',
+ 'SplashLoad' => 'Nahrávám sbírku',
+ 'SplashDisplay' => 'Zobrazuji sbírku',
+ 'SplashSort' => 'Řadím sbírku',
+ 'SplashDone' => 'Hotovo',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Zdá se, že jste dříve používal(a) GCfilms. Co chcete importovat z GCfilms do GCstar (nebude to mít vliv na GCfilms pokud jej nadále budete chtít používat)?',
+ 'GCfilmsImportOptions' => 'Nastavení',
+ 'GCfilmsImportData' => 'Seznam filmů',
+
+#Menus
+ 'MenuFile' => '_Soubor',
+ 'MenuNewList' => '_Nová sbírka',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'N_edávné sbírky',
+ 'MenuLend' => 'Zobraz _půjÄené položky', # Accepts model codes
+ 'MenuImport' => '_Import',
+ 'MenuExport' => '_Export',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Úpravy',
+ 'MenuDuplicate' => '_Duplikuj položku', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Vymaž položku', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Změň pole sbírky', # Change collection fields
+ 'MenuEditLockItems' => '_Uzamkni sbírku',
+
+ 'MenuDisplay' => '_Filtr',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => '_PokroÄilé vyhledávání',
+ 'MenuViewAllItems' => 'Zobrazit _všechny položky', # Accepts model codes
+ 'MenuNoFilter' => '_VÅ¡e',
+
+ 'MenuConfiguration' => '_Nastavení',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Zobrazené informace',
+ 'MenuBorrowers' => '_Dlužníci',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Konverze žánru',
+
+ 'MenuBookmarks' => 'Mé _Sbíky',
+ 'MenuBookmarksAdd' => '_Přidat aktuální sbírku',
+ 'MenuBookmarksEdit' => '_Editovat založené sbírky', # Edit bookmarked collections
+
+ 'MenuHelp' => '_Nápověda',
+ 'MenuHelpContent' => '_Nápověda',
+ 'MenuAllPlugins' => 'Zobrazit _pluginy',
+ 'MenuBugReport' => 'Nahlásit _chybu',
+ 'MenuAbout' => '_O aplikaci GCstar',
+
+ 'MenuNewWindow' => 'Zobrazit položky v _novém okně', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Zobraz vše',
+ 'ContextCollapseAll' => 'Skryj vše',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Prosím zadej hodnotu',
+
+ 'RemoveConfirm' => 'Opravdu chcete vymazat tuto položku?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Nová položka', # Accepts model codes
+ 'NewItemTooltip' => 'Přidat novou položku', # Accepts model codes
+ 'NoItemFound' => 'Položka nebyla nalezena. Chcete ji zkusit najít na jiném serveru?',
+ 'OpenList' => 'Prosím vyberte sbírku',
+ 'SaveList' => 'Prosím vyberte, kam uložit sbírku',
+ 'SaveListTooltip' => 'Uložit souÄasnou sbírku',
+ 'SaveUnsavedChanges' => 'Ve sbírce jste provedli změny. Chcete je nyní uložit?',
+ 'SaveDontSave' => 'Neukládat',
+ 'PreferencesTooltip' => 'Umožňuje změnu nastavení',
+ 'ViewTooltip' => 'Změní zobrazení sbírky',
+ 'PlayTooltip' => 'Přehraje video asociované filmem', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Ukládám...',
+ 'StatusLoad' => 'Nahrávám...',
+ 'StatusSearch' => 'Hledám...',
+ 'StatusGetInfo' => 'Stahuji informace...',
+ 'StatusGetImage' => 'Stahuji obrázek...',
+
+ 'SaveError' => 'Nemohu uložit seznam. Prosím zkontrolujte přístupová práva a volné místo na disku.',
+ 'OpenError' => 'Nemohu otevřít seznam. Prosím zkontrolujte přístupová práva.',
+ 'OpenFormatError' => 'Nemohu otevřít seznam.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Adresář vybraný k ukládání obrázků není správný. Prosím vyberte jiný.',
+ 'OptionsCreationError'=> 'Nemohu vytvořit soubor s nastavením: ',
+ 'OptionsOpenError'=> 'Nemohu otevřít soubor s nastavením: ',
+ 'OptionsSaveError'=> 'Nemohu uložit soubor s nastavením: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Co budu dÄ›lat dnes veÄer?',
+ 'RandomError'=> 'Nic nemáte', # Accepts model codes
+ 'RandomEnd'=> 'Nic dalšího nemáte', # Accepts model codes
+ 'RandomNextTip'=> 'Další tip',
+ 'RandomOkTip'=> 'Přijmout tento tip',
+
+ 'AboutTitle' => 'O aplikaci GCstar',
+ 'AboutDesc' => 'Katalog sbírek',
+ 'AboutVersion' => 'Verze',
+ 'AboutTeam' => 'Tým',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Distribuováno za podmínek GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Český překlad připravil Tomáš Klimek (Tomas.Klimek@gmail.com)',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo a webdesign od le Spektre',
+
+ 'ToolbarRandom' => 'Dnes veÄer',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Vyber typ sbírky',
+ 'ModelsPersonal' => 'Vlastní šablony',
+ 'ModelsDefault' => 'Standardní šablony',
+ 'ModelsList' => 'Typy sbírek',
+ 'ModelSettings' => 'Nastavení sbírek',
+ 'ModelNewType' => 'Nový typ sbírky',
+ 'ModelName' => 'Název nového typu sbírky:',
+ 'ModelFields' => 'Pole',
+ 'ModelOptions' => 'Nastavení',
+ 'ModelFilters' => 'Filtry',
+ 'ModelNewField' => 'Nové pole',
+ 'ModelFieldInformation' => 'Informace',
+ 'ModelFieldName' => 'Štítek:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Skupina:',
+ 'ModelFieldValues' => 'Hodnoty',
+ 'ModelFieldInit' => 'Implicitní:',
+ 'ModelFieldMin' => 'Minimální:',
+ 'ModelFieldMax' => 'Maximální:',
+ 'ModelFieldList' => 'Seznam hodnot:',
+ 'ModelFieldListLegend' => '<i>OddÄ›lovaÄ je Äárka</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Krátký text',
+ 'ModelFieldTypeLongText' => 'Dlouhý text',
+ 'ModelFieldTypeYesNo' => 'Ano/Ne',
+ 'ModelFieldTypeNumber' => 'Číslo',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Předdefinovaný seznam hodnot',
+ 'ModelFieldTypeImage' => 'Obrázek',
+ 'ModelFieldTypeSingleList' => 'Jednoduchý seznam',
+ 'ModelFieldTypeFile' => 'Soubor',
+ 'ModelFieldTypeFormatted' => 'Závislý na jiných typech',
+ 'ModelFieldParameters' => 'Parametry',
+ 'ModelFieldHasHistory' => 'Používat historii',
+ 'ModelFieldFlat' => 'Zobrazit v jedné řadě',
+ 'ModelFieldStep' => 'Krok přírůstku:',
+ 'ModelFieldFileFormat' => 'Typ souboru:',
+ 'ModelFieldFileFile' => 'Prostý soubor',
+ 'ModelFieldFileImage' => 'Obrázek',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Přiřazení polí',
+ 'ModelOptionsFieldsAuto' => 'Automaticky',
+ 'ModelOptionsFieldsNone' => 'Nic',
+ 'ModelOptionsFieldsTitle' => 'Nadpis',
+ 'ModelOptionsFieldsId' => 'Identifikátor',
+ 'ModelOptionsFieldsCover' => 'Obal',
+ 'ModelOptionsFieldsPlay' => 'TlaÄítko pÅ™ehrát',
+ 'ModelCollectionSettings' => 'Nastavení sbírky',
+ 'ModelCollectionSettingsLending' => 'Položky mohou být půjÄeny',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Pole bude ve vyhledávání',
+ 'ModelFilterComparison' => 'Porovnání',
+ 'ModelFilterContain' => 'Obsahuje',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Rozsah',
+ 'ModelFilterNumeric' => 'Porovnávání je Äíselné',
+ 'ModelFilterQuick' => 'Vytvořit rychlý filtr',
+ 'ModelTooltipName' => 'Zadejte název pokud chcete šablonu použít v dalších kolekcích. Pokud název nezadáte, bude nastavení uloženo přímo v kolekci',
+ 'ModelTooltipLabel' => 'Zobrazený název pole',
+ 'ModelTooltipGroup' => 'Použití pro seskupování polí. Položky bez přiřazené hodnoty budou v implicitní skupině',
+ 'ModelTooltipHistory' => 'Pro uchování dříve zadaných hodnot do seznamu přiřazenému poli',
+ 'ModelTooltipFormat' => 'Typ souboru se použije pro rozliÅ¡ení akce pÅ™i otevírání souboru tlaÄítkem PÅ™ehrát',
+ 'ModelTooltipLending' => 'Tato možnost pÅ™idá nÄ›kolik polí pro správu půjÄování',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Hodnoty budou považovány za Äísla pÅ™i porovnání',
+ 'ModelTooltipQuick' => 'Do menu filtr přidá submenu', #This will add a submenu in the Filters one
+
+ 'ResultsTitle' => 'Vyberte si ze seznamu', # Accepts model codes
+ 'ResultsNextTip' => 'Hledat na dalším serveru',
+ 'ResultsPreview' => 'Náhled',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Možnosti',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Webový prohlížeÄ',
+ 'OptionsPlayer' => 'PÅ™ehrávaÄ videa',
+ 'OptionsAudio' => 'PÅ™ehrávaÄ hudby',
+ 'OptionsImageEditor' => 'Image Editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Adresář s obrázky',
+ 'OptionsUseRelativePaths' => 'Pro obrázky používat relativní cesty',
+ 'OptionsLayout' => 'Rozložení',
+ 'OptionsStatus' => 'Zobrazit stavový řádek',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Varování: Změny v této záložce budou bez efektu až do restartu aplikace',
+ 'OptionsRemoveConfirm' => 'Před smazáním položky požadovat potvrzení',
+ 'OptionsAutoSave' => 'Automaticky ukládat sbírku',
+ 'OptionsAutoLoad' => 'Při startu nahrát předchozí sbírku',
+ 'OptionsSplash' => 'Zobrazit úvodní obrázek',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Vyberte webový prohlížeÄ',
+ 'OptionsPlugins' => 'Server, odkud stahovat data',
+ 'OptionsAskPlugins' => 'Zeptat se (všechny servery)',
+ 'OptionsPluginsMulti' => 'Více serverů',
+ 'OptionsPluginsMultiAsk' => 'Zeptat se (více serverů)',
+ 'OptionsPluginsMultiPerField' => 'Více serverů (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Nastavit seznam',
+ 'OptionsAskImport' => 'Vyberte pole, která se importují',
+ 'OptionsProxy' => 'Použít proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Jazyk',
+ 'OptionsMain' => 'Hlavní',
+ 'OptionsPaths' => 'Cesty',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Vlastnosti',
+ 'OptionsDisplay' => 'Zobrazení',
+ 'OptionsToolbar' => 'Nástrojová lišta',
+ 'OptionsToolbars' => {0 => 'Žádná', 1 => 'Malá', 2 => 'Velká', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Umístění',
+ 'OptionsToolbarPositions' => {0 => 'Nahoře', 1 => 'Dole', 2 => 'Vlevo', 3 => 'Vpravo'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Zobrazení',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Obrázek', 2 => 'Detailní'},
+ 'OptionsColumns' => 'Sloupce',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'E-mail',
+ 'OptionsTransform' => 'Členy umístit na konce názvů',
+ 'OptionsArticles' => 'ÄŒleny (oddÄ›leny Äárkou)',
+ 'OptionsSearchStop' => 'Umožnit zrušení hledání',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Použít hlavní titul jako originální titul, pokud není vyplněn',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Velikost historie',
+ 'OptionsClearHistory' => 'VyÄistit historii',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Příště se nedotazovat',
+ 'OptionsPathProgramsGroup' => 'Programy',
+ 'OptionsProgramsSystem' => 'Použít programy stanovené v systému',
+ 'OptionsProgramsUser' => 'Použít jiné programy',
+ 'OptionsProgramsSet' => 'Nastavit programy',
+ 'OptionsPathImagesGroup' => 'Obrázky',
+ 'OptionsInternetDataGroup' => 'Import dat',
+ 'OptionsInternetSettingsGroup' => 'Nastavení',
+ 'OptionsDisplayInformationGroup' => 'InformaÄní panel',
+ 'OptionsDisplayArticlesGroup' => 'ÄŒleny',
+ 'OptionsImagesDisplayGroup' => 'Zobrazení',
+ 'OptionsImagesStyleGroup' => 'Styl',
+ 'OptionsDetailedPreferencesGroup' => 'Předvolby',
+ 'OptionsFeaturesConveniencesGroup' => 'Nastavení',
+ 'OptionsPicturesFormat' => 'Předpona použitá pro obrázky:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titul nebo název asociované položky',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% nebo . bude nahrazen adresářem se sbírkou (používat pouze pro zaÄátek cesty)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% bude nahrazen názvem sbírky bez přípony (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% může být použit pouze pro zaÄátek cesty s obrázky',
+ 'OptionsConfigureMailers' => 'Nastavení e-mailových programů',
+
+ 'ImagesOptionsButton' => 'Nastavení',
+ 'ImagesOptionsTitle' => 'Nastavení pro seznam obrázků',
+ 'ImagesOptionsSelectColor' => 'Vybrat barvu',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Pozadí',
+ 'ImagesOptionsBgPicture' => 'Použít obrázek na pozadí',
+ 'ImagesOptionsFg'=> 'Výběr',
+ 'ImagesOptionsBgTooltip' => 'Změna barvy pozadí',
+ 'ImagesOptionsFgTooltip'=> 'Změna barvy výběru',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Velikost obrázků',
+ 'ImagesOptionsSizeList' => {0 => 'Velmi malé', 1 => 'Malé', 2 => 'Středně velké', 3 => 'Velké', 4 => 'Velmi velké'},
+ 'ImagesOptionsSizeTooltip' => 'Výběr velikosti obrázků',
+
+ 'DetailedOptionsTitle' => 'Nastavení detailního seznamu',
+ 'DetailedOptionsImageSize' => 'Velikost obrázků',
+ 'DetailedOptionsGroupItems' => 'Řadit podle',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Výběr zobrazených polí',
+ 'DetailedOptionsGroupedFirst' => 'Osiřelé položky nechat pohromadě',
+ 'DetailedOptionsAddCount' => 'Zobrazit poÄet prvků v kategoriích',
+
+ 'ExtractButton' => 'Informace',
+ 'ExtractTitle' => 'Informace o video souboru',
+ 'ExtractImport' => 'Použít hodnoty',
+
+ 'FieldsListOpen' => 'Nahrát seznam polí ze souboru',
+ 'FieldsListSave' => 'Uložit seznam polí do souboru',
+ 'FieldsListError' => 'Tento seznam polí nemůže být použit s tímto typem sbírky',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Export seznamu',
+ 'ExportFilter' => 'Export pouze zobrazených položek',
+ 'ExportFieldsTitle' => 'Pole k exportu',
+ 'ExportFieldsTip' => 'Vyber pole k exportu',
+ 'ExportWithPictures' => 'Zkopírovat obrázky do podadresáře',
+ 'ExportSortBy' => 'Řadit podle',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Import dalšího seznamu',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Soubor',
+ 'ImportExportFieldsUnused' => 'Nepoužité pole',
+ 'ImportExportFieldsUsed' => 'Použité pole',
+ 'ImportExportFieldsFill' => 'Přidat vše',
+ 'ImportExportFieldsClear' => 'Odebrat vše',
+ 'ImportExportFieldsEmpty' => 'Musíte vybrat alespoň jedno pole',
+ 'ImportExportFileEmpty' => 'Musíte zadat jméno souboru',
+ 'ImportFieldsTitle' => 'Pole k importu',
+ 'ImportFieldsTip' => 'Vyberte pole k importu',
+ 'ImportNewList' => 'Vytvořit novou kolekci',
+ 'ImportCurrentList' => 'Přidat do stávající kolekce',
+ 'ImportDropError' => 'PÅ™i otevírání souboru se vyskytl problém. Znovu se naÄte pÅ™edchozí seznam.',
+ 'ImportGenerateId' => 'Vytvořit identifikátor pro každou položku',
+
+ 'FileChooserOpenFile' => 'Prosím vyberte soubor',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Vyberte adresář pro ukládání obrázků',
+ 'FileChooserOverwrite' => 'Tento soubor již existuje. Chcete jej přepsat?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Kompaktní',
+ 'PanelReadOnly' => 'Pouze pro Ätení',
+ 'PanelForm' => 'Záložky',
+
+ 'PanelSearchButton' => 'Stáhnout Informace',
+ 'PanelSearchTip' => 'Hledá informace o tomto názvu na webu',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Pro výběr jiného obrázku na obrázek klikněte.',
+ 'PanelImageTipView' => 'Pro zobrazení skuteÄné velikosti obrázku na nÄ›j kliknÄ›te.',
+ 'PanelImageTipMenu' => 'Pod pravým tlaÄítkem je více voleb.',
+ 'PanelImageTitle' => 'Vyberte obrázek',
+ 'PanelImageNoImage' => 'Bez obrázku',
+ 'PanelSelectFileTitle' => 'Vyberte soubor',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Obnovit výchozí nastavení',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Od',
+ 'PanelTo' =>'Do',
+
+ 'PanelWeb' => 'Zobrazit informace',
+ 'PanelWebTip' => 'Zobrazí informace o vybrané položce na webu', # Accepts model codes
+ 'PanelRemoveTip' => 'Odstraní stávající položku', # Accepts model codes
+
+ 'PanelDateSelect' => 'Vyberte datum',
+ 'PanelNobody' => 'Žádný',
+ 'PanelUnknown' => 'Neznámý',
+ 'PanelAdded' => 'Přidáno',
+ 'PanelRating' => 'Hodnocení',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Umístění',
+
+ 'PanelLending' => 'ZápůjÄky',
+ 'PanelBorrower' => 'Dlužník',
+ 'PanelLendDate' => 'PůjÄeno od',
+ 'PanelHistory' => 'Historie zápůjÄek',
+ 'PanelReturned' => 'Položka vrácena', # Accepts model codes
+ 'PanelReturnDate' => 'Datum vrácení',
+ 'PanelLendedYes' => 'PůjÄeno',
+ 'PanelLendedNo' => 'Dostupné',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Nezáleží',
+ 'CheckYes' => 'Ano',
+ 'CheckNo' => 'Ne',
+
+ 'ToolbarAll' => 'Zobrazit vše',
+ 'ToolbarAllTooltip' => 'Zobrazí celý seznam',
+ 'ToolbarGroupBy' => 'Řadit podle',
+ 'ToolbarGroupByTooltip' => 'Vyberte pole, podle kterého se mají řadit položky seznamu',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Hledat',
+ 'PluginsQuery' => 'Dotaz',
+ 'PluginsFrame' => 'Hledat na serveru',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Jméno',
+ 'PluginsSearchFields' => 'Hledat v poli',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Jazyk',
+ 'PluginsUseSite' => 'Použít vybraný server pro další hledání',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Konfigurace dlužníků',
+ 'BorrowersList' => 'Dlužníci',
+ 'BorrowersName' => 'Jméno',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Přidat',
+ 'BorrowersRemove' => 'Odebrat',
+ 'BorrowersEdit' => 'Editace',
+ 'BorrowersTemplate' => 'Å ablona mailu',
+ 'BorrowersSubject' => 'Předmět mailu',
+ 'BorrowersNotice1' => '%1 bude nahrazen jménem dlužníka',
+ 'BorrowersNotice2' => '%2 bude nahrazen názvem položky',
+ 'BorrowersNotice3' => '%3 bude nahrazen datem výpůjÄky',
+
+ 'BorrowersImportTitle' => 'Importovat informace o dlužnících',
+ 'BorrowersImportType' => 'Formát souboru:',
+ 'BorrowersImportFile' => 'Soubor:',
+
+ 'BorrowedTitle' => 'PůjÄené položky', # Accepts model codes
+ 'BorrowedDate' => 'Od',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Poslat e-mail',
+ 'MailFrom' => 'Od: ',
+ 'MailTo' => 'Komu: ',
+ 'MailSubject' => 'Předmět: ',
+ 'MailSmtpError' => 'Problém s připojením k SMTP serveru',
+ 'MailSendmailError' => 'Problém se spuštěním sendmailu',
+
+ 'SearchTooltip' => 'Prohledává celý seznam', # Accepts model codes
+ 'SearchTitle' => 'Hledání', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Nahradit v poli',
+ 'QueryReplaceOld' => 'SouÄasné jméno',
+ 'QueryReplaceNew' => 'Nové jméno',
+ 'QueryReplaceLaunch' => 'Nahradit',
+
+ 'ImportWindowTitle' => 'Vyberte pole k importu',
+ 'ImportViewPicture' => 'Zobrazit obrázek',
+ 'ImportSelectAll' => 'Vybrat vše',
+ 'ImportSelectNone' => 'Nevybírat nic',
+
+ 'MultiSiteTitle' => 'Pro hledání použít tyto servery',
+ 'MultiSiteUnused' => 'Nepoužité servery',
+ 'MultiSiteUsed' => 'Použité servery',
+ 'MultiSiteLang' => 'Vybrat Äeské servery',
+ 'MultiSiteEmptyError' => 'Máte prázdný seznam serverů',
+ 'MultiSiteClear' => 'Vymazat seznam',
+
+ 'DisplayOptionsTitle' => 'Zobrazit položky',
+ 'DisplayOptionsAll' => 'Vybrat vše',
+ 'DisplayOptionsSearch' => 'Stáhnout informace',
+
+ 'GenresTitle' => 'Konverze žánrů',
+ 'GenresCategoryName' => 'Použít žánr',
+ 'GenresCategoryMembers' => 'Nahradit žánr',
+ 'GenresLoad' => 'Nahrát seznam',
+ 'GenresExport' => 'Uložit seznam do souboru',
+ 'GenresModify' => 'Upravit konverzi',
+
+ 'PropertiesName' => 'Název sbírky',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Vlastník',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Popis',
+ 'PropertiesFile' => 'Informace o souboru',
+ 'PropertiesFilePath' => 'Úplná cesta',
+ 'PropertiesItemsNumber' => 'PoÄet položek', # Accepts model codes
+ 'PropertiesFileSize' => 'Velikost',
+ 'PropertiesFileSizeSymbols' => ['Bytů', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Vlastnosti sbírky',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programy pro odesílání mailů',
+ 'MailProgramsName' => 'Název',
+ 'MailProgramsCommand' => 'Příkazová řádka',
+ 'MailProgramsRestore' => 'Obnovit implicitní',
+ 'MailProgramsAdd' => 'Přidat program',
+ 'MailProgramsInstructions' => 'V příkazové řádce je provedeno několik substitucí:
+ %f je nahrazeno e-mailovou adresou uživatele.
+ %t je nahrazeno adresou příjemce.
+ %s je nahrazeno předmětem zprávy.
+ %b je nahrazeno obsahem zprávy.',
+
+ 'BookmarksBookmarks' => 'Záložky',
+ 'BookmarksFolder' => 'Adresář',
+ 'BookmarksLabel' => 'Štítek', #Label
+ 'BookmarksPath' => 'Cesta',
+ 'BookmarksNewFolder' => 'Nový adresář',
+
+ 'AdvancedSearchType' => 'Typ hledání',
+ 'AdvancedSearchTypeAnd' => 'Položky odpovídají všem podmínkám', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Položky odpovídají alespoň jedné podmínce', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Podmínky',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Zpráva o chybě generovaná z GCstar',
+ 'BugReportVersion' => 'Verze',
+ 'BugReportPlatform' => 'OperaÄní systém',
+ 'BugReportMessage' => 'Chybová zpráva',
+ 'BugReportInformation' => 'Další informace',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..81ff935
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::DE::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Feldnamen im Header exportieren',
+ 'Separator' => 'Feldtrenner',
+ 'Replacement' => 'Feldtrenner ersetzen durch',
+ 'Charset' => 'Zeichenkodierung',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..eca0d20
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::DE::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'externes Medium',
+ 'ZipAll' => 'alles in eine Zip-Datei packen (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..b03268b
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::DE::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ungültige Templatedatei',
+ 'UseFile' => 'Nutze angegebene Datei',
+ 'TemplateExternalFile' => 'Templatedatei',
+ 'WithJS' => 'Javascript verwenden',
+ 'FileTemplate' => 'Template:',
+ 'Preview' => 'Vorschau',
+ 'NoPreview' => 'Keine Vorschau verfügbar',
+ 'Title' => 'Seitentitel',
+ 'InfoFile' => 'Liste erstellt: ',
+ 'InfoDir' => 'Bilder gespeichert unter: ',
+ 'HeightImg' => 'Höhe der zu exportierenden Bilder (in Pixeln): ',
+ 'OpenFileInBrowser' => 'Erzeugte Datei im Webbrowser öffnen',
+ 'Note' => 'Liste erstellt mit <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Suchtext eingeben',
+ 'SearchType1' => 'Nur Titel',
+ 'SearchType2' => 'Alle Informationen',
+ 'SearchButton' => 'Suche',
+ 'SearchTitle' => 'Nur Elemente anzeigen die diesen Kriterien entsprechen',
+ 'AllButton' => 'Alle',
+ 'AllTitle' => 'Alle Elemente anzeigen',
+ 'Expand' => 'Alle maximieren',
+ 'ExpandTitle' => 'Alle Informationen anzeigen',
+ 'Collapse' => 'Alle minimieren',
+ 'CollapseTitle' => 'Nur Titel anzeigen',
+ 'Borrowed' => 'Ausgeliehen von: ',
+ 'NotBorrowed' => 'Verfügbar',
+ 'Top' => 'Oben',
+ 'Bottom' => 'Unten',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..e2da12e
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::DE::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Databankname',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..ae45cae
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::DE::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Exportiere mit DROP TABLE Anweisung',
+ 'WithCreate' => 'Exportiere mit CREATE TABLE Anweisung',
+ 'TableName' => 'Tabellenname',
+ 'InfoFile' => 'SQL Datei: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..1bef88a
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::DE::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archiv erstellt: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..2b15bb7
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::DE::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Dateivorlage',
+ 'ModelText' => 'Textvorlage',
+ 'Models' => 'Zu verwendende Vorlage',
+ 'UseFile' => 'Datei verwenden',
+ 'UseModel' => 'Textvorlage verwenden',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..d6bf1f7
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::DE::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Wo soll gesucht werden',
+ 'Default' => 'Vorgabeverzeichnis von Alexandria',
+ 'Specified' => 'Verzeichnis wie unten angegeben',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..4d0b19c
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::DE::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Zeichenkodierung',
+ 'Header' => 'Erste Zeile ignorieren',
+ 'Separator' => 'Feldtrenner',
+ 'Plugin' => 'Zu verwendende Seite',
+ 'UseFirst' => 'Bei mehreren Ergebnissen erstes verwenden',
+ 'SearchField' => 'verwende dieses Feld für die Suche',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..6ca92e0
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::DE::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Ordner',
+ 'Recursive' => 'Unterordner durchsuchen',
+ 'Suffixes' => 'Suffix oder Dateiendung der Dateien',
+ 'SuffixesTooltip' => 'Eine kommaseparierte Liste von in Frage kommenden Suffixen oder Dateiendungen',
+ 'Remove' => 'Von den Namen zu entfernen',
+ 'RemoveTooltip' => 'Eine kommaseparierte Liste on Wörtern, die aus den Dateinamen entfernt werden sollen um die Namen zu bestimmen',
+ 'Ask'=> 'Nachfragen',
+ 'AskEnd'=> 'Nachfragen nach dem Sammeln aller Informationen',
+ 'AddWithoutInfo'=> 'Ohne Informationen hinzufügen',
+ 'DontAdd'=> 'Nicht hinzufügen',
+ 'TakeFirst' => 'Erstes verwenden',
+ 'MultipleResult'=> 'Mehrere Ergebnisse',
+ 'MultipleResultTooltip'=> 'Vorgehensweise wenn das Plugin mehr als ein Ergebnis liefert',
+ 'RemoveWholeWord' => 'Nur ganze Wörter entfernen',
+ 'NoResult'=> 'Keine Ergebnisse',
+ 'NoResultTooltip'=> 'Vorgehensweise wenn das Plugin kein Ergebnis liefert',
+ 'RemoveTooltipWholeWord' => 'Wörter entfernen wenn sie als gesamtes Wort erscheinen',
+ 'RemoveRegularExpr' => 'Reguläre Ausdrücke',
+ 'RemoveTooltipRegularExpr' => 'Zähle \'To be removed from names\' als regulären Perl Ausdruck',
+ 'SkipFileAlreadyInCollection' => 'Nur unbekannte Dateien hinzufügen',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Nur Dateien hinzufügen, die nicht Teil der Sammlung sind',
+ 'SkipFileNo' => 'Nein',
+ 'SkipFileFullPath' => 'basierend auf kompletten Pfad',
+ 'SkipFileFileName' => 'basierend auf komplettem Pfad',
+ 'SkipFileFileNameAndUpdate' => 'basierend auf komplettem Pfad (neuen Pfad für bewegte Dateien eintragen)',
+ 'InfoFromFileNameRegExp' => 'Verarbeite Dateinamen mit diesem regulären Ausdruck',
+ 'InfoFromFileNameRegExpTooltip' => 'Nachfolgende Informationen können für die Verarbeitugn verwendet werden (nach dem Entfernen der Dateiendung).\nLeer lassen, wenn nicht benötigt wird.\nBekannte Felder: \n$T:Titel, $A:Alphabetisierte Titel, $Y:Veröffentlichungsdatum, $S:Jahrgang, $E:Episode, $N:Alphabetisierter Serienname, $x:Nummer der Folge, $y: Anzahl Gesamtfolgen',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..e31bb99
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::DE::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopiere Bilder',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportList.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportList.pm
new file mode 100644
index 0000000..6f5be27
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::DE::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Titelliste',
+ 'Plugin' => 'Zu verwendende Seite',
+ 'UseFirst' => 'Bei mehreren Ergebnissen erstes verwenden',
+ 'CommentAuto' => 'Element automatisch importiert.',
+ 'CommentSite' => 'Webseite: ',
+ 'CommentTitle' => 'Titel: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..8610ac6
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::DE::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcodescanner',
+ 'Type' => 'Art des Scanners',
+ 'Local' => 'Lokal (Tastaturersatz)',
+ 'Network' => 'Netzwerk (z.B.: GCstar Scanner for Android)',
+ 'Port' => 'zu nutzender Port',
+ 'Plugin' => 'zu nutzende Website',
+ 'UseFirst' => 'Verwende erstes von mehreren Ergebnissen',
+ 'Waiting' => 'Warte auf Barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Element scannen oder Vorgang beenden',
+ 'ScanOtherPrompt' => 'Ein anderes Element scannen oder Vorgang beenden',
+ 'Previous' => '"%s" wird hinzugefügt.',
+ 'NothingFound' => 'Für "%s" wurde nichts gefunden. Ein leeres Element wird hinzugefügt.',
+ 'Terminate' => 'Vorgang beenden',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..1a3e773
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::DE::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Datei ist keine Tellico Video-Sammlung',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..7650cbb
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCTVepisodes.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::DE::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Episodensammlung von Fernsehserien',
+ Items => {
+ 0 => 'Folge',
+ 1 => 'Folge',
+ X => 'Folgen'},
+ NewItem => 'Neue Folge',
+ NewSeries => 'Neue Serie',
+ Episode => 'Folge',
+ Writer => 'Drehbuch',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..65f5848
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCTVseries.pm
@@ -0,0 +1,53 @@
+{
+ package GCLang::DE::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Fernsehseriensammlung',
+ Items => {
+ 0 => 'Serie',
+ 1 => 'Serie',
+ X => 'Serien'},
+ NewItem => 'Neue Serie',
+ Name => 'Name',
+ Season => 'Staffel',
+ Part => 'Teil',
+ Episodes => 'Folge',
+ FirstAired => 'Erstausstrahlung',
+ Time => 'Länge',
+ Producer => 'Produzent',
+ Music => 'Musik',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..33a094a
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCboardgames.pm
@@ -0,0 +1,87 @@
+{
+ package GCLang::DE::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Brettspielsammlung',
+ Items => {0 => 'Spiel',
+ 1 => 'Spiel',
+ X => 'Spiele'},
+ NewItem => 'Neues Spiel',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Originalname',
+ Box => 'Verpackungsbild',
+ DesignedBy => 'Entwickelt von',
+ PublishedBy => 'Erschienen bei',
+ Players => 'Anzahl der Spieler',
+ PlayingTime => 'Spielzeit',
+ SuggestedAge => 'Empfohlenes Alter',
+ Released => 'Erscheinungsdatum',
+ Description => 'Beschreibung',
+ Category => 'Kategorie',
+ Mechanics => 'Spielaktionen',
+ ExpandedBy => 'Erweitert durch',
+ ExpansionFor => 'Erweiterung für',
+ GameFamily => 'Spieltyp',
+ IllustratedBy => 'Illustriert von',
+ Url => 'Webseite',
+ TimesPlayed => 'Wie oft gespielt',
+ CompleteContents => 'Inhalt vollständig',
+ Copies => 'Anzahl der Spiele',
+ Condition => 'Konditionen',
+ Photos => 'Fotos',
+ Photo1 => 'Erstes Bild',
+ Photo2 => 'Zweites Bild',
+ Photo3 => 'Drittes Bild',
+ Photo4 => 'Viertes Bild',
+ Comments => 'Kommentare',
+
+ Perfect => 'Perfekt',
+ Good => 'Gut',
+ Average => 'Durchschnitt',
+ Poor => 'Schlecht',
+
+ CompleteYes => 'Inhalt vollständig',
+ CompleteNo => 'Fehlende Teile',
+
+ General => 'Allgemein',
+ Details => 'Details',
+ Personal => 'Persönlich',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+ );
+}
+
+1;
+
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCbooks.pm b/lib/gcstar/GCLang/DE/GCModels/GCbooks.pm
new file mode 100644
index 0000000..96aac2f
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCbooks.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::DE::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Büchersammlung',
+ Items => {0 => 'Buch',
+ 1 => 'Buch',
+ X => 'Bücher',
+ },
+ NewItem => 'Neues Buch',
+
+ Isbn => 'ISBN',
+ Title => 'Titel',
+ Cover => 'Umschlag',
+ Authors => 'Autoren',
+ Publisher => 'Verlag',
+ Publication => 'Erscheinungsdatum',
+ Language => 'Sprache',
+ Genre => 'Genre',
+ Serie => 'Sammlung',
+ Rank => 'Teil/Folge',
+ Bookdescription => 'Beschreibung',
+ Pages => 'Seiten',
+ Read => 'Gelesen',
+ Acquisition => 'Anschaffungsdatum',
+ Edition => 'Auflage',
+ Format => 'Format',
+ Comments => 'Kommentare',
+ Url => 'Webseite',
+ Translator => 'Ãœbersetzung',
+ Artist => 'Künstler',
+ DigitalFile => 'Digitalversion',
+
+ General => 'Allgemein',
+ Details => 'Details',
+
+ ReadNo => 'Nicht gelesen',
+ ReadYes => 'Gelesen',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCcoins.pm b/lib/gcstar/GCLang/DE/GCModels/GCcoins.pm
new file mode 100644
index 0000000..5f858ba
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCcoins.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::DE::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatische Sammlung',
+ Items => {0 => 'Münze',
+ 1 => 'Münze',
+ X => 'Münzen',
+ },
+ NewItem => 'Neue Münze',
+
+ Name => 'Name',
+ Country => 'Land',
+ Year => 'Jahr',
+ Currency => 'Währung',
+ Value => 'Wert',
+ Picture => 'Bild',
+ Diameter => 'Durchmesser',
+ Metal => 'Metall',
+ Front => 'Kopf',
+ Back => 'Zahl',
+ Edge => 'Rand',
+ Edge1 => 'Rand 1',
+ Edge2 => 'Rand 2',
+ Edge3 => 'Rand 3',
+ Edge4 => 'Rand 4',
+ Head => 'Kopf',
+ Tail => 'Zahl',
+ Comments => 'Kommentar',
+ Location => 'Ort',
+ History => 'Geschichte',
+ Website => 'Website',
+ Estimate => 'Schätzwert',
+ References => 'Verweise',
+ Type => 'Typ',
+ Coin => 'Münze',
+ Banknote => 'Banknote',
+
+ Main => 'Haupt',
+ Description => 'Beschreibung',
+ Other => 'andere Informationen',
+ Pictures => 'Bilder',
+
+ Condition => 'Erhaltungsgrad nach PCGS',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCcomics.pm b/lib/gcstar/GCLang/DE/GCModels/GCcomics.pm
new file mode 100644
index 0000000..97144f8
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCcomics.pm
@@ -0,0 +1,74 @@
+{
+ package GCLang::DE::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comicheftsammlung',
+ Items => {0 => 'Comicheft',
+ 1 => 'Comicheft',
+ X => 'Comichefte'
+ },
+ NewItem => 'Neues Comicheft',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Serie',
+ Volume => 'Ausgabe',
+ Title => 'Titel',
+ Writer => 'Autor',
+ Illustrator => 'Illustrator',
+ Colourist => 'Kolorist',
+ Publisher => 'Herausgeber',
+ Synopsis => 'Zusammenfassung',
+ Collection => 'Sammlung',
+ PublishDate => 'Erscheinungsdatum',
+ PrintingDate => 'Druckdatum',
+ ISBN => 'ISBN',
+ Type => 'Typ',
+ Category => 'Kategorie',
+ Format => 'Format',
+ NumberBoards => 'Anzahl der Boards',
+ Signing => 'signiert',
+ Cost => 'Preis',
+ Rating => 'Bewertung',
+ Comment => 'Bemerkungen',
+ Url => 'Internetseite',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+
+ Main => 'Hauptelemente',
+ General => 'Allgemein',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCfilms.pm b/lib/gcstar/GCLang/DE/GCModels/GCfilms.pm
new file mode 100644
index 0000000..fdcb003
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCfilms.pm
@@ -0,0 +1,94 @@
+{
+ package GCLang::DE::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmsammlung',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Filme',
+ },
+
+ NewItem => 'Neuer Film',
+
+ Id => 'Kennung',
+ Title => 'Titel',
+ Date => 'Datum',
+ Time => 'Länge',
+ Director => 'Regisseur',
+ Country => 'Land',
+ MinimumAge => 'Altersfreigabe',
+ Genre => 'Genre',
+ Image => 'Bild',
+ Original => 'Originaltitel',
+ Actors => 'Besetzung',
+ Actor => 'Schauspieler/in',
+ Role => 'Rolle',
+ Comment => 'Kommentar',
+ Synopsis => 'Beschreibung',
+ Seen => 'gesehen',
+ Number => '# der Medien',
+ Format => 'Format',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Internetseite',
+ Audio => 'Audio',
+ Video => 'Videoformat',
+ Trailer => 'Videodatei',
+ Serie => 'Serie',
+ Rank => 'Teil/Folge',
+ Subtitles => 'Untertitel',
+
+ SeenYes => 'Film bereits gesehen',
+ SeenNo => 'Film noch nicht gesehen',
+
+ AgeUnrated => 'Unbewertet',
+ AgeAll => 'Ohne Altersbeschränkung',
+ AgeParent => '6',
+
+ Main => 'Wichtigste Felder',
+ General => 'Allgemein',
+ Details => 'Details',
+
+ Information => 'Informationen',
+ Languages => 'Sprachen',
+ Encoding => 'Kodierung',
+
+ FilterAudienceAge => 'Altersfreigabe',
+ FilterSeenNo => 'Noch _nicht gesehen',
+ FilterSeenYes => 'Bereits _gesehen',
+ FilterRatingSelect => 'Bewertung _mindestens...',
+
+ ExtractSize => 'Größe',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCgames.pm b/lib/gcstar/GCLang/DE/GCModels/GCgames.pm
new file mode 100644
index 0000000..4c0c028
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::DE::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computerspiele Sammlung',
+ Items => {0 => 'Spiel',
+ 1 => 'Spiel',
+ X => 'Spiele'},
+ NewItem => 'Neues Spiel',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Plattform',
+ Players => 'Anzahl der Spieler',
+ Released => 'Erscheinungsdatum',
+ Editor => 'Herausgeber',
+ Developer => 'Entwickler',
+ Genre => 'Genre',
+ Box => 'Bild der Verpackung',
+ Case => 'Originalverpackung',
+ Manual => 'Bedienungsanleitung',
+ Completion => 'Durchgespielt (%)',
+ Executable => 'Startdatei',
+ Description => 'Beschreibung',
+ Codes => 'Cheats',
+ Code => 'Cheatcode',
+ Effect => 'Effekt',
+ Secrets => 'Geheimnisse',
+ Screenshots => 'Bildschirm Foto',
+ Screenshot1 => 'Erstes Bildschirm Foto',
+ Screenshot2 => 'Zweites Bildschirm Foto',
+ Comments => 'Kommentar',
+ Url => 'Internetseite',
+ Unlockables => 'Lösungen',
+ Unlockable => 'Ziel',
+ Howto => 'Lösungsweg',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Bildschirmauflösungen',
+ InstallationSize => 'Größe',
+ Region => 'Region',
+ SerialNumber => 'Seriennummer',
+
+ General => 'Allgemein',
+ Details => 'Details',
+ Tips => 'Tipps',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..5512302
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::DE::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Eintrag',
+ 1 => 'Eintrag',
+ X => 'Einträge'
+ },
+ NewItem => 'Neuer Eintrag',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCminicars.pm b/lib/gcstar/GCLang/DE/GCModels/GCminicars.pm
new file mode 100644
index 0000000..d14de56
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCminicars.pm
@@ -0,0 +1,179 @@
+{
+ package GCLang::DE::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Miniaturfahrzeugsammlung',
+ Items => {0 => 'Fahrzeug',
+ 1 => 'Fahrzeug',
+ X => 'Fahrzeuge'},
+ NewItem => 'Neues Fahrzeug',
+ Currency => 'Währung',
+
+# Main fields
+
+ Main => 'Hauptinformation',
+
+ Name => 'Name',
+ Exchange => 'Zu verkaufen oder zu tauschen',
+ Wanted => 'gesucht',
+ Rating1 => 'Hauptbewertung',
+ Picture1 => 'Hauptbild',
+ Scale => 'Maßstab',
+ Manufacturer => 'Hersteller',
+ Constructor => 'Konstrukteur',
+ Type1 => 'Typ',
+ Modele => 'Modell',
+ Version => 'Version',
+ Color => 'Farbe des Modells',
+ Pub => 'Werbung',
+ Year => 'Jahr',
+ Reference => 'Verweise',
+ Kit => 'Als Bausatz',
+ Transformation => 'Persönliche Informationen',
+ Comments1 => 'Bemerkungen',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'verschiedene Eigenschaften',
+ Material => 'Material',
+ Molding => 'Guss',
+ Condition => 'Zustand',
+ Edition => 'Ausgabe',
+ Collectiontype => 'Sammlungsname',
+ Serial => 'Serie',
+ Serialnumber => 'Seriennummer',
+ Designed => 'Entwurfsdatum',
+ Madein => 'Herstellungsland',
+ Box1 => 'Art der Verpackung',
+ Box2 => 'Verpackungsbeschreibung',
+ Containbox => 'Verpackungsinhalt',
+ Rating2 => 'Realitätsnähe',
+ Rating3 => 'Ausführung',
+ Acquisition => 'Kaufdatum',
+ Location => 'wo gekauft',
+ Buyprice => 'Kaufpreis',
+ Estimate => 'Schätzwert',
+ Comments2 => 'Bemerkungen',
+ Decorationset => 'Dekorationsausführung',
+ Characters => 'Figuren',
+ CarFromFilm => 'Filmauto',
+ Filmcar => 'Film mit diesem Auto',
+ Filmpart => 'Serienfolge',
+ Parts => 'Anzahl der Teile',
+ VehiculeDetails => 'technische Daten',
+ Detailsparts => 'besondere Einzelheiten',
+ Detailsdecorations => 'Art der Dekoration',
+ Decorations => 'Anzahl der Dokorationen',
+ Lwh => 'Länge / Breite / Höhe',
+ Weight => 'Gewicht',
+ Framecar => 'Fahrgestell',
+ Bodycar => 'Karosserie',
+ Colormirror => 'Farbe des Modells',
+ Interior => 'Innenausstattung',
+ Wheels => 'Räder',
+ Registrationnumber1 => 'Nummernschild vorne',
+ Registrationnumber2 => 'Nummernschild hinten',
+ RacingCar => 'Rennwagen',
+ Course => 'Rennen',
+ Courselocation => 'Rennplatzierung',
+ Courseyear => 'Renndatum',
+ Team => 'Team',
+ Pilots => 'Fahrer(innen)',
+ Copilots => 'Beifahrer(innen)',
+ Carnumber => 'Fahrzeugnummer',
+ Pub2 => 'Werbepartner',
+ Finishline => 'Platzierung',
+ Steeringwheel => 'Position des Lenkrades',
+
+
+# Catalogs fields
+
+ Catalogs => 'Katalog',
+
+ OfficialPicture => 'Herstellerfoto',
+ Barcode => 'Strichcode',
+ Referencemirror => 'Verweise',
+ Year3 => 'Verfügbarkeitsdatum',
+ CatalogCoverPicture => 'Katalogcover',
+ CatalogPagePicture => 'Katalogseite',
+ Catalogyear => 'Katalogsjahr',
+ Catalogedition => 'Katalogsausgabe',
+ Catalogpage => 'Katalogseite',
+ Catalogprice => 'Katalogpreis',
+ Personalref => 'Persönlicher Bezug',
+ Websitem => 'Website vom Herstellers des Miniaturfahrzeuges',
+ Websitec => 'Website vom Hersteller des Originalfahrzeuges',
+ Websiteo => 'Nützlicher Link',
+ Comments3 => 'Kommentare',
+
+# Pictures fields
+
+ Pictures => 'Bilder',
+
+ OthersComments => 'Generelle Anmerkungen',
+ OthersDetails => 'andere Details',
+ Top1 => 'oben',
+ Back1 => 'unten',
+ AVG => 'vorne links',
+ AV => 'vorne',
+ AVD => 'vorne rechts',
+ G => 'links',
+ BOX => 'Verpackung',
+ D => 'rechts',
+ ARG => 'hinten links',
+ AR => 'hinten',
+ ARD => 'hinten rechts',
+ Others => 'andere',
+
+# PanelLending fields
+
+ LendingExplanation => 'Leihgaben für Ausstellungen',
+ PanelLending => 'Ausleihen',
+ Comments4 => 'Kommentare',
+
+# Realmodel fields
+
+ Realmodel => 'Modell',
+
+ Difference => 'Unterschiede zwischen Modell und Original',
+ Front2 => 'vorne',
+ Back2 => 'hinten',
+ Comments5 => 'Kommentare',
+
+ References => 'Verweise',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCmusics.pm b/lib/gcstar/GCLang/DE/GCModels/GCmusics.pm
new file mode 100644
index 0000000..3605487
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCmusics.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::DE::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Musiksammlung',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Alben',
+ },
+ NewItem => 'Neues Album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titel',
+ Cover => 'Cover',
+ Artist => 'Künstler',
+ Format => 'Format',
+ Running => 'Laufzeit',
+ Release => 'Veröffentlichungsdatum',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+ # For tracks list
+ Tracks => 'Titelliste',
+ Number => 'Nummer',
+ Track => 'Titel',
+ Time => 'Zeit',
+
+ Composer => 'Komponist/in',
+ Producer => 'Produzent/in',
+ Playlist => 'Wiedergabeliste',
+ Comments => 'Kommentare',
+ Label => 'Verlag',
+ Url => 'Internetseite',
+
+ General => 'Allgemein',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..5cd7c20
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCperiodicals.pm
@@ -0,0 +1,56 @@
+{
+ package GCLang::DE::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zeitschriftensammlung',
+ Items => {0 => 'Heft',
+ 1 => 'Heft',
+ X => 'Hefte'},
+ NewItem => 'Neues Heft',
+
+ Title => 'Titel',
+ Cover => 'Titelseite',
+ Periodical => 'Zeitschrift',
+ Number => 'Nummer',
+ Date => 'Datum',
+ Subject => 'Stichworte',
+ Articles => 'Inhalt',
+
+ Article => 'Artikel',
+ Page => 'Seite',
+ Résumé => 'Zusammenfassung',
+
+ General => 'Allgemein',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..288eb69
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::DE::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Telefonkartensammlung',
+ Items => {0 => 'Karte',
+ 1 => 'Karte',
+ X => 'Karten'},
+ NewItem => 'Neue Karte',
+ Currency => 'Währung',
+
+ Help => 'Hinweise zu den Eingabefeldern',
+ Help1 => 'Hilfe',
+
+# Traduction des Champs "Main"
+
+ Main => 'Kartendaten',
+
+ Cover => 'Abbildung',
+
+ Name => 'Name',
+ Exchange => 'tauschen oder verkaufen',
+ Wanted => 'gesucht',
+ Rating1 => 'Gesamtbewertung',
+ TheSmartCard => 'Vorder-/Rückseite',
+
+ Country => 'Land',
+ Color => 'Farbe',
+ Type1 => 'Kartentyp',
+ Type2 => 'Modultyp',
+ Dimension => 'Länge/Breite/Dicke',
+
+ Box => 'Box',
+ Chip => 'Modul',
+ Year1 => 'Ausgabedatum',
+ Year2 => 'Gültigkeitsdatum',
+ Condition => 'Zustand',
+ Charge => 'aufladbar',
+ Variety => 'Variante',
+
+ Edition => 'Gesamtauflage',
+ Serial => 'Seriennummer',
+ Theme => 'Theme',
+
+ Acquisition => 'Kaufdatum',
+
+ Catalog0 => 'Katalog',
+ Catalog1 => 'Michel',
+ Catalog2 => 'Sherlock',
+
+ Reference0 => 'Katalognummer',
+ Reference1 => 'Michelnummer',
+ Reference2 => 'Katalognummer Sherlock',
+ Reference3 => 'andere Katalognummer',
+
+ Quotationnew00 => 'Wert ungebraucht',
+ Quotationnew10 => 'Wert Michel',
+ Quotationnew20 => 'Wert Sherlock',
+ Quotationnew30 => 'andere Bewertung',
+ Quotationold00 => 'Wert gebraucht',
+ Quotationold10 => 'Wert Michael',
+ Quotationold20 => 'Wert Sherlock',
+ Quotationold30 => 'andere Bewertung',
+
+ Title1 => 'Titel',
+
+ Unit => 'Einheiten/Minuten',
+
+ Pressed => 'Hersteller',
+ Location => 'Ort',
+
+ Comments1 => 'Bemerkung',
+
+ Others => 'Sonstiges',
+ Weight => 'Gewicht',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..ed527cb
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCsoftware.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::DE::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Softwaresammlung',
+ Items => {0 => 'Programm',
+ 1 => 'Programm',
+ X => 'Programme'},
+ NewItem => 'Neues Programm',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Erscheinungsdatum',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Entwickler',
+ Category => 'Kategorie',
+ NumberOfCopies => '# Exemplare',
+ Price => 'Preis',
+ Box => 'Verpackungsbild',
+ Case => 'Verpackung',
+ Manual => 'Handbuch',
+ Executable => 'Datei',
+ Description => 'Beschreibung',
+ License => 'Lizenz',
+ Commercial => 'kommerziell',
+ FreewareNoncommercial => 'Freeware (für nicht-kommerziellen Einsatz)',
+ OtherOpenSource => 'sonstige Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'sonstige',
+ Registration => 'Registrierung',
+ RegistrationInfo => 'Registrierungsdaten',
+ RegInfo => 'Registrierungsdaten',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registierungsnumber',
+ PanelRegistration => 'Registrierungsdaten',
+ RegistrationComments => 'Bemerkungen',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'erster Screenshot',
+ Screenshot2 => 'zweiter Screenshot',
+ Comments => 'Bemerkungen',
+ Url => 'Webseite',
+ General => 'Allgemein',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Bewertung _mindestens...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCstamps.pm b/lib/gcstar/GCLang/DE/GCModels/GCstamps.pm
new file mode 100644
index 0000000..36ec79a
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::DE::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Briefmarkensammlung',
+ Items => {0 => 'Briefmarke',
+ 1 => 'Briefmarke',
+ X => 'Briefmarken'},
+ NewItem => 'Neue Briefmarke',
+
+ General => 'Allgemein',
+ Detail => 'Detail',
+ Value => 'Wert',
+ Notes => 'Bemerkungen',
+ Views => 'Fotos',
+
+ Name => 'Name',
+ Country => 'Land',
+ Year => 'Jahr',
+ Catalog => 'Katalog',
+ Number => 'Nummer',
+ Topic => 'Motiv',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Graveur',
+ Type => 'Typ',
+ Format => 'Art',
+ Description => 'Beschreibung',
+ Color => 'Farbe',
+ Gum => 'Gummierung',
+ Paper => 'Papier',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforationsgröße',
+ CancellationType => 'Stempel',
+ Comments => 'Bemerkungen',
+ PrintingVariety => 'Druck',
+ IssueDate => 'Erstausgabedatum',
+ EndOfIssue => 'gültig bis',
+ Issue => 'Auflage',
+ Grade => 'Erhaltung',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Entwertung',
+ CancellationCondition => 'Stempelqualität',
+ GumCondition => 'Zustand der Gummierung',
+ PerforationCondition => 'Zustand der Perforation',
+ ConditionNotes => 'Bemerkungen zum Zustand',
+ Error => 'Fehldruck',
+ ErrorNotes => 'Bemerkungen zum Druck',
+ FaceValue => 'Nennwert',
+ MintValue => 'Wert postfrisch',
+ UsedValue => 'Wert gestempelt',
+ PurchasedDate => 'Kaufdatum',
+ Quantity => 'Anzahl',
+ History => 'Geschichte',
+ Picture1 => 'Bild 1',
+ Picture2 => 'Bild 2',
+ Picture3 => 'Bild 3',
+
+ AirMail => 'Luftpost',
+ MilitaryStamp => 'Feldpost',
+ Official => 'offiziell',
+ PostageDue => 'Nachgebühr',
+ Regular => 'Regulär',
+ Revenue => 'Erlös',
+ SpecialDelivery => 'Sondermarke',
+ StrikeStamp => 'Streikmarke',
+ TelegraphStamp => 'Telegrafenmarke',
+ WarStamp => 'Feldpostmarke',
+ WarTaxStamp => 'Kriegssteuermarke',
+
+ Booklet => 'Markenheftchen',
+ BookletPane => 'Heftchenblatt',
+ Card => 'Postkarte',
+ Coil => 'Rolle',
+ Envelope => 'Umschlag',
+ FirstDayCover => 'Ersttagsbrief',
+ Sheet => 'Bogen',
+ Single => 'Einzelexemplar',
+
+ Heliogravure => 'Heliogravüre',
+ Lithography => 'Lithographie',
+ Offset => 'Offset',
+ Photogravure => 'Rastertiefdruck',
+ RecessPrinting => 'Stichtiefdruck',
+ Typography => 'Schriftsatz',
+
+ OriginalGum => 'Originalgummierung',
+ Ungummed => 'ungummiert',
+ Regummed => 'nachgummiert',
+
+ Chalky => 'gestrichenes Papier',
+ ChinaPaper => 'Chinapapier',
+ Coarsed => 'Rauh',
+ Glossy => 'Glänzend',
+ Granite => 'Granite',
+ Laid => 'Gestreift',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Zigarettenpapier',
+ Quadrille => 'Gegittert',
+ Ribbed => 'Riffelung',
+ Rice => 'Reis',
+ Silk => 'Seide',
+ Smoothed => 'Geglättet',
+ Thick => 'Dick',
+ Thin => 'Dünn',
+ Wove => 'Gewebt',
+
+ CoarsedPerforation => 'Rauhe Perforation',
+ CombPerforation => 'Gekämmte Perforation',
+ CompoundPerforation => 'Gemischte Perforation',
+ DamagedPerforation => 'Beschädigte Perforation',
+ DoublePerforation => 'Doppelte Oerforation',
+ HarrowPerforation => 'Eckige Perforation',
+ LinePerforation => 'Gerade Perforation',
+ NoPerforation => 'Keine Perforation',
+
+ CancellationToOrder => 'Gefälligkeitsstempel',
+ FancyCancellation => 'Sonderstempel',
+ FirstDayCancellation => 'Ersttagsstempel',
+ NumeralCancellation => 'Nummernstempel',
+ PenMarked => 'Federzugentwertung',
+ RailroadCancellation => 'Eisenbahnentwertung',
+ SpecialCancellation => 'Spezielle Entwertung',
+
+ Superb => 'Luxuserhaltung',
+ ExtraFine => 'Kabinetterhaltung',
+ VeryFine => 'Prachterhaltung',
+ FineVeryFine => 'Feinsterhaltung',
+ Fine => 'Feinerhaltung',
+ Average => 'Durchschnittserhaltung',
+ Poor => 'Knochenerhaltung',
+
+ Owned => 'im Besitz',
+ Ordered => 'bestellt',
+ Sold => 'verkauft',
+ ToSell => 'zu verkaufen',
+ Wanted => 'gesucht',
+
+ LightCancellation => 'schwacher Stempel',
+ HeavyCancellation => 'starker Stempel',
+ ModerateCancellation => 'normaler Stempel',
+
+ MintNeverHinged => 'Prägung niemals gefaltet',
+ MintLightHinged => 'Prägung leicht gefaltet',
+ HingedRemnant => 'Faltung sichtbar',
+ HeavilyHinged => 'Stark gefaltet',
+ LargePartOriginalGum => 'Große Teile der originalen Gummierung',
+ SmallPartOriginalGum => 'Kleine Teile der originalen Gummierung',
+ NoGum => 'Keine Gummierung',
+
+ Perfect => 'Perfekt',
+ VeryNice => 'Sehr gut',
+ Nice => 'Gut',
+ Incomplete => 'Unvollständig',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCModels/GCwines.pm b/lib/gcstar/GCLang/DE/GCModels/GCwines.pm
new file mode 100644
index 0000000..cfc9891
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::DE::GCModels::GCwines;
+
+ use utf8;
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Weinsammlung',
+ Items => {0 => 'Wein',
+ 1 => 'Wein',
+ X => 'Weine',
+ },
+
+ NewItem => 'Neuer Wein',
+
+ Name => 'Name',
+ Designation => 'Kennzeichnung',
+ Vintage => 'Jahrgang',
+ Vineyard => 'Weingut',
+ Type => 'Art',
+ Grapes => 'Rebsorte',
+ Soil => 'Erde',
+ Producer => 'Abfüller',
+ Country => 'Land',
+ Volume => 'Inhalt (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Auszeichnungen',
+
+ Storage => 'Aufbewahrung',
+ Location => 'Ortsangabe',
+ ShelfIndex => 'Ablageindex',
+ Quantity => 'Anzahl',
+ Acquisition => 'Erwerb',
+ PurchaseDate => 'Kaufdatum',
+ PurchasePrice => 'Kaufpreis',
+ Gift => 'Geschenk',
+ BottleLabel => 'Etikett',
+ Website => 'Website',
+
+ Tasted => 'verkostet',
+ Comments => 'Kommentar',
+ Serving => 'Portion',
+ TastingField => 'Bemerkungen',
+
+ General => 'Allgemein',
+ Details => 'Einzelheiten',
+ Tasting => 'Geschmack',
+
+ TastedNo => 'nicht gekostet',
+ TastedYes => 'gekostet',
+
+ FilterRange => 'Filter',
+ FilterTastedNo => '_Noch nicht gekostet',
+ FilterTastedYes => 'Bereits _gekostet',
+ FilterRatingSelect => 'Bewertung _mindestens...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/DE/GCstar.pm b/lib/gcstar/GCLang/DE/GCstar.pm
new file mode 100644
index 0000000..2326204
--- /dev/null
+++ b/lib/gcstar/GCLang/DE/GCstar.pm
@@ -0,0 +1,686 @@
+{
+ package GCLang::DE;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Deutsch',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Warnung</b>:
+
+Informationen, die Sie (durch Plugins) von Webseiten herunterladen,
+sind <b>ausschließlich für den persönlichen Gebrauch bestimmt.</b>.
+
+Jede <b>Weitergabe</b> ist ohne die explizite Erlaubnis der
+Seitenbetreiber <b>verboten</b>.
+
+Der Button unter den Elementen verweist Sie auf die jeweilige
+Webseite, von der die Informationen stammen.',
+
+ 'AllItemsFiltered' => 'Kein Element erfüllt Ihre Filtereinstellungen.', # Accepts model codes
+
+ 'InstallDirInfo' => 'Installiere nach ',
+ 'InstallMandatory' => 'Erforderliche Komponenten',
+ 'InstallOptional' => 'Optionale Komponenten',
+ 'InstallErrorMissing' => 'Fehler : Die folgenden Komponenten müssen installiert sein: ',
+ 'InstallPrompt' => 'Basisverzeichnis für die Installation [/usr/local]: ',
+ 'InstallEnd' => 'Installation beendet',
+ 'InstallNoError' => 'Keine Fehler',
+ 'InstallLaunch' => 'Um die Anwendung zu verwenden starten Sie ',
+ 'InstallDirectory' => 'Installationsverzeichnis',
+ 'InstallTitle' => 'Installation von GCstar',
+ 'InstallDependencies' => 'Abhängigkeiten',
+ 'InstallPath' => 'Pfad',
+ 'InstallOptions' => 'Optionen',
+ 'InstallSelectDirectory' => 'Wählen Sie ein Basisverzeichnis für die Installation',
+ 'InstallWithClean' => 'Daten im Installationsverzeichnis löschen',
+ 'InstallWithMenu' => 'GCstar zum Anwendungsmenü hinzufügen',
+ 'InstallNoPermission' => 'Fehler: Sie haben keine Schreibrechte im gewählten Verzeichnis',
+ 'InstallMissingMandatory' => 'Abhängigkeiten können auf Ihrem System nicht gelöst werden. Sie müssen diese ergänzen, um GCstar installieren zu können.',
+ 'InstallMissingOptional' => 'Einige unten aufgelistete optionale Abhängigkeiten können nicht gelöst werden. GCstar kann installiert werden, aber einige Eigenschaften werden nicht verfügbar sein.',
+ 'InstallMissingNone' => 'Es gibt keine ungelösten Abhängigkeiten. Sie können mit der Installation fortfahren.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Fehlt',
+ 'InstallMissingFor' => 'Fehlt für',
+ 'InstallCleanDirectory' => 'Entferne GCstar\'s Dateien im Verzeichnis: ',
+ 'InstallCopyDirectory' => 'Kopiere Dateien in Verzeichnis: ',
+ 'InstallCopyDesktop' => 'Kopiere Desktop Datei nach: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy (drücken Sie Enter für keinen): ',
+ 'UpdateNoPermission' => 'Keine Schreibrechte im Verzeichnis: ',
+ 'UpdateNone' => 'Keine Updates gefunden',
+ 'UpdateFileNotFound' => 'Datei nicht gefunden',
+
+#Splash
+ 'SplashInit' => 'Initialisiere',
+ 'SplashLoad' => 'Lade Sammlung',
+ 'SplashDisplay' => 'Sammlung anzeigen',
+ 'SplashSort' => 'Sammlung sortieren',
+ 'SplashDone' => 'Fertig',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sie scheinen bereits GCfilms benutzt zu haben. Was möchten Sie von GCfilms nach GCstar importieren (die Daten von GCfilms bleiben erhalten)?',
+ 'GCfilmsImportOptions' => 'Einstellungen',
+ 'GCfilmsImportData' => 'Filmliste',
+
+#Menus
+ 'MenuFile' => '_Datei',
+ 'MenuNewList' => '_Neue Liste',
+ 'MenuStats' => 'Statistische Auswertung',
+ 'MenuHistory' => '_Letzte Sammlung',
+ 'MenuLend' => '_Verliehenes anzeigen', # Accepts model codes
+ 'MenuImport' => '_Importieren',
+ 'MenuExport' => '_Exportieren',
+ 'MenuAddItem' => '_Hinzufügen', # Accepts model codes
+
+ 'MenuEdit' => '_Bearbeiten',
+ 'MenuDuplicate' => '{1} _duplizieren', # Accepts model codes
+ 'MenuDuplicatePlural' => '{X} _duplizieren', # Accepts model codes
+ 'MenuEditSelectAllItems' => '_alle {X} auswählen', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '{1} _löschen', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '{X} _löschen', # Accepts model codes
+ 'MenuEditFields' => 'Felder _bearbeiten',
+ 'MenuEditLockItems' => 'Liste _sperren',
+
+ 'MenuDisplay' => '_Filter',
+ 'MenuSavedSearches' => 'Gespeicherte Suchanfragen',
+ 'MenuSavedSearchesSave' => 'Aktuelle Suchanfrage speichern',
+ 'MenuSavedSearchesEdit' => 'Gespeicherte Suchanfragen bearbeiten',
+ 'MenuAdvancedSearch' => 'Erweiterte Suche',
+ 'MenuViewAllItems' => '_Alle {X} anzeigen', # Accepts model codes
+ 'MenuNoFilter' => '_Alle',
+
+ 'MenuConfiguration' => '_Einstellungen',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Sichtbare _Felder',
+ 'MenuBorrowers' => 'Ent_leiher',
+ 'MenuToolbarConfiguration' => '_Werkzeugleiste konfigurieren',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genres _konvertieren',
+
+ 'MenuBookmarks' => 'Meine _Sammlung',
+ 'MenuBookmarksAdd' => 'aktuelle Sammlung _hinzufügen',
+ 'MenuBookmarksEdit' => 'Sammlung _bearbeiten',
+
+ 'MenuHelp' => '_Hilfe',
+ 'MenuHelpContent' => '_Hilfe',
+ 'MenuAllPlugins' => 'Zeige _Plugins',
+ 'MenuBugReport' => '_Programmfehler melden',
+ 'MenuAbout' => '_Ãœber GCstar',
+
+ 'MenuNewWindow' => '{1} in neuem _Fenster zeigen', # Accepts model codes
+ 'MenuNewWindowPlural' => '{X} in neuem _Fenster zeigen', # Accepts model codes
+
+ 'ContextExpandAll' => 'alle ausklappen',
+ 'ContextCollapseAll' => 'alle zusammenklappen',
+ 'ContextChooseImage' => '_Bild wählen',
+ 'ContextOpenWith' => 'Öffnen mit',
+ 'ContextImageEditor' => 'Bildbearbeitungsprogramm',
+ 'ContextImgFront' => 'Vorderseite',
+ 'ContextImgBack' => 'Rückseite',
+ 'ContextChooseFile' => 'Datei auswählen',
+ 'ContextChooseFolder' => 'Verzeichnis auswählen',
+
+ 'DialogEnterNumber' => 'Bitte geben Sie einen Wert ein',
+
+ 'RemoveConfirm' => 'Wollen Sie dieses Element wirklich löschen?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Sollen alle diese {X} wirklich gelöscht werden?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Neues Element', # Accepts model codes
+ 'NewItemTooltip' => '{1} hinzufügen', # Accepts model codes
+ 'NoItemFound' => 'Element nicht gefunden. Möchten Sie auf einer anderen Seite suchen?',
+ 'OpenList' => 'Bitte wählen Sie eine Liste',
+ 'SaveList' => 'Bitte wählen Sie den Speicherort für die Liste',
+ 'SaveListTooltip' => 'Aktuelle Liste speichern',
+ 'SaveUnsavedChanges' => 'Es gibt ungespeicherte Änderungen in Ihrere Sammlung. Wollen Sie diese speichern?',
+ 'SaveDontSave' => 'Nicht speichern',
+ 'PreferencesTooltip' => 'Ändern der Programmeinstellungen',
+ 'ViewTooltip' => 'Anzeige der Liste ändern',
+ 'PlayTooltip' => 'Mit dem Film verknüpftes Video abspielen', # Accepts model codes
+ 'PlayFileNotFound' => 'Abzuspielende Datei nicht gefunden in:',
+ 'PlayRetry' => 'noch einmal versuchen',
+
+ 'StatusSave' => 'Speichere...',
+ 'StatusLoad' => 'Lade...',
+ 'StatusSearch' => 'Suche...',
+ 'StatusGetInfo' => 'Lade Informationen...',
+ 'StatusGetImage' => 'Lade Bild...',
+
+ 'SaveError' => 'Die Liste kann nicht gespeichert werden. Bitte überprüfen Sie die Dateirechte, und ob genügend freier Speicherplatz zur Verfügung steht.',
+ 'OpenError' => 'Kann die Liste nicht öffnen. Bitte überprüfen Sie die Dateirechte.',
+ 'OpenFormatError' => 'Kann die Liste nicht öffnen.',
+ 'OpenVersionWarning' => 'Die Sammlung wurde mit einer neueren Version von GCStar erzeugt. Beim speichern können Daten verloren gehen.',
+ 'OpenVersionQuestion' => 'Möchten Sie trotzdem fortfahren?',
+ 'ImageError' => 'Das Verzeichnis zum Speichern der Bilder ist nicht korrekt. Bitte wählen Sie ein anderes.',
+ 'OptionsCreationError'=> 'Kann die Einstellungsdatei nicht erstellen: ',
+ 'OptionsOpenError'=> 'Kann die Einstellungen nicht laden: ',
+ 'OptionsSaveError'=> 'Kann die Einstellungen nicht speichern: ',
+ 'ErrorModelNotFound' => 'Folgendes Modell wurde nicht gefunden: ',
+ 'ErrorModelUserDir' => 'Die nutzerdefinierten Modelle sind in: ',
+
+ 'RandomTooltip' => '{1} für heute Abend vorschlagen',
+ 'RandomError'=> 'Sie haben keine ungesehenen {X}', # Accepts model codes
+ 'RandomEnd'=> 'Keine weiteren Vorschläge verfügbar', # Accepts model codes
+ 'RandomNextTip'=> 'Nächster Vorschlag',
+ 'RandomOkTip'=> 'Diesen Vorschlag akzeptieren',
+
+ 'AboutTitle' => 'Ãœber GCstar',
+ 'AboutDesc' => 'Gtk2 Sammlungs Manager',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian) : Projektmanager, Programmierer
+Nyall Dawson (Zombiepig) : Programmierer
+TPF : Programmierer
+Adolfo González : Programmierer
+',
+ 'AboutLicense' => 'Veröffentlicht unter den Bedingungen der GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Deutsche Ãœbersetzung von Gabriel Meier und FrenkX',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo und Webdesign von le Spektre',
+
+ 'ToolbarRandom' => 'Heute Abend',
+
+ 'UnsavedCollection' => 'Ungespeicherte Sammlung',
+ 'ModelsSelect' => 'Wählen Sie den Typ der Sammlung',
+ 'ModelsPersonal' => 'Eigene Modelle',
+ 'ModelsDefault' => 'Vorgegebene Modelle',
+ 'ModelsList' => 'Definitionen von Sammlungen',
+ 'ModelSettings' => 'Einstellungen von Sammlungen',
+ 'ModelNewType' => 'Neuer Sammlungstyp',
+ 'ModelName' => 'Name des Sammlungstypes:',
+ 'ModelFields' => 'Felder',
+ 'ModelOptions' => 'Optionen',
+ 'ModelFilters' => 'Filter',
+ 'ModelNewField' => 'Neues Feld',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Beschriftung:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Gruppe:',
+ 'ModelFieldValues' => 'Werte',
+ 'ModelFieldInit' => 'Vorgaben:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Wertliste:',
+ 'ModelFieldListLegend' => '<i>Kommasepariert</i>',
+ 'ModelFieldDisplayAs' => 'Anzeige als:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Bewertungselement',
+ 'ModelFieldTypeShortText' => 'Kurzer Text',
+ 'ModelFieldTypeLongText' => 'Langer Text',
+ 'ModelFieldTypeYesNo' => 'Ja/Nein',
+ 'ModelFieldTypeNumber' => 'Zahl',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Vordefinierte Auswahlliste',
+ 'ModelFieldTypeImage' => 'Bild',
+ 'ModelFieldTypeSingleList' => 'Einfache List',
+ 'ModelFieldTypeFile' => 'Datei',
+ 'ModelFieldTypeFormatted' => 'von anderen Feldern abhängig',
+ 'ModelFieldParameters' => 'Parameter',
+ 'ModelFieldHasHistory' => 'Benutze Verlauf',
+ 'ModelFieldFlat' => 'Auf einer Zeile anzeigen',
+ 'ModelFieldStep' => 'Schrittweite:',
+ 'ModelFieldFileFormat' => 'Dateiformat:',
+ 'ModelFieldFileFile' => 'Einfache Datei',
+ 'ModelFieldFileImage' => 'Bild',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programm',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'E-Book',
+ 'ModelOptionsFields' => 'zu benutzende Felder',
+ 'ModelOptionsFieldsAuto' => 'Automatisch',
+ 'ModelOptionsFieldsNone' => 'Keine',
+ 'ModelOptionsFieldsTitle' => 'Als Titel',
+ 'ModelOptionsFieldsId' => 'Als Identifikator',
+ 'ModelOptionsFieldsCover' => 'Als Cover',
+ 'ModelOptionsFieldsPlay' => 'Für Abspielen Knopf',
+ 'ModelCollectionSettings' => 'Sammlungseinstellungen',
+ 'ModelCollectionSettingsLending' => 'Elemente können verborgt werden',
+ 'ModelCollectionSettingsTagging' => 'Elemente können getaggt werden',
+ 'ModelFilterActivated' => 'Soll in Suchfeld sein',
+ 'ModelFilterComparison' => 'Vergleich',
+ 'ModelFilterContain' => 'Beinhaltet',
+ 'ModelFilterDoesNotContain' => 'ist nicht enthalten',
+ 'ModelFilterRegexp' => 'Regulärer Ausdruck',
+ 'ModelFilterRange' => 'Bereich',
+ 'ModelFilterNumeric' => 'numerischer Vergleich',
+ 'ModelFilterQuick' => 'Schnellen Filter erstellen',
+ 'ModelTooltipName' => 'Benutzen Sie einen Namen, der in vielen Sammlungen verwendet werden kann. Wenn Sie nichts angeben, werden die Einstellungen direkt in der Sammlung gespeichert',
+ 'ModelTooltipLabel' => 'Der Feldname, so wie er angezeigt wird',
+ 'ModelTooltipGroup' => 'Kann zum gruppieren verwendet werden. Elemente ohne Gruppenangabe werden in einer vorgegebenen Gruppe zusammengefasst',
+ 'ModelTooltipHistory' => 'Alle hier eingegebenen Werte werden in einer Liste gespeichert und können darüber auch wieder ausgewählt werden',
+ 'ModelTooltipFormat' => 'Das Format wird benutzt, um eine geeignete Anwendung mit dem "Öffnen"-Knopf zu verbinden',
+ 'ModelTooltipLending' => 'Fügt Felder zur Verwaltung der Ausleihe hinzu',
+ 'ModelTooltipTagging' => 'Fügt Felder zur Verwaltung von Markierungen hinzu',
+ 'ModelTooltipNumeric' => 'In Vergleichsoperationen wird der Wert als Zahl interpretiert',
+ 'ModelTooltipQuick' => 'Fügt ein Untermenü zu "Filter" hinzu',
+
+ 'ResultsTitle' => 'Wählen Sie einen Eintrag', # Accepts model codes
+ 'ResultsNextTip' => 'Auf der nächsten Seite suchen',
+ 'ResultsPreview' => 'Vorschau',
+ 'ResultsInfo' => 'Es können mehrere Elemente durch Auswahl bei gedrückter STRG oder UMSCHALT Taste zu der Sammlung hinzugefügt werden.', # Accepts model codes
+
+ 'OptionsTitle' => 'Einstellungen',
+ 'OptionsExpertMode' => 'Expertenmodus',
+ 'OptionsPrograms' => 'Wählen Sie eine Anwendung für verschiedene Medientypen. Wird nichts eingetragen, werden die Voreinstellungen des Systems verwendet.',
+ 'OptionsBrowser' => 'Internetbrowser',
+ 'OptionsPlayer' => 'Videoabspielprogramm',
+ 'OptionsAudio' => 'Musikabspielprogramm',
+ 'OptionsImageEditor' => 'Bildbearbeitungsprogramm',
+ 'OptionsCdDevice' => 'CD Gerät',
+ 'OptionsImages' => 'Verzeichnis für Bilder',
+ 'OptionsUseRelativePaths' => 'Relative Pfade für Bilder verwenden',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Statusleiste am unteren Fensterrand anzeigen',
+ 'OptionsUseStars' => 'Sterne für die Bewertung nutzen',
+ 'OptionsWarning' => 'Warnung: Die Einstellungen in diesem Panel werden erst nach dem Neustart der Anwendung wirksam!',
+ 'OptionsRemoveConfirm' => 'Löschen von Elementen bestätigen lassen',
+ 'OptionsAutoSave' => 'Sammlung automatisch speichern',
+ 'OptionsAutoLoad' => 'Vorhergehende Sammlung beim Programmstart laden',
+ 'OptionsSplash' => 'Splash-Screen anzeigen',
+ 'OptionsTearoffMenus' => 'Ablösbare Menüs aktivieren',
+ 'OptionsSpellCheck' => 'Rechtschreibprüfung für lange Textfelder verwenden',
+ 'OptionsProgramTitle' => 'Wählen Sie die gewünschte Anwendung',
+ 'OptionsPlugins' => 'Seite zum Bezug von Informationen',
+ 'OptionsAskPlugins' => 'Fragen (Alle Seiten)',
+ 'OptionsPluginsMulti' => 'Mehrere...',
+ 'OptionsPluginsMultiAsk' => 'Fragen (Mehrere...)',
+ 'OptionsPluginsMultiPerField' => 'Mehrere... (pro Feld)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Datenquellen für die einzeln Felder zuordnen',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Jedes ausgewählte Feld wird mit dem ersten gefunden Inhalt gefüllt, von links angefangen.',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Anfang',
+ 'OptionsPluginsMultiPerFieldLast' => 'Ende',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Entfernen',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Ausgewählte Feldliste leeren',
+ 'OptionsPluginsList' => 'Sammlung bearbeiten',
+ 'OptionsAskImport' => 'Zu importierende Felder wählen',
+ 'OptionsProxy' => 'Proxy verwenden',
+ 'OptionsCookieJar' => 'Speichere Cookies in dieser Datei',
+ 'OptionsLang' => 'Sprache',
+ 'OptionsMain' => 'Allgemein',
+ 'OptionsPaths' => 'Pfade',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Eigenschaften',
+ 'OptionsDisplay' => 'Anzeige',
+ 'OptionsToolbar' => 'Werkzeugleiste',
+ 'OptionsToolbars' => {
+ 0 => 'Keine',
+ 1 => 'Klein',
+ 2 => 'Groß',
+ 3 => 'Systemeinstellung'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {
+ 0 => 'Oben',
+ 1 => 'Unten',
+ 2 => 'Links',
+ 3 => 'Rechts'},
+ 'OptionsExpandersMode' => 'ausklappbare Zeile zu lang',
+ 'OptionsExpandersModes' => {
+ 'asis' => 'Unverändert',
+ 'cut' => 'Abschneiden',
+ 'wrap' => 'Zeilenumbruch'},
+ 'OptionsDateFormat' => 'Datumsformat',
+ 'OptionsDateFormatTooltip' => 'Das Format entspricht dem bei der Funktion strftime(3) genutzten. Voreinstellung ist %d/%m/%Y',
+ 'OptionsView' => 'Listenansicht',
+ 'OptionsViews' => {
+ 0 => 'Text',
+ 1 => 'Bilder',
+ 2 => 'Detailliert'},
+ 'OptionsColumns' => 'Spalten',
+ 'OptionsMailer' => 'E-Mail-Versand per',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'E-Mail-Adresse des Absenders',
+ 'OptionsTransform' => 'Artikel ans Ende des Titels stellen',
+ 'OptionsArticles' => 'Artikel (getrennt durch Kommata)',
+ 'OptionsSearchStop' => 'Suche kann abgebrochen werden',
+ 'OptionsBigPics' => 'Große Bilder anzeigen sofern verfügbar',
+ 'OptionsAlwaysOriginal' => 'Titel statt Originaltitel verwenden, wenn dieser nicht vorhanden ist',
+ 'OptionsRestoreAccelerators' => 'Schnellzugriffe wiederherstellen',
+ 'OptionsHistory' => 'Größe des Verlaufs',
+ 'OptionsClearHistory' => 'Verlauf löschen',
+ 'OptionsStyle' => 'Erscheinungsbild',
+ 'OptionsDontAsk' => 'Nicht mehr fragen',
+ 'OptionsPathProgramsGroup' => 'Anwendungsprogramme',
+ 'OptionsProgramsSystem' => 'Nutze systemweite Einstellungen',
+ 'OptionsProgramsUser' => 'Nutze hier angegebene Programme',
+ 'OptionsProgramsSet' => 'Programmeinstellungen',
+ 'OptionsPathImagesGroup' => 'Bilder',
+ 'OptionsInternetDataGroup' => 'Datenimport',
+ 'OptionsInternetSettingsGroup' => 'Einstellungen',
+ 'OptionsDisplayInformationGroup' => 'Informationsanzeige',
+ 'OptionsDisplayArticlesGroup' => 'Artikel',
+ 'OptionsImagesDisplayGroup' => 'Anzeige',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Einstellungen',
+ 'OptionsFeaturesConveniencesGroup' => 'Annehmlichkeiten',
+ 'OptionsPicturesFormat' => 'Prefix für Bilddateien:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titel oder Name für das verbundene Element',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% oder . wird durch das Verzeichnis der Sammlung ersetzt (nur am Anfang der Pfadangabe nutzen!)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% wird durch den Dateinamen der Sammlung ohne Erweiterung (.gcs) ersetzt',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% kann nur am Anfang der Pfadangabe für die Bilder genutzt werden',
+ 'OptionsConfigureMailers' => 'E-Mail Programmeinstellung',
+
+ 'ImagesOptionsButton' => 'Einstellungen',
+ 'ImagesOptionsTitle' => 'Einstellungen für die Bilderliste',
+ 'ImagesOptionsSelectColor' => 'Farbe wählen',
+ 'ImagesOptionsUseOverlays' => '3D-Rahmen um Bild',
+ 'ImagesOptionsBg' => 'Hintergrund',
+ 'ImagesOptionsBgPicture' => 'Hintergrundbild verwenden',
+ 'ImagesOptionsFg'=> 'Auswahl',
+ 'ImagesOptionsBgTooltip' => 'Hintergrundfarbe ändern',
+ 'ImagesOptionsFgTooltip'=> 'Farbe für die Auswahl einstellen',
+ 'ImagesOptionsResizeImgList' => 'Anzahl der Spalten automatisch anpassen',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Größe',
+ 'ImagesOptionsSizeList' => {0 => 'Sehr klein', 1 => 'Klein', 2 => 'Mittel', 3 => 'Groß', 4 => 'Sehr Groß'},
+ 'ImagesOptionsSizeTooltip' => 'Bildgröße auswählen',
+
+ 'DetailedOptionsTitle' => 'Einstellungen für die detaillierte Sammlung',
+ 'DetailedOptionsImageSize' => 'Bildgröße',
+ 'DetailedOptionsGroupItems' => 'Gruppiere Elemente nach',
+ 'DetailedOptionsSecondarySort' => 'Sortiere gruppierte Felder nach',
+ 'DetailedOptionsFields' => 'Anzuzeigende Felder wählen',
+ 'DetailedOptionsGroupedFirst' => 'leere Elemente zusammenhalten',
+ 'DetailedOptionsAddCount' => 'Anzahl der enthaltenen Elemente anzeigen',
+
+ 'ExtractButton' => 'Information',
+ 'ExtractTitle' => 'Dateiinformationen',
+ 'ExtractImport' => 'Werte verwenden',
+
+ 'FieldsListOpen' => 'Lade Liste von Feldern aus Datei',
+ 'FieldsListSave' => 'Speichere Liste von Feldern in Datei',
+ 'FieldsListError' => 'Diese Liste von Feldern kann nicht für diese Sammlung benutzt werden',
+ 'FieldsListIgnore' => '--- Ignoriere',
+
+ 'ExportTitle' => 'Sammlung exportieren',
+ 'ExportFilter' => 'Nur angezeigte Elemente exportieren',
+ 'ExportFieldsTitle' => 'Zu exportierende Felder',
+ 'ExportFieldsTip' => 'Wählen Sie die zu exportierenden Felder',
+ 'ExportWithPictures' => 'Bilder in ein Unterverzeichnis kopieren',
+ 'ExportSortBy' => 'Sortierung nach',
+ 'ExportOrder' => 'Reihenfolge',
+
+ 'ImportListTitle' => 'Eine weitere Sammlung importieren',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Datei',
+ 'ImportExportFieldsUnused' => 'Freie Felder',
+ 'ImportExportFieldsUsed' => 'Verwendete Felder',
+ 'ImportExportFieldsFill' => 'Alle hinzufügen',
+ 'ImportExportFieldsClear' => 'Alle entfernen',
+ 'ImportExportFieldsEmpty' => 'Sie müssen mindestens ein Feld wählen',
+ 'ImportExportFileEmpty' => 'Sie müssen einen Dateinamen angeben',
+ 'ImportFieldsTitle' => 'Zu importierende Felder',
+ 'ImportFieldsTip' => 'Wählen Sie die zu importierenden Felder',
+ 'ImportNewList' => 'Eine neue Sammlung erstellen',
+ 'ImportCurrentList' => 'Zur aktuellen Sammlung hinzufügen',
+ 'ImportDropError' => 'Es gab mindestens einen Fehler beim Öffnen der Dateien. Vorherige Liste wird wiederhergestellt.',
+ 'ImportGenerateId' => 'ID für jedes Element erzeugen',
+
+ 'FileChooserOpenFile' => 'Bitte wählen Sie die zu verwendende Datei',
+ 'FileChooserDirectory' => 'Verzeichnis',
+ 'FileChooserOpenDirectory' => 'Wählen Sie ein Verzeichnis',
+ 'FileChooserOverwrite' => 'Diese Datei existiert bereits. Möchten Sie sie überschreiben?',
+ 'FileAllFiles' => 'Alle Dateien',
+ 'FileVideoFiles' => 'nur Video-Dateien',
+ 'FileEbookFiles' => 'nur Ebook-Dateien',
+ 'FileAudioFiles' => 'nur Audio-Dateien',
+ 'FileGCstarFiles' => 'GCstar Sammlungen',
+
+ 'PanelCompact' => 'Komprimieren',
+ 'PanelReadOnly' => 'Nur Lesen',
+ 'PanelForm' => 'Tabs',
+
+ 'PanelSearchButton' => 'Internetsuche',
+ 'PanelSearchTip' => 'Im Internet nach Informationen zu diesem Titel suchen',
+ 'PanelSearchContextChooseOne' => 'Wähle eine Seite ...',
+ 'PanelSearchContextMultiSite' => 'Verwende "Viele Seiten"',
+ 'PanelSearchContextMultiSitePerField' => 'Verwende "Viele Seiten pro Feld"',
+ 'PanelSearchContextOptions' => 'Optionen ändern ...',
+ 'PanelImageTipOpen' => 'Klicken, um das Bild zu ändern.',
+ 'PanelImageTipView' => 'Klicken, um das Bild in Orginalgröße anzuzeigen.',
+ 'PanelImageTipMenu' => ' Rechtsklick für weitere Optionen.',
+ 'PanelImageTitle' => 'Wählen Sie ein Bild',
+ 'PanelImageNoImage' => 'kein Bild',
+ 'PanelSelectFileTitle' => 'Datei auswählen',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Voreinstellung herstellen',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Noch offene Einträge aus dem Internet auffüllen',
+
+ 'PanelFrom' =>'Von',
+ 'PanelTo' =>'Bis',
+
+ 'PanelWeb' => 'Zeige Informationen',
+ 'PanelWebTip' => 'Zeige Informationen über dieses Element im Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Dieses Element entfernen', # Accepts model codes
+
+ 'PanelDateSelect' => 'Wählen Sie ein Datum',
+ 'PanelNobody' => 'Niemand',
+ 'PanelUnknown' => 'Unbekannt',
+ 'PanelAdded' => 'Hinzufügedatum',
+ 'PanelRating' => 'Bewertung',
+ 'PanelPressRating' => 'Fremdbewertung',
+ 'PanelLocation' => 'Ort',
+
+ 'PanelLending' => 'Verleih',
+ 'PanelBorrower'=> 'Entleiher',
+ 'PanelLendDate'=> 'verliehen am',
+ 'PanelHistory'=> 'Verlauf',
+ 'PanelReturned' => 'Element zurückgegeben', # Accepts model codes
+ 'PanelReturnDate' => 'Rückgabedatum',
+ 'PanelLendedYes' => 'Verliehen',
+ 'PanelLendedNo' => 'Verfügbar',
+
+ 'PanelTags' => 'Markierungen',
+ 'PanelFavourite' => 'Favoriten',
+ 'TagsAssigned' => 'Zugeordnete Markierungen',
+
+ 'PanelUser' => 'Nutzerfeld',
+
+ 'CheckUndef' => 'Egal',
+ 'CheckYes' => 'Ja',
+ 'CheckNo' => 'Nein',
+
+ 'ToolbarAll' => 'Zeige alle',
+ 'ToolbarAllTooltip' => 'Alle Elemente anzeigen',
+ 'ToolbarGroupBy' => 'Gruppiere nach',
+ 'ToolbarGroupByTooltip' => 'Wählen Sie das Feld, nach dem die Einträge gruppiert werden sollen',
+ 'ToolbarQuickSearch' => 'Schnelle Suche',
+ 'ToolbarQuickSearchLabel' => 'Suche',
+ 'ToolbarQuickSearchTooltip' => 'Bitte wählen Sie das Feld, in dem gesucht werden soll. Geben Sie den Suchbegriff ein und drücken Sie anschließend Enter.',
+ 'ToolbarSeparator' => ' Trenner',
+
+ 'PluginsTitle' => 'Nach einem Element suchen',
+ 'PluginsQuery' => 'Abfrage',
+ 'PluginsFrame' => 'Eine Website durchsuchen',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Name',
+ 'PluginsSearchFields' => 'Suchfelder',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Sprache',
+ 'PluginsUseSite' => 'Gewählte Seite für zukünftige Suchen verwenden',
+ 'PluginsPreferredTooltip' => 'Empfohlen von GCstar',
+ 'PluginDisabled' => 'Deaktiviert',
+
+ 'BorrowersTitle' => 'Entleiher bearbeiten',
+ 'BorrowersList' => 'Entleiher',
+ 'BorrowersName' => 'Name',
+ 'BorrowersEmail' => 'E-Mail',
+ 'BorrowersAdd' => 'Hinzufügen',
+ 'BorrowersRemove' => 'Entfernen',
+ 'BorrowersEdit' => 'Bearbeiten',
+ 'BorrowersTemplate' => 'E-Mail Vorlage',
+ 'BorrowersSubject' => 'E-Mail Betreff',
+ 'BorrowersNotice1' => '%1 wird durch den Namen des Entleihers ersetzt',
+ 'BorrowersNotice2' => '%2 wird durch den Titel ersetzt',
+ 'BorrowersNotice3' => '%3 wird durch das Entleihdatum ersetzt',
+
+ 'BorrowersImportTitle' => 'Importiere Informationen zum Ausleiher',
+ 'BorrowersImportType' => 'Dateiformat:',
+ 'BorrowersImportFile' => 'Datei:',
+
+ 'BorrowedTitle' => 'Verliehene Elemente', # Accepts model codes
+ 'BorrowedDate' => 'Seit',
+ 'BorrowedDisplayInPanel' => 'Elemente im Hauptfenster anzeigen', # Accepts model codes
+
+ 'MailTitle' => 'E-Mail senden',
+ 'MailFrom' => 'Von: ',
+ 'MailTo' => 'An: ',
+ 'MailSubject' => 'Betreff: ',
+ 'MailSmtpError' => 'Problem beim Verbinden zum SMTP-Server',
+ 'MailSendmailError' => 'Problem beim Starten von Sendmail',
+
+ 'SearchTooltip' => 'Alle Elemente durchsuchen', # Accepts model codes
+ 'SearchTitle' => 'Titelsuche', # Accepts model codes
+ 'SearchNoField' => 'Es wurden keine Felder für die Suchanfrage ausgewählt.
+Füge einige davon in der Filtersektion unter Einstellungen hinzu.',
+
+ 'QueryReplaceField' => 'Felder zu ersetzen',
+ 'QueryReplaceOld' => 'Bisheriger Name',
+ 'QueryReplaceNew' => 'Neuer Name',
+ 'QueryReplaceLaunch' => 'Ersetzen',
+
+ 'ImportWindowTitle' => 'Wählen Sie die zu importierenden Felder',
+ 'ImportViewPicture' => 'Bild ansehen',
+ 'ImportSelectAll' => 'Alles auswählen',
+ 'ImportSelectNone' => 'Nichts auswählen',
+
+ 'MultiSiteTitle' => 'Seite für Internetrecherche',
+ 'MultiSiteUnused' => 'Nicht verwendete Plugins',
+ 'MultiSiteUsed' => 'Zu verwendende Plugins',
+ 'MultiSiteLang' => 'deutschsprachige Plugins verwenden',
+ 'MultiSiteEmptyError' => 'Die Liste der zu verwendenden Plugins ist leer!',
+ 'MultiSiteClear' => 'Liste löschen',
+
+ 'DisplayOptionsTitle' => 'Anzuzeigende Felder',
+ 'DisplayOptionsAll' => 'Alle auswählen',
+ 'DisplayOptionsSearch' => 'Suchbutton',
+
+ 'GenresTitle' => 'Genre konvertieren',
+ 'GenresCategoryName' => 'Verwendete Genres',
+ 'GenresCategoryMembers' => 'Zu ersetzende Genres',
+ 'GenresLoad' => 'Lade eine Liste',
+ 'GenresExport' => 'Liste in Datei speichern',
+ 'GenresModify' => 'Genre bearbeiten',
+
+ 'PropertiesName' => 'Name der Sammlung',
+ 'PropertiesLang' => 'Sprachcode',
+ 'PropertiesOwner' => 'Besitzer',
+ 'PropertiesEmail' => 'E-Mail',
+ 'PropertiesDescription' => 'Beschreibung',
+ 'PropertiesFile' => 'Dateieigenschaften',
+ 'PropertiesFilePath' => 'Vollständiger Pfad',
+ 'PropertiesItemsNumber' => 'Anzahl enthaltener Elemente', # Accepts model codes
+ 'PropertiesFileSize' => 'Dateigröße',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Eigenschaften der Sammlung',
+ 'PropertiesDefaultPicture' => 'Standardbild',
+
+ 'MailProgramsTitle' => 'Programm zum senden von E-Mails',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Kommandozeile',
+ 'MailProgramsRestore' => 'Vorgabe wiederherstellen',
+ 'MailProgramsAdd' => 'Programm hinzufügen',
+ 'MailProgramsInstructions' => 'In der Kommandozeile werden einige Ersetzungen vorgenommen:
+ %f wird ersetzt mit der E-Mailadresse des Nutzers.
+ %t wird ersetzt mit der E-Mailadresse des Empfängers.
+ %s wird ersetzt mit dem Betreff der Nachricht.
+ %b wird ersetzt mit dem Nachrichtentext.',
+
+ 'BookmarksBookmarks' => 'Lesezeichen',
+ 'BookmarksFolder' => 'Verzeichnis',
+ 'BookmarksLabel' => 'Beschriftung',
+ 'BookmarksPath' => 'Pfad',
+ 'BookmarksNewFolder' => 'Neues Verzeichnis',
+
+ 'AdvancedSearchType' => 'Art der Suche',
+ 'AdvancedSearchTypeAnd' => 'Elemente, die alle Kriterien erfüllen', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elemente, die mindestens ein Kriterium erfüllen', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Suchkriterium',
+ 'AdvancedSearchAnyField' => 'In allen Elementen',
+ 'AdvancedSearchSaveTitle' => 'Suchanfrage speichern',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'Es existiert bereits eine Suchanfrage mit diesem Namen. Bitte nutzen Sie einen anderen.',
+ 'AdvancedSearchUseCase' => 'Groß/Kleinschreibung beachten',
+ 'AdvancedSearchIgnoreDiacritics' => 'Sonderzeichen ignorieren',
+
+ 'BugReportSubject' => 'Fehlermeldung erstellt von GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Betriebssystem',
+ 'BugReportMessage' => 'Fehlermeldung',
+ 'BugReportInformation' => 'Zusätzliche Informationen',
+
+#Statistics
+ 'StatsFieldToUse' => 'Auszuwertendes Feld',
+ 'StatsSortByNumber' => 'Nach Anzahl der {X} sortieren',
+ 'StatsGenerate' => 'Erzeugen',
+ 'StatsKindOfGraph' => 'Diagrammart',
+ 'StatsBars' => 'Balken',
+ 'StatsPie' => 'Kuchen',
+ 'Stats3DPie' => '3D Kuchen',
+ 'StatsArea' => 'Fläche',
+ 'StatsHistory' => 'Häufigkeitsverteilung',
+ 'StatsWidth' => 'Breite',
+ 'StatsHeight' => 'Höhe',
+ 'StatsFontSize' => 'Schriftgröße',
+ 'StatsDisplayNumber' => 'Häufigkeiten eintragen',
+ 'StatsSave' => 'Diagramm als Grafik speichern',
+ 'StatsAccumulate' => 'Werte zusammenzählen',
+ 'StatsShowAllDates' => 'alle Daten berücksichtigen',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..2c50d30
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Îα συμπεÏιλαμβανονται τα ονοματα των πεδίων στην αÏχή',
+ 'Separator' => 'ΔιαχωÏιστής',
+ 'Replacement' => 'Αντικατάσταση διαχωÏιστή με',
+ 'Charset' => 'Κωδικοποίηση χαÏακτήÏων',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..98e21f7
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..49f373d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::EL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'ΆκυÏο αÏχείο μοντέλου',
+ 'UseFile' => 'ΧÏήση του κατωτέÏω αÏχείου',
+ 'WithJS' => 'ΧÏήση Javascript',
+ 'FileTemplate' => 'Μοντέλο',
+ 'Preview' => 'ΠÏοεπισκόπηση',
+ 'NoPreview' => 'Δεν είναι διαθέσιμη η Ï€Ïοεπισκόπιση',
+ 'TemplateExternalFile' => 'ΑÏχείο μοντέλου',
+ 'Title' => 'Τίτλος σελίδας',
+ 'InfoFile' => 'Η λίστα βÏίσκεται μέσα στο αÏχείο: ',
+ 'InfoDir' => 'Οι εικόνες είναι στο: ',
+ 'HeightImg' => 'Ύψος (in pixels) των εικόνων',
+ 'OpenFileInBrowser' => 'Άνοιγμα του δημιουÏγημένου αÏχείου στον web browser',
+ 'Note' => 'Η λίστα δημιουÏγήθηκε από <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Εισάγετε το κείμενο για αναζήτηση',
+ 'SearchType1' => 'Τίτλος μόνο',
+ 'SearchType2' => 'Όλες οι πληÏοφοÏίες',
+ 'SearchButton' => 'Αναζήτηση',
+ 'SearchTitle' => 'Εμφάνιση μόνο των ταινιών που αντιστοιχοÏν στα Ï€ÏοηγοÏμενα κÏιτήÏια',
+ 'AllButton' => 'Όλα',
+ 'AllTitle' => 'Εμφάνιση όλων των ταινιών',
+ 'Expand' => 'Επέκταση όλων',
+ 'ExpandTitle' => 'Εμφάνιση πληÏοφοÏιών όλων των ταινιών',
+ 'Collapse' => 'ΑπόκÏυψη όλων',
+ 'CollapseTitle' => 'ΑπόκÏυψη πληÏοφοÏιών όλων των ταινιών',
+ 'Borrowed' => 'Δανείστηκε από : ',
+ 'NotBorrowed' => 'Διαθέσιμο',
+ 'Top' => 'Επάνω',
+ 'Bottom' => 'Κάτω',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..023f556
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Όνομα βάσης δεδομένων',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..75ebec8
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Include DROP instruction',
+ 'WithCreate' => 'Include CREATE instruction',
+ 'TableName' => 'Όνομα πίνακα',
+ 'InfoFile' => 'ΑÏχείο SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..a4058e9
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Το αÏχείο είναι μέσα στο αÏχείο: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..8d91a99
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::EL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'ΑÏχείο μοντέλου',
+ 'ModelText' => 'Κείμενο του μοντέλου',
+ 'Models' => 'ΧÏήση του μοντέλου',
+ 'UseFile' => 'ΧÏήση αÏχείου',
+ 'UseModel' => 'ΧÏήση πεÏιοχής κειμένου',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..2a2d87d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::EL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Αναζήτηση:',
+ 'Default' => 'ΠÏοεπιλεγμένος κατάλογος Alexandria',
+ 'Specified' => 'Ο κατωτέÏο κατάλογος',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..cf004be
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Κωδικοποίηση χαÏακτήÏων',
+ 'Header' => 'Îα αγνοηθεί η Ï€Ïώτη γÏαμμή',
+ 'Separator' => 'ΔιαχωÏιστής',
+ 'Plugin' => 'Ιστοσελίδες που θα χÏησιμοποιηθοÏν',
+ 'UseFirst' => 'Αν υπάÏχουν πεÏισσότεÏα αποτελέσματα να επιλέγεται το Ï€Ïώτο',
+ 'SearchField' => 'Αναζήτηση αντικειμένων χÏησιμοποιώντας',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..857fd95
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportFolder.pm
@@ -0,0 +1,67 @@
+{
+ package GCLang::EL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Φάκελος',
+ 'Recursive' => 'ΕξεÏεÏνηση υπό-καταλόγων',
+ 'Suffixes' => 'Suffixes ή η επέκταση των αÏχείων',
+ 'SuffixesTooltip' => 'Îα ληφθεί Ï…Ï€\'όψη η λίστα με διαχωÏισμό με κόμμα των suffixes ή με τις επεκτάσεις των αÏχείων',
+ 'Remove' => 'Îα διαγÏαφεί από τα ονόματα',
+ 'RemoveTooltip' => 'Η λίστα των λέξεων διαχωÏισμένες με κόμμα που θα Ï€Ïέπει να διαγÏαφεί από τα ονόματα αÏχείων για την δημιουÏγία ονόματος αναζήτησης',
+ 'Ask'=> 'ΕÏώτηση',
+ 'AskEnd'=> 'εÏώτηση όλων στο τέλο',
+ 'AddWithoutInfo'=> 'ΠÏοσθήκη χωÏίς πληÏοφοÏίες',
+ 'DontAdd'=> 'Îα μην Ï€Ïοστεθεί',
+ 'TakeFirst' => 'Επιλογή Ï€Ïώτου',
+ 'MultipleResult'=> 'Αγνόησε όταν υπάÏχουν πεÏισσότεÏο από 1 απαντήσεις',
+ 'MultipleResultTooltip'=> 'Το αÏχείο θα Ï€Ïοστεθεί χωÏίς αναζήτηση πληÏοφοÏιών αν υπάÏχουν πεÏισσότεÏο από 1 απαντήσεις',
+ 'RemoveWholeWord' => 'ΑφαίÏεση μόνο ολόκληÏων λέξεων',
+ 'RemoveTooltipWholeWord' => 'Οι λέξεις θα αφαιÏοÏνται μόνο αν εμφανίζονται σαν ολόκληÏη λέξη',
+ 'RemoveRegularExpr' => 'Κανονική έκφÏαση',
+ 'RemoveTooltipRegularExpr' => 'Υπολογίστε ότι \'Για να αφαιÏεθεί από τα ονόματα\' είναι μια κανονική έκφÏαση perl',
+ 'SkipFileAlreadyInCollection' => 'ΠÏοσθήκη μόνο νέων αÏχείων',
+ 'SkipFileAlreadyInCollectionTooltip' => 'ΠÏοσθήκη μόνο των αÏχείων που δεν υπάÏχουν στη συλλογή',
+ 'SkipFileNo' => 'Όχι',
+ 'SkipFileFullPath' => 'βασισμένο σε ολόκληÏη τη διαδÏομή',
+ 'SkipFileFileName' => 'βασισμένο στο όνομα αÏχείου',
+ 'SkipFileFileNameAndUpdate' => 'βασισμένο στο όνομα αÏχείου (αλλά με ενημέÏωση διαδÏομής στη συλλογή)',
+ 'NoResult'=> 'Κανένα αποτέλεσμα',
+ 'NoResultTooltip'=> 'Τι θα γίνεται αν δεν βÏεθοÏν αποτελέσματα αναζήτησης από το Ï€Ïόσθετο',
+ 'InfoFromFileNameRegExp' => 'Ανάλυση ονόματος αÏχείου με αυτη την κανονική έκφÏαση',
+ 'InfoFromFileNameRegExpTooltip' => 'ΧÏήση Î±Ï…Ï„Î¿Ï Î³Î¹Î± ανάκτηση πληÏοφοÏιών από το όνομα αÏχείου (εφαÏμόζεται μετά την αφαίÏεση της επέκτασης). Αφήστε κενό αν δεν χÏησιμοποιείται. Γνωστά πεδία: $T:Τίτλος, $A:Τίτλος αλφαβητικά, $Y:ΗμεÏομηνία έκδοσης, $S:Σεζόν, $E:Επισόδειο, $N:Όνομα σειÏάς αλφαβητικά, $x:ΑÏιθμός μέÏους, $y: ΣÏνολο αÏÎ¹Î¸Î¼Î¿Ï Î¼ÎµÏών',
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..c29abd3
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'ΑντιγÏαφή εικόνων',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..ff1d219
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Όνομα λίστας',
+ 'Plugin' => 'Ιστοσελίδες που θα χÏησιμοποιηθοÏν',
+ 'UseFirst' => 'Αν υπάÏχουν πεÏισσότεÏα αποτελέσματα να επιλέγεται το Ï€Ïώτο',
+ 'CommentAuto' => 'Εισαγωγή στοιχείου αυτόματα.',
+ 'CommentSite' => 'Ιστοσελίδα: ',
+ 'CommentTitle' => 'Τίτλος: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..7dc51ef
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::EL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..bcc4e1d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Το αÏχείο δεν είναι Ï„Ïπου Tellico collection',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..7666f79
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,45 @@
+{
+ package GCLang::EL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'Συλλογή τηλεοπτικών εκπομπών',
+ Items => 'Επεισόδια',
+ NewItem => 'Îέο επεισόδιο',
+ NewSeries => 'Îέα σειÏά',
+ Episode => 'Επεισόδιο',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7ba017c
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::EL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή τηλεοπτικών σειÏών',
+ Items => { 0 => 'ΣειÏά',
+ 1 => 'ΣειÏά',
+ X => 'ΣειÏές',
+ lowercase1 => 'σειÏά',
+ lowercaseX => 'σειÏές'
+ },
+ NewItem => 'Îέα σειÏά',
+ Name => 'Όνομα',
+ Season => 'Σεζόν',
+ Part => 'ΜέÏος',
+ Episodes => 'Επισόδεια',
+ FirstAired => 'ΠÏώτη Ï€Ïοβολή',
+ Time => 'ΔιάÏκεια',
+ Producer => 'ΠαÏαγωγός',
+ Music => 'Μουσική',
+ );
+ importTranslation('ταινίες');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..1c4ca21
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::EL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή επιτÏαπέζιων παιχνιδιών',
+ Items => {0 => 'Παιχνίδι',
+ 1 => 'Παιχνίδι',
+ X => 'Παιχνίδια'},
+ NewItem => 'Îέο παιχνίδι',
+
+ Id => 'Id',
+ Name => 'Όνομα',
+ Original => 'Αυθεντικό όνομα',
+ Box => 'Εικόνα συσκευασίας',
+ DesignedBy => 'ΔημιουÏγός',
+ PublishedBy => 'Εκδότης',
+ Players => 'ΑÏιθμός παικτών',
+ PlayingTime => 'ΧÏόνος παÏτίδας',
+ SuggestedAge => 'ΠÏοτεινόμενη ηλικία',
+ Released => 'ΗμεÏομηνία έκδοσης',
+ Description => 'ΠεÏιγÏαφή',
+ Category => 'ΚατηγοÏία',
+ Mechanics => 'Μηχανισμοί',
+ ExpandedBy => 'ΥπάÏχουσα επέκταση',
+ ExpansionFor => 'Επέκταση για',
+ GameFamily => 'ΚατηγοÏία παιχνιδιοÏ',
+ IllustratedBy => 'ΕικονογÏάφηση από',
+ Url => 'Ιστοσελίδα',
+ TimesPlayed => 'ΑÏιθμός παÏτίδων που έχουν παιχτεί',
+ CompleteContents => 'ΠλήÏες πεÏιεχόμενο',
+ Copies => 'ΑÏιθμός αντιγÏάφων',
+ Condition => 'Κατάσταση',
+ Photos => 'Εικόνες',
+ Photo1 => 'ΠÏώτη εικόνα',
+ Photo2 => 'ΔεÏτεÏη εικόνα',
+ Photo3 => 'ΤÏίτη εικόνα',
+ Photo4 => 'ΤέταÏτη εικόνα',
+ Comments => 'Σχόλια',
+
+ Perfect => 'ΕξαίÏετο',
+ Good => 'Καλό',
+ Average => 'ΜέτÏιο',
+ Poor => 'Κακό',
+
+ CompleteYes => 'ΠλήÏες πεÏιεχόμενο',
+ CompleteNo => 'Ελλειπή στοιχεία',
+
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+ Personal => 'ΠÏοσωπικά',
+ Information => 'ΠληÏοφοÏίες',
+
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/EL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..fd601f1
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::EL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή βιβλίων',
+ Items => {0 => 'Βιβλίο',
+ 1 => 'Βιβλίο',
+ X => 'Βιβλία'},
+ NewItem => 'Îέο βιβλίο',
+
+ Isbn => 'ISBN',
+ Title => 'Τίτλος',
+ Cover => 'Εξώφυλλο',
+ Authors => 'ΣυγγÏαφέας',
+ Publisher => 'Εκδότης',
+ Publication => 'ΗμεÏομηνία έκδοσης',
+ Language => 'Γλώσσα',
+ Genre => 'ΚατηγοÏία',
+ Serie => 'ΣειÏά',
+ Rank => 'Rank',
+ Bookdescription => 'ΠεÏιγÏαφή',
+ Pages => 'Σελίδες',
+ Read => 'Διαβασμένο',
+ Acquisition => 'ΗμεÏομηνία απόκτησης',
+ Edition => 'Έκδοση',
+ Format => 'ΜοÏφή',
+ Comments => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+ Translator => 'ΜετάφÏαση:',
+ Artist => 'Επιμέλεια:',
+ DigitalFile => 'Digital version',
+
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/EL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..004537d
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::EL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή νομισμάτων',
+ Items => {0 => 'Îόμισμα',
+ 1 => 'Îόμισμα',
+ X => 'Îομίσματα'},
+ NewItem => 'Îέο νόμισμα',
+
+ Name => 'Όνομα',
+ Country => 'ΧώÏα',
+ Year => 'Έτος',
+ Currency => 'Îόμισμα',
+ Value => 'Αξία',
+ Picture => 'ΚεντÏική εικόνα',
+ Diameter => 'ΔιάμετÏος',
+ Metal => 'Μέταλλο',
+ Edge => 'Στεφάνη',
+ Edge1 => 'Στεφάνη 1',
+ Edge2 => 'Στεφάνη 2',
+ Edge3 => 'Στεφάνη 3',
+ Edge4 => 'Στεφάνη 4',
+ Head => 'Όψη κÏÏια',
+ Tail => 'Όψη πίσω',
+ Comments => 'Σχόλια',
+ History => 'ΙστοÏικό',
+ Website => 'Ιστοσελίδα',
+ Estimate => 'Εκτιμώμενη αξία (€)',
+ References => 'ΠαÏαπομπές',
+ Type => 'ΤÏπος',
+ Coin => 'ΚέÏμα',
+ Banknote => 'ΧαÏτονόμισμα',
+
+ Main => 'ΚυÏίως',
+ Description => 'ΠεÏιγÏαφή',
+ Other => 'Λοιπές πληÏοφοÏίες',
+ Pictures => 'Εικόνες',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/EL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..b5cc1de
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::EL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή Κόμικς',
+ Items => {0 => 'Κόμικς',
+ 1 => 'Κόμικ',
+ X => 'Κόμικς'},
+ NewItem => 'Îέο κόμικ',
+
+
+ Id => 'Id',
+ Name => 'Όνομα',
+ Series => 'ΣειÏά',
+ Volume => 'Τόμος',
+ Title => 'Τίτλος',
+ Writer => 'ΣυγγÏαφέας',
+ Illustrator => 'ΕικονογÏάφος',
+ Colourist => 'ΚολοÏίστας',
+ Publisher => 'Εκδότης',
+ Synopsis => 'ΠεÏίληψη',
+ Collection => 'Συλλογή',
+ PublishDate => 'ΗμεÏομηνία έκδοσης',
+ PrintingDate => 'ΗμεÏομηνία εκτÏπωσης',
+ ISBN => 'ISBN',
+ Type => 'ΤÏπος',
+ Category => 'ΚατηγοÏία',
+ Format => 'ΜοÏφή',
+ NumberBoards => 'ΑÏιθμός Σελίδων',
+ Signing => 'ΑφιέÏωση',
+ Cost => 'Κόστος',
+ Rating => 'Βαθμολογία',
+ Comment => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+
+ FilterRatingSelect => 'Βαθμός _τουλάχιστο...',
+
+ Main => 'ΚεντÏικό μενοÏ',
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/EL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..7dea458
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::EL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή ταινιών',
+ Items => {0 => 'Ταινία',
+ 1 => 'Ταινία',
+ X => 'Ταινίες'},
+ NewItem => 'Îέα ταινία',
+
+
+ Id => 'Id',
+ Title => 'Τίτλος',
+ Date => 'ΗμεÏομηνία',
+ Time => 'ΔιάÏκεια',
+ Director => 'Σκηνοθέτης',
+ Country => 'ΧώÏα',
+ MinimumAge => 'ÎŒÏιο ηλικίας',
+ Genre => 'Είδος',
+ Image => 'Εικόνα',
+ Original => 'Αυθεντικός τίτλος',
+ Actors => 'Ηθοποιοί',
+ Actor => 'Ηθοποιός',
+ Role => 'Ρόλος',
+ Comment => 'Σχόλια',
+ Synopsis => 'ΠεÏίληψη',
+ Seen => 'Το \'χω δει',
+ Number => 'ΑÏιθμός',
+ Format => 'ΤÏπος μέσου',
+ Region => 'ΧώÏα',
+ Identifier => 'ΑναγνωÏιστικό',
+ Url => 'Ιστοσελίδα',
+ Audio => 'Ήχος',
+ Video => 'Video format',
+ Trailer => 'ΑÏχείο video',
+ Serie => 'ΣειÏά',
+ Rank => 'Rank',
+ Subtitles => 'Υπότιτλοι',
+
+ SeenYes => 'Το \'χω δει',
+ SeenNo => 'Δεν το \'χω δει',
+
+ AgeUnrated => 'Άγνωστο',
+ AgeAll => 'Για όλη την οικογένεια',
+ AgeParent => 'Με γονική συναίνεση',
+
+ Main => 'Βασικά στοιχεία',
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+
+ Information => 'ΠληÏοφοÏίες',
+ Languages => 'Γλώσσες',
+ Encoding => 'Κωδικοποίηση',
+
+ FilterAudienceAge => 'Ηλικία θεατή',
+ FilterSeenNo => '_Δεν το \'χω δει',
+ FilterSeenYes => '_Το \'χω δει',
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...',
+
+ ExtractSize => 'Μέγεθος',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCgames.pm b/lib/gcstar/GCLang/EL/GCModels/GCgames.pm
new file mode 100644
index 0000000..807a47f
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::EL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή παιχνιδιών Video ',
+ Items => {0 => 'Παιχνίδι',
+ 1 => 'Παιχνίδι',
+ X => 'Παιχνίδια'},
+ NewItem => 'Îέο παιχνίδι',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Όνομα',
+ Platform => 'ΠλατφόÏμα',
+ Players => 'ΑÏιθμός παικτών',
+ Released => 'ΗμεÏομηνία έκδοσης',
+ Editor => 'Εκδότης',
+ Developer => 'ΔημιουÏγός',
+ Genre => 'Είδος',
+ Box => 'Εικόνα συσκευασίας',
+ Case => 'Συσκευασία',
+ Manual => 'Οδηγίες χÏήσης',
+ Completion => 'ΟλοκλήÏωση (%)',
+ Executable => 'Εκτελέσιμο',
+ Description => 'ΠεÏιγÏαφή',
+ Codes => 'Κωδικοί',
+ Code => 'Κώδικας',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Στιγμιότυπα',
+ Screenshot1 => 'ΠÏώτο στιγμιότυπο',
+ Screenshot2 => 'ΔεÏτεÏο στιγμιότυπο',
+ Comments => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+ Unlockables => 'ΜποÏοÏν να ξεκλειδωθουν',
+ Unlockable => 'ΜποÏεί να ξεκλειδωθεί',
+ Howto => 'ΤÏόπος ξεκλειδώματος',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'ΠεÏιοχή',
+ SerialNumber => 'ΣειÏιακός αÏιθμός',
+
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+ Tips => 'Tips',
+ Information => 'ΠληÏοφοÏίες',
+
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..2e18bbe
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/EL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..54fc2e1
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::EL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή μινιατοÏÏων αυτοκινήτων',
+ Items => {0 => 'Όχημα',
+ 1 => 'Όχημα',
+ X => 'Οχήματα',
+ lowercase1 => 'όχημα',
+ lowercaseX => 'οχήματα'
+ },
+ NewItem => 'Îέο όχημα',
+ Currency => 'Îόμισμα',
+
+# Main fields
+
+ Main => 'ΚÏÏιες πληÏοφοÏίες',
+
+ Name => 'Όνομα',
+ Exchange => 'ΠÏος πώληση ή ανταλλαγή',
+ Wanted => 'Ζήτηση',
+ Rating1 => 'ΚÏÏια αξιολόγηση',
+ Picture1 => 'ΚÏÏια εικόνα',
+ Scale => 'Κλίμακα',
+ Manufacturer => 'ΕÏγοστάσιο',
+ Constructor => 'Κατασκευαστής',
+ Type1 => 'ΤÏπος',
+ Modele => 'Μοντέλο',
+ Version => 'Έκδοση',
+ Color => 'ΧÏώμα μοντέλου',
+ Pub => 'Διαφήμιση',
+ Year => 'Έτος',
+ Reference => 'Κωδικός',
+ Kit => 'Σε κιτ',
+ Transformation => 'ΠÏοσωπική Ï„Ïοποποίηση',
+ Comments1 => 'Σχόλια',
+
+# Details fields
+
+ Details => 'ΛεπτομέÏειες',
+
+ MiscCharacteristics => 'ΔιάφοÏα χαÏακτηÏιστικά',
+ Material => 'Υλικό',
+ Molding => 'ΚαλοÏπι',
+ Condition => 'Κατάσταση',
+ Edition => 'Έκδοση',
+ Collectiontype => 'Όνομα συλλογής',
+ Serial => 'ΣειÏά',
+ Serialnumber => 'ΣειÏιακός αÏιθμός',
+ Designed => 'ΗμεÏομηνία σχεδιασμοÏ',
+ Madein => 'ΗμεÏομηνία κατασκευής',
+ Box1 => 'ΤÏπος κουτιοÏ',
+ Box2 => 'ΠεÏιγÏαφή κουτιοÏ',
+ Containbox => 'ΠεÏιεχόμενο κουτιοÏ',
+ Rating2 => 'Ρεαλιστικό',
+ Rating3 => 'ΦινίÏισμα',
+ Acquisition => 'ΗμεÏομηνία αγοÏάς',
+ Location => 'Τόπος αγοÏάς',
+ Buyprice => 'Τιμή αγοÏάς',
+ Estimate => 'Εκτίμηση',
+ Comments2 => 'Σχόλια',
+ Decorationset => 'Σετ διακόσμησης',
+ Characters => 'ΧαÏακτήÏες',
+ CarFromFilm => 'Αυτοκίνητο από ταινία',
+ Filmcar => 'Ταινία σχετική με το όχημα',
+ Filmpart => 'ΜέÏος/επισόδειο ταινίας',
+ Parts => 'ΑÏιθμός μεÏών',
+ VehiculeDetails => 'ΛεπτομέÏειες αυτοκινήτου',
+ Detailsparts => 'Αναλυτικά στοιχεία',
+ Detailsdecorations => 'ΤÏπος διακοσμήσεων',
+ Decorations => 'ΑÏιθμός διακοσμήσεων',
+ Lwh => 'Μήκος / Πλάτος / Ύψος',
+ Weight => 'ΒάÏος',
+ Framecar => 'Σασί',
+ Bodycar => 'Αμάξωμα',
+ Colormirror => 'ΧÏώμα μοντέλου',
+ Interior => 'ΕσωτεÏικό',
+ Wheels => 'ΤÏοχοί',
+ Registrationnumber1 => 'ΕμπÏόσθιος αÏιθμός καταχώÏησης',
+ Registrationnumber2 => 'Οπίσθιος αÏιθμός καταχώÏησης',
+ RacingCar => 'Αγωνιστικό αυτοκίνητο',
+ Course => 'Αγώνας',
+ Courselocation => 'Τοποθεσία αγώνα',
+ Courseyear => 'ΗμεÏομηνία αγώνα',
+ Team => 'Ομάδα',
+ Pilots => 'Οδηγός(οι)',
+ Copilots => 'Συνοδηγός(οι)',
+ Carnumber => 'ΑÏιθμός οχήματος',
+ Pub2 => 'Διαφημιστές',
+ Finishline => 'Τελική κατάταξη',
+ Steeringwheel => 'Θέση τιμονιοÏ',
+
+
+# Catalogs fields
+
+ Catalogs => 'Κατάλογοι',
+
+ OfficialPicture => 'Επίσημη εικόνα',
+ Barcode => 'Barcode',
+ Referencemirror => 'Κωδικός',
+ Year3 => 'ΗμεÏομηνία διαθεσιμότητας',
+ CatalogCoverPicture => 'Εξώφυλλο',
+ CatalogPagePicture => 'Σελίδα',
+ Catalogyear => 'Έτος καταλόγου',
+ Catalogedition => 'Έκδοση καταλόγου',
+ Catalogpage => 'Σελίδα καταλόγου',
+ Catalogprice => 'Τιμή καταλόγου',
+ Personalref => 'ΠÏοσωπικός κωδικός',
+ Websitem => 'Ιστοσελίδα κατασκευαστή μινιατοÏÏας',
+ Websitec => 'Ιστοσελίδα κατασκευαστή του Ï€ÏÎ±Î³Î¼Î±Ï„Î¹ÎºÎ¿Ï Î¿Ï‡Î®Î¼Î±Ï„Î¿Ï‚',
+ Websiteo => 'ΧÏήσιμοι σÏνδεσμοι',
+ Comments3 => 'Σχόλια',
+
+# Pictures fields
+
+ Pictures => 'Εικόνες',
+
+ OthersComments => 'Γενικές παÏατηÏήσεις',
+ OthersDetails => 'Άλλες λεπτομέÏειες',
+ Top1 => 'Επάνω',
+ Back1 => 'Κάτω',
+ AVG => 'Επάνω αÏιστεÏά',
+ AV => 'Επάνω',
+ AVD => 'Επάνω δεξιά',
+ G => 'ΑÏιστεÏά',
+ BOX => 'Κουτί',
+ D => 'Δεξιά',
+ ARG => 'Πίσω αÏιστεÏά',
+ AR => 'Πίσω',
+ ARD => 'Πίσω δεξιά',
+ Others => 'ΔιάφοÏα',
+
+# PanelLending fields
+
+ LendingExplanation => 'ΧÏήσιμες ανταλλαγές κατα την διαÏκεια πεÏιοδικών εκθέσεων',
+ PanelLending => 'ΧοÏηγήσεις (για εκθέσεις)',
+ Comments4 => 'Σχόλια',
+
+# Realmodel fields
+
+ Realmodel => 'ΠÏαγματικό αυτοκίνητο',
+
+ Difference => 'ΔιαφοÏές με την μινιατοÏÏα',
+ Front2 => 'ΕμπÏός',
+ Back2 => 'Πίσω',
+ Comments5 => 'Σχόλια',
+
+ References => 'ΑναφοÏές',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/EL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..be29c6e
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::EL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή μουσικής',
+ Items => {0 => 'Δίσκος',
+ 1 => 'Δίσκος',
+ X => 'Δίσκοι'},
+ NewItem => 'Îέος δίσκος',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Τίτλος',
+ Cover => 'Εξώφυλλο',
+ Artist => 'Καλλιτέχνης',
+ Format => 'Format',
+ Running => 'ΔιάÏκεια',
+ Release => 'ΗμεÏομηνία έκδοσης',
+ Genre => 'Είδος',
+ Origin => 'ΠÏοέλευση',
+
+#For tracks list
+ Tracks => 'Λίστα Ï„Ïαγουδιών',
+ Number => 'ÎοÏμεÏο',
+ Track => 'Τίτλος',
+ Time => 'ΔιάÏκεια',
+
+ Composer => 'Συνθέτης',
+ Producer => 'ΠαÏαγωγός',
+ Playlist => 'Λίστα αναπαÏαγωγής',
+ Comments => 'Σχόλια',
+ Label => 'ΔισκογÏαφική εταιÏεία',
+ Url => 'Ιστοσελίδα',
+
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..d4fc659
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::EL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή ΠεÏιοδικών',
+ Items => {0 => 'ΠεÏιοδικό',
+ 1 => 'ΠεÏιοδικό',
+ X => 'ΠεÏιοδικά'},
+ NewItem => 'Îέο πεÏιοδικό',
+
+ Title => 'Τίτλος',
+ Cover => 'Εξώφυλλο',
+ Periodical => 'ΠεÏιοδικό',
+ Number => 'ΤεÏχος',
+ Date => 'ΗμεÏομηνία',
+ Subject => 'Θέμα',
+ Articles => 'ΆÏθÏα',
+
+ General => 'Γενικά',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..30eaff2
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::EL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή τηλεκαÏτών',
+ Items => {0 => 'ΤηλεκάÏτα',
+ 1 => 'ΤηλεκάÏτα',
+ X => 'ΤηλεκάÏτες'},
+ NewItem => 'Îέα τηλεκάÏτα',
+ Currency => 'Îόμισμα',
+
+ Help => 'Βοήθεια για τα πεδία',
+ Help1 => 'Βοήθεια',
+
+# Traduction des Champs "Main"
+
+ Main => 'Η τηλεκάÏτα',
+
+ Cover => 'Εικόνα',
+
+ Name => 'Όνομα',
+ Exchange => 'ΠÏος πώληση ή ανταλλαγή',
+ Wanted => 'Ζήτηση',
+ Rating1 => 'Γενική αξιολόγηση',
+ TheSmartCard => 'Η τηλεκάÏτα, εμπÏός/πίσω',
+
+ Country => 'ΧώÏα',
+ Color => 'ΧÏώμα',
+ Type1 => 'ΤÏπος κάÏτας',
+ Type2 => 'ΤÏπος τσιπ',
+ Dimension => 'Μήκος / Πλάτος / Πάχος',
+
+ Box => 'Κουτί',
+ Chip => 'Τσίπ',
+ Year1 => 'Έτος έκδοσης',
+ Year2 => 'Ετος εγκυÏότητας',
+ Condition => 'Κατάσταση',
+ Charge => 'ΦοÏτιζόμεÏνη κάÏτα',
+ Variety => 'Είδος',
+
+ Edition => 'ΑÏιθμός δειγμάτων',
+ Serial => 'ΣειÏιακός αÏιθμός',
+ Theme => 'Θέμα',
+
+ Acquisition => 'ΑγοÏαστηκε στο',
+
+ Catalog0 => 'Κατάλογος',
+ Catalog1 => 'OTE',
+ Catalog2 => 'Κινητής τηλεφωνίας',
+
+ Reference0 => 'Κωδικός',
+ Reference1 => 'Κωδικός ΟΤΕ',
+ Reference2 => 'Κωδικός κινητής τηλεφωνίας',
+ Reference3 => 'Άλλος κωδικός',
+
+ Quotationnew00 => 'Αξία νέας κάÏτας',
+ Quotationnew10 => 'Αξία κάÏτας ΟΤΕ',
+ Quotationnew20 => 'Αξία κάÏτας κινητής',
+ Quotationnew30 => 'Άλλη αξία',
+ Quotationold00 => 'Αξία μεταχειÏισμένης κάÏτας',
+ Quotationold10 => 'Αξία κάÏτας ΟΤΕ',
+ Quotationold20 => 'Αξία κάÏτας κινητής',
+ Quotationold30 => 'Άλλη αξία',
+
+ Title1 => 'Τίτλος',
+
+ Unit => 'Μονάδες / ΑÏιθμός λεπτών',
+
+ Pressed => 'ΤÏπος εκτÏπωσης',
+ Location => 'Τόπος εκτÏπωσης',
+
+ Comments1 => 'Σχόλια',
+
+ Others => 'ΔιάφοÏα.',
+ Weight => 'ΒάÏος',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..274d7e4
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::EL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή Ï€ÏογÏαμμάτων υπολογιστών',
+ Items => {0 => 'ΕφαÏμογή',
+ 1 => 'ΕφαÏμογή',
+ X => 'ΕφαÏμογές',
+ lowercase1 => 'εφαÏμογή',
+ lowercaseX => 'εφαÏμογες'},
+ NewItem => 'Îέα εφαÏμογή',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Όνομα',
+ Platform => 'ΠλατφόÏμα',
+ Released => 'ΗμεÏομηνία κυκλοφοÏίας',
+ Homepage => 'Ιστοσελίδα',
+ Editor => 'Εκδότης',
+ Developer => 'ΠÏογÏαμματιστής',
+ Category => 'ΚατηγοÏία',
+ NumberOfCopies => 'ΑντίγÏαφα',
+ Price => 'Τιμή',
+ Box => 'Εικόνα κουτιοÏ',
+ Case => 'Θήκη',
+ Manual => 'ΕγχειÏίδιο χÏήσης',
+ Executable => 'Εκτελέσιμο',
+ Description => 'ΠεÏιγÏαφή',
+ License => 'Άδεια χÏήσης',
+ Commercial => 'ΕμποÏικό',
+ FreewareNoncommercial => 'Freeware (μη εμποÏική χÏήση)',
+ OtherOpenSource => 'Άλλο Î±Î½Î¿Î¹Ï‡Ï„Î¿Ï Î»Î¿Î³Î¹ÏƒÎ¼Î¹ÎºÎ¿Ï',
+ PublicDomain => 'Δημόσιος τομέας',
+ OtherLicense => 'Άλλο',
+ Registration => 'ΕγγÏαφή',
+ RegistrationInfo => 'ΠληÏοφοÏίες εγγÏαφής',
+ RegInfo => 'ΠληÏοφοÏίες εγγÏαφής',
+ RegistrationName => 'Όνομα χÏήστη',
+ RegistrationNumber => 'ΑÏιθμός εγγÏαφής',
+ PanelRegistration => 'ΠληÏοφοÏίες εγγÏαφής',
+ RegistrationComments => 'ΠÏόσθετες πληÏοφοÏίες ή σχόλια',
+ Screenshots => 'Στιγμιότυπα',
+ Screenshot1 => 'ΠÏώτο στιγμιότυπο',
+ Screenshot2 => 'ΔεÏτεÏο στιγμιότυπο',
+ Comments => 'Σχόλια',
+ Url => 'Ιστοσελίδα',
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+ Information => 'ΠληÏοφοÏίες',
+
+ FilterRatingSelect => 'Αξιολόγηση τουλάχιστο...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/EL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..c48b9f0
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::EL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή γÏαμματοσήμων',
+ Items => {0 => 'ΓÏαμματόσημα',
+ 1 => 'ΓÏαμματόσημο',
+ X => 'ΓÏαμματόσημα'},
+ NewItem => 'Îέο γÏαμματόσημο',
+
+ General => 'Γενικά',
+ Detail => 'ΛεπτομέÏεια',
+ Value => 'Αξία',
+ Notes => 'Σημειώσεις',
+ Views => 'Όψεις',
+
+ Name => 'Όνομα',
+ Country => 'ΧώÏα',
+ Year => 'Έτος',
+ Catalog => 'Κατάλογος',
+ Number => 'ΑÏιθμός',
+ Topic => 'Θέμα',
+ Serie => 'ΣειÏά',
+ Designer => 'Σχεδιαστής',
+ Engraver => 'ΧαÏάκτης',
+ Type => 'ΤÏπος',
+ Format => 'ΜοÏφή',
+ Description => 'ΠεÏιγÏαφή',
+ Color => 'ΧÏώμα',
+ Gum => 'Κόλλα',
+ Paper => 'ΧαÏτί',
+ Perforation => 'Οδόντωση',
+ PerforationSize => 'Μέγεθος οδόντωσης',
+ CancellationType => 'ΤÏπος σφÏάγισης',
+ Comments => 'Σχόλια',
+ PrintingVariety => 'Ποικιλία εκτÏπωσης',
+ IssueDate => 'ΗμεÏομηνία έκδοσης',
+ EndOfIssue => 'Τέλος έκδοσης',
+ Issue => 'Έκδοση',
+ Grade => 'Ποιότητα',
+ Status => 'Θέση',
+ Adjusted => 'ΠÏοσαÏμοσμένο',
+ Cancellation => 'ΣφÏάγιση',
+ CancellationCondition => 'Κατάσταση σφÏαγίδας',
+ GumCondition => 'Κατάσταση κόλλας',
+ PerforationCondition => 'Κατάσταση οδόντωσης',
+ ConditionNotes => 'Σημειώσεις για την κατάσταση',
+ Error => 'Λάθος',
+ ErrorNotes => 'Σημειώσεις Λάθους',
+ FaceValue => 'Αξία όψης',
+ MintValue => 'Αξία καινοÏÏγιου',
+ UsedValue => 'Αξία σφÏαγισμένου',
+ PurchasedDate => 'ΗμεÏομηνία αγοÏάς',
+ Quantity => 'Ποσότητα',
+ History => 'ΙστοÏικό',
+ Picture1 => 'Εικόνα 1',
+ Picture2 => 'Εικόνα 2',
+ Picture3 => 'Εικόνα 3',
+
+ AirMail => 'ΤαχυδÏομημένο αεÏοποÏικώς',
+ MilitaryStamp => 'ΣτÏατιωτική σφÏαγίδα',
+ Official => 'ΣφÏαγίδα υπηÏεσίας',
+ PostageDue => 'ΦόÏος γÏαμματοσήμου',
+ Regular => 'Κανονικό γÏαμματόσημο',
+ Revenue => 'ΧαÏτόσημο',
+ SpecialDelivery => 'Ταχεία αποστολή',
+ StrikeStamp => 'ΓÏαμματόσημο απεÏγίας',
+ TelegraphStamp => 'ΓÏαμματόσημο τηλέγÏαφου',
+ WarStamp => 'ΓÏαμματόσημο πολέμου',
+ WarTaxStamp => 'ΧαÏτόσημο πολέμου',
+
+ Booklet => 'ΚλασέÏ',
+ BookletPane => 'Ποσεττα',
+ Card => 'ΚάÏτα',
+ Coil => 'ΓÏαμματόσημο Ï„Ïοχίσου',
+ Envelope => 'Φάκελος',
+ FirstDayCover => 'Φάκελος Ï€Ïώτης ημέÏας κυκλοφοÏίας',
+ Sheet => 'Φεγιέ',
+ Single => 'Μεμονωμένο',
+
+ Heliogravure => 'ΦωτοχαÏαξη',
+ Lithography => 'ΛιθογÏαφία',
+ Offset => 'Offset',
+ Photogravure => 'ΦωτοτσιγκογÏαφία',
+ RecessPrinting => 'ΧαλκογÏαφική',
+ Typography => 'ΤυπογÏαφία',
+
+ OriginalGum => 'Αυθεντική κόλλα',
+ Ungummed => 'Ξεκολλημένο',
+ Regummed => 'Επανακολλημενο',
+
+ Chalky => 'Ασβεστολιθικό χαÏτί',
+ ChinaPaper => 'ΧαÏτί Κίνας',
+ Coarsed => 'ΤÏÎ±Ï‡Ï Ï‡Î±Ïτί',
+ Glossy => 'ΓυαλιστεÏÏŒ',
+ Granite => 'ΓÏανίτης',
+ Laid => 'ΣτÏωτό',
+ Manila => 'ΧαÏτί με φυσαλίδες',
+ Native => 'Φυσικό',
+ Pelure => 'Φλοιώδες',
+ Quadrille => 'ΧαÏτί καντÏιλέ',
+ Ribbed => 'Ραβδωτό',
+ Rice => 'ΡυζόχαÏτο',
+ Silk => 'Μεταξωτό',
+ Smoothed => 'Λείο',
+ Thick => 'ΠαχÏ',
+ Thin => 'Λεπτό',
+ Wove => 'Κυματιστό',
+
+ CoarsedPerforation => 'ΧονδÏοειδή οδόντωση',
+ CombPerforation => 'Οδόντωση χτένα',
+ CompoundPerforation => 'Ανάμικτη οδόντωση',
+ DamagedPerforation => 'Αλλοιωμένη οδόντωση',
+ DoublePerforation => 'Διπλή διάτÏηση',
+ HarrowPerforation => 'Σκισμένη οδόντωση',
+ LinePerforation => 'ΓÏαμμική οδόντωση',
+ NoPerforation => 'ΧωÏίς οδόντωση',
+
+ CancellationToOrder => 'ΣφÏάγιση παÏαγγελίας',
+ FancyCancellation => 'Εντυπωσιακή σφÏάγιση',
+ FirstDayCancellation => 'ΣφÏάγιση φακέλου Ï€Ïώτης ημέÏας',
+ NumeralCancellation => 'Ψηφιακή σφÏάγιση',
+ PenMarked => 'Σημειωμένο με πένα',
+ RailroadCancellation => 'ΣφÏάγιση σιδηÏόδÏομου',
+ SpecialCancellation => 'Ειδική σφÏάγιση',
+
+ Superb => 'Εξαίσιο',
+ ExtraFine => 'ΠάÏα πολυ ωÏαίο',
+ VeryFine => 'Πολυ ωÏαίο',
+ FineVeryFine => 'ΩÏαίο/Î Î¿Î»Ï Ï‰Ïαίο',
+ Fine => 'ΩÏαίο',
+ Average => 'ΜέτÏιο',
+ Poor => 'Κακό',
+
+ Owned => 'Κατεχόμενο',
+ Ordered => 'Σε παÏαγγελία',
+ Sold => 'Πουλημένο',
+ ToSell => 'ΠÏος πώληση',
+ Wanted => 'ΖητοÏμενο',
+
+ LightCancellation => 'ΕλαφÏιά σφÏάγιση',
+ HeavyCancellation => 'Έντονη σφÏάγιση',
+ ModerateCancellation => 'ΜέτÏια σφÏάγιση',
+
+ MintNeverHinged => 'Ανέπαφο',
+ MintLightHinged => 'ΕλαφÏιά τσάκιση',
+ HingedRemnant => 'Τσάκιση',
+ HeavilyHinged => 'Μεγάλη τσάκιση',
+ LargePartOriginalGum => 'Γνήσια κόλλα σε μεγάλη επιφάνεια',
+ SmallPartOriginalGum => 'Γνήσια κόλλα σε μικÏή επιφάνεια',
+ NoGum => 'ΧωÏίς κόλλα',
+
+ Perfect => 'Τέλειο',
+ VeryNice => 'Î Î¿Î»Ï ÏŒÎ¼Î¿Ïφο',
+ Nice => 'ΌμοÏφο',
+ Incomplete => 'Ατελείωτο',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCModels/GCwines.pm b/lib/gcstar/GCLang/EL/GCModels/GCwines.pm
new file mode 100644
index 0000000..a596e3a
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCModels/GCwines.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::EL::GCModels::GCwines;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Συλλογή κÏασιών',
+ Items => {0 => 'ΚÏασί',
+ 1 => 'ΚÏασί',
+ X => 'ΚÏασιά'},
+ NewItem => 'Îέο κÏασί',
+
+ Name => 'Όνομα',
+ Designation => 'Ονομασία',
+ Vintage => 'ΧÏονιά παÏαγωγής',
+ Vineyard => 'Αμπελώνας',
+ Type => 'ΚατηγοÏία',
+ Grapes => 'ΣταφÏλι',
+ Soil => 'Έδαφος',
+ Producer => 'ΠαÏαγωγός',
+ Country => 'ΧώÏα',
+ Volume => 'Ποσότητα (ml)',
+ Alcohol => 'Αλκοόλ (%)',
+ Medal => 'ΔιακÏίσεις',
+
+ Storage => 'Αποθήκευση',
+ Location => 'Τοποθεσία',
+ ShelfIndex => 'Θέση',
+ Quantity => 'Ποσότητα',
+ Acquisition => 'Απόκτηση',
+ PurchaseDate => 'ΗμεÏομηνία απόκτησης',
+ PurchasePrice => 'Τιμή απόκτησης',
+ Gift => 'ΔώÏο',
+ BottleLabel => 'Ετικέτα φιάλης',
+ Website => 'ΠαÏαπομπή στο Internet',
+
+ Tasted => 'Δοκιμασμένο',
+ Comments => 'ΠαÏατηÏήσεις',
+ Serving => 'ΣεÏβίÏισμα',
+ TastingField => 'ΧαÏακτήÏας',
+
+ General => 'Γενικά',
+ Details => 'ΛεπτομέÏειες',
+ Tasting => 'ΓεÏση',
+
+ TastedNo => 'Δεν είναι δοκιμασμένο',
+ TastedYes => 'Δοκιμασμένο',
+
+ FilterRange => 'ΕÏÏος',
+ FilterTastedNo => '_Δεν έχει δοκιμαστεί ακόμα',
+ FilterTastedYes => 'Δοκιμασμένο',
+ FilterRatingSelect => '_Βαθμολογία τουλάχιστο...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EL/GCstar.pm b/lib/gcstar/GCLang/EL/GCstar.pm
new file mode 100644
index 0000000..5cc5efc
--- /dev/null
+++ b/lib/gcstar/GCLang/EL/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::EL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Ελληνικά',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>ΠÏοσοχή</b>:
+
+Οι πληÏοφοÏίες που ανακτώνται από τις ιστοσελίδες (μέσω των
+search plugins) Ï€ÏοοÏίζονται για <b>Ï€Ïοσωπική χÏήση μόνο</b>.
+
+Οποιαδήποτε αναδιανομή απαγοÏεÏεται <b>Ïητά χωÏίς την άδεια</b>
+των ιστοσελίδων.
+
+Για να Ï€ÏοσδιοÏίσετε από ποιο site Ï€ÏοέÏχονται οι πληÏοφοÏίες, μποÏείτε
+να χÏησιμοποιήσετε το κουμπί κάτω από το σημείο <b>λεπτομέÏειες</b>.',
+
+ 'AllItemsFiltered' => 'Δεν βÏέθηκαν αποτελέσματα σÏμφωνα με τα κÏιτήÏια αναζήτησης', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Εγκατάσταση σε ',
+ 'InstallMandatory' => 'ΥποχÏεωτικά στοιχεία',
+ 'InstallOptional' => 'ΠÏοαιÏετικά στοιχεία',
+ 'InstallErrorMissing' => 'Σφάλμα : Τα ακόλουθα στοιχεία Perl Ï€Ïέπει να εγκατασταθοÏν: ',
+ 'InstallPrompt' => 'Βασικός κατάλογος για την εγκατάσταση [/usr/local]: ',
+ 'InstallEnd' => 'Η εγκατάσταση ολοκληÏώθηκε',
+ 'InstallNoError' => 'Κανένα σφάλμα',
+ 'InstallLaunch' => 'Για να χÏησιμοποιήσετε την εφαÏμογή, εκκινήστε ',
+ 'InstallDirectory' => 'Βασικός κατάλογος',
+ 'InstallTitle' => 'Εγκατάσταση GCstar',
+ 'InstallDependencies' => 'ΕξαÏτήσεις',
+ 'InstallPath' => 'ΔιαδÏομή',
+ 'InstallOptions' => 'Ιδιότητες',
+ 'InstallSelectDirectory' => 'Επιλέξτε τον βασικό κατάλογο που θα γίνει η εγκατάσταση',
+ 'InstallWithClean' => 'ΔιαγÏαφή των αÏχείων που βÏίσκονται στον κατάλογο της εγκατάστασης',
+ 'InstallWithMenu' => 'ΠÏοσθήκη του GCstar στο Î¼ÎµÎ½Î¿Ï Î•Ï†Î±Ïμογές',
+ 'InstallNoPermission' => 'Σφάλμα: Δεν έχετε δικαιώματα εγγÏαφής στον επιλεγμένο κατάλογο',
+ 'InstallMissingMandatory' => 'Λείπουν υποχÏεωτικές εξαÏτήσεις. Θα Ï€Ïέπει να τις Ï€Ïοσθέσετε ώστε να εγκαταστήσετε το GCstar στο σÏστημά σας.',
+ 'InstallMissingOptional' => 'Λείπουν οι παÏακάτω Ï€ÏοαιÏετικές εξαÏτήσεις. Το GCstar θα συνεχίσει την εγκατάσταση αλλά ίσως κάποιες από τις λειτουÏγίες δεν θα είναι διαθέσιμες',
+ 'InstallMissingNone' => 'Δεν λείπει καμία από τις εξαÏτήσεις. ΜποÏείτε να συνεχίσετε κανονικά την εγκατάσταση του GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Λείπει',
+ 'InstallMissingFor' => 'Λείπει για',
+ 'InstallCleanDirectory' => 'ΑφαίÏεση των αÏχείων του GCstar από τον κατάλογο: ',
+ 'InstallCopyDirectory' => 'ΑντιγÏαφή αÏχείων στον κατάλογο: ',
+ 'InstallCopyDesktop' => 'ΑντιγÏαφή του εικονιδίου εκκίνησης της εφαÏμογής (.desktop) στο: ',
+
+#Update
+ 'UpdateUseProxy' => 'ΧÏήση proxy (πατήστε απλά enter αν δεν έχετε οÏίσει κάποιον): ',
+ 'UpdateNoPermission' => 'Δεν έχετε δικαιώματα εγγÏαφής στον κατάλογο: ',
+ 'UpdateNone' => 'Δεν βÏέθηκαν νέες ενημεÏώσεις',
+ 'UpdateFileNotFound' => 'Το αÏχείο δεν βÏέθηκε',
+
+#Splash
+ 'SplashInit' => 'ΑÏχικοποίηση',
+ 'SplashLoad' => 'ΦόÏτωση συλλογής',
+ 'SplashDisplay' => 'Εμφάνιση συλλογής',
+ 'SplashSort' => 'Ταξινόμηση συλλογής',
+ 'SplashDone' => 'Έτοιμο',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Φαίνεται ότι έχετε χÏησιμοποιήσει στο παÏελθόν GCfilms. Τι θέλετε να κάνετε εισαγωγή από το GCfilms στο GCstar (αυτό δεν θα έχει καμία επίδÏαση στο GCfilms εάν συνεχίζετε την χÏήση του)?',
+ 'GCfilmsImportOptions' => 'Ρυθμίσεις',
+ 'GCfilmsImportData' => 'Λίστα ταινιών',
+
+#Menus
+ 'MenuFile' => '_ΑÏχείο',
+ 'MenuNewList' => '_Îέα συλλογή',
+ 'MenuStats' => 'Στατιστικά',
+ 'MenuHistory' => 'Αν_οιγμένα Ï€Ïόσφατα',
+ 'MenuLend' => 'Ε_μφάνιση διανεισμένων στοιχείων', # Accepts model codes
+ 'MenuImport' => 'Ει_σαγωγή',
+ 'MenuExport' => 'Εξα_γωγή',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_ΕπεξεÏγασία',
+ 'MenuDuplicate' => '_ΔημιουÏγία διπλότυπου', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_ΑφαίÏεση στοιχείου', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => 'Α_ντικατάσταση πεδίων',
+ 'MenuEditLockItems' => '_Κλείδωμα Συλλογής',
+
+ 'MenuDisplay' => 'ΦίλτÏα',
+ 'MenuSavedSearches' => 'Αποθηκευμένες αναζητήσεις',
+ 'MenuSavedSearchesEdit' => 'ΕπεξεÏγασία αποθηκευμένων αναζητήσεων',
+ 'MenuSavedSearchesSave' => 'Αποθήκευση Ï„Ïέχουσας αναζήτησης',
+ 'MenuAdvancedSearch' => 'Ε_ξελιγμένη αναζήτηση',
+ 'MenuViewAllItems' => 'Εμφάνιση _Όλων ', # Accepts model codes
+ 'MenuNoFilter' => '_Όλα',
+
+ 'MenuConfiguration' => '_Ρυθμίσεις',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Εμφάνιση ΠληÏοφοÏιών',
+ 'MenuBorrowers' => '_Δανειολήπτες',
+ 'MenuToolbarConfiguration' => '_Κουμπιά γÏαμμής εÏγαλειών',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_ΜετατÏοπή είδους',
+
+ 'MenuBookmarks' => 'Οι _Συλλογές μου',
+ 'MenuBookmarksAdd' => '_ΠÏοσθηκη της συλλογής',
+ 'MenuBookmarksEdit' => '_ΕπεξεÏγασία αποθηκευμένων συλλογών',
+
+ 'MenuHelp' => '_Βοήθεια',
+ 'MenuHelpContent' => '_ΠεÏιεχόμενα',
+ 'MenuAllPlugins' => 'Εμφάνιση _plugins',
+ 'MenuBugReport' => 'ΑναφοÏά _bug',
+ 'MenuAbout' => '_Σχετικά με το GCstar',
+
+ 'MenuNewWindow' => 'Εμφάνιση στοιχείων σε _Îέο ΠαÏάθυÏο', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Εμφάνιση στοιχείων σε _Îέο ΠαÏάθυÏο', # Accepts model codes
+
+ 'ContextExpandAll' => 'Επέκταση όλων',
+ 'ContextCollapseAll' => 'ΣÏμπτυξη όλων',
+ 'ContextChooseImage' => 'Επιλέξτε _Εικόνα',
+ 'ContextImageEditor' => 'Άνοιγμα με το Ï€ÏόγÏαμμα επεξεÏγασίας εικόνας',
+ 'ContextOpenWith' => 'Άνοιγμα _με',
+ 'ContextImgFront' => 'Εξώφυλλο',
+ 'ContextImgBack' => 'Πίσω φÏλλο',
+ 'ContextChooseFile' => 'Επιλογή αÏχείου',
+ 'ContextChooseFolder' => 'Επιλογή φακέλου',
+
+ 'DialogEnterNumber' => 'ΠαÏακαλώ εισάγετε τιμή',
+
+ 'RemoveConfirm' => 'Θέλετε Ï€Ïαγματικά να διαγÏαφεί το στοιχείο;', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Îέο στοιχείο', # Accepts model codes
+ 'NewItemTooltip' => 'ΠÏοσθήκη νέου στοιχείου', # Accepts model codes
+ 'NoItemFound' => 'Δεν βÏέθηκαν αποτελέσματα. Αναζήτηση σε άλλη ιστοσελίδα;',
+ 'OpenList' => 'ΠαÏακαλώ επιλέξτε συλλογή',
+ 'SaveList' => 'ΠαÏακαλώ επιλέξτε που να γίνει η αποθήκευση της συλλογής',
+ 'SaveListTooltip' => 'Αποθήκευση της συλλογής',
+ 'SaveUnsavedChanges' => 'ΥπάÏχουν νέες εγγÏαφές στην συλλογή σας. Θέλετε να τις αποθηκεÏσετε;',
+ 'SaveDontSave' => 'Îα μην αποθηκευθοÏν',
+ 'PreferencesTooltip' => 'ΡÏθμιση Ï€Ïοτιμήσεων',
+ 'ViewTooltip' => 'ΤÏόπος εμφάνισης της συλλογής',
+ 'PlayTooltip' => 'Σχετικό Video', # Accepts model codes
+ 'PlayFileNotFound' => 'Δεν βÏέθηκε το αÏχείο σε αυτήν την τοποθεσία:',
+ 'PlayRetry' => 'Επανάληψη',
+
+ 'StatusSave' => 'Αποθήκευση...',
+ 'StatusLoad' => 'ΦόÏτωση...',
+ 'StatusSearch' => 'Αναζήτηση σε εξέλιξη...',
+ 'StatusGetInfo' => 'Λήψη στοιχείων...',
+ 'StatusGetImage' => 'Λήψη εικόνας...',
+
+ 'SaveError' => 'Δεν μποÏεί να γίνει η αποθήκευση της συλλογής. ΠαÏακαλώ ελέγξτε τα δικαιώματα εγγÏαφής και τον ελεÏθεÏο χώÏο στον δίσκο.',
+ 'OpenError' => 'ΑδÏνατο το άνοιγμα της συλλογής. ΠαÏακαλώ ελέγξτε τα διακιώματα Ï€Ïόσβασης.',
+ 'OpenFormatError' => 'Αδυνατο το άνοιγμα της συλλογής. Ο Ï„Ïπος του αÏχείου δεν είναι κατάλληλος.',
+ 'OpenVersionWarning' => 'Η συλλογή έχει δημιουÏγηθεί με μια πιο Ï€Ïόσφατη έκδοση του GCstar. Εάν επιλέξετε να την αποθηκεÏσετε, υπάÏχει η πιθανότητα απώλειας δεδομένων.',
+ 'OpenVersionQuestion' => 'Επιθυμείτε να συνεχίσετε;',
+ 'ImageError' => 'Ο επιλεγμένος κατάλογος για την αποθήκευση των εικόνων δεν ειναι σωστος. ΠαÏακαλώ επιλέξτε εναν άλλον.',
+ 'OptionsCreationError'=> 'ΑδÏνατη η δημιουÏγία του αÏχείου ιδιοτήτων: ',
+ 'OptionsOpenError'=> 'ΑδÏνατο το άνοιγμα του αÏχείου ιδιοτήτων: ',
+ 'OptionsSaveError'=> 'ΑδÏνατη η αποθήκευση του αÏχείου ιδιοτήτων: ',
+ 'ErrorModelNotFound' => 'Το μοντέλο δεν βÏέθηκε: ',
+ 'ErrorModelUserDir' => 'Τα καθοÏισμένα από τον χÏήστη μοντέλα βÏίσκονται μέσα στο: ',
+
+ 'RandomTooltip' => 'Τι θα δω απόψε; ',
+ 'RandomError'=> 'Δεν υπάÏχει επιλέξιμο στοιχείο', # Accepts model codes
+ 'RandomEnd'=> 'Δεν υπάÏχουν άλλα στοιχεία', # Accepts model codes
+ 'RandomNextTip'=> 'Επόμενη Ï€Ïόταση',
+ 'RandomOkTip'=> 'Αποδοχή Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… στοιχείου',
+
+ 'AboutTitle' => 'Σχετικά με το GCstar',
+ 'AboutDesc' => 'ΔιαχείÏιση Ï€Ïοσωπικών συλλογών',
+ 'AboutVersion' => 'Έκδοση',
+ 'AboutTeam' => 'Ομάδα',
+ 'AboutWho' => 'Christian Jodar (Tian): ΥπεÏθυνος του project, ΠÏογÏαμματιστής
+Nyall Dawson (Zombiepig): ΠÏογÏαμματιστής
+TPF: ΠÏογÏαμματιστής
+Adolfo González: ΠÏογÏαμματιστής
+',
+ 'AboutLicense' => 'Διανέμεται με την άδεια χÏήσης GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Γλενταδάκης ΔημήτÏης dglent@gmail.com',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo and webdesign by le Spektre',
+
+ 'ToolbarRandom' => 'Απόψε',
+
+ 'UnsavedCollection' => 'Μη αποθηκευμένη συλλογή',
+ 'ModelsSelect' => 'Επιλέξτε τον Ï„Ïπο της συλλογής',
+ 'ModelsPersonal' => 'ΠÏοσωπικοί Ï„Ïποι',
+ 'ModelsDefault' => 'ΠÏοεπιλεγμένοι Ï„Ïποι',
+ 'ModelsList' => 'ΟÏισμός συλλογής',
+ 'ModelSettings' => 'Ρυθμίσεις της συλλογής',
+ 'ModelNewType' => 'Îέος Ï„Ïπος συλλογής',
+ 'ModelName' => 'Όνομα του Ï„Ïπου συλλογής:',
+ 'ModelFields' => 'Πεδία',
+ 'ModelOptions' => 'Ιδιότητες',
+ 'ModelFilters' => 'ΦίλτÏα',
+ 'ModelNewField' => 'Îέο πεδίο',
+ 'ModelFieldInformation' => 'ΠληÏοφοÏίες',
+ 'ModelFieldName' => 'Όνομα:',
+ 'ModelFieldType' => 'ΤÏπος:',
+ 'ModelFieldGroup' => 'Ομάδα:',
+ 'ModelFieldValues' => 'Τιμές',
+ 'ModelFieldInit' => 'ΠÏοεπιλογή :',
+ 'ModelFieldMin' => 'Ελάχιστο :',
+ 'ModelFieldMax' => 'Μέγιστο :',
+ 'ModelFieldList' => 'Λίστα τιμών :',
+ 'ModelFieldListLegend' => '<i>ΔιαχωÏισμός με κόμμα</i>',
+ 'ModelFieldDisplayAs' => 'Εμφάνιση ως:',
+ 'ModelFieldDisplayAsText' => 'Βαθμός',
+ 'ModelFieldDisplayAsGraphical' => 'ΑστέÏια',
+ 'ModelFieldTypeShortText' => 'ΣÏντομο κείμενο',
+ 'ModelFieldTypeLongText' => 'ΜακÏÏ ÎºÎµÎ¯Î¼ÎµÎ½Î¿',
+ 'ModelFieldTypeYesNo' => 'Îαι/Όχι',
+ 'ModelFieldTypeNumber' => 'ΑÏιθμός',
+ 'ModelFieldTypeDate' => 'ΗμεÏομηνία',
+ 'ModelFieldTypeOptions' => 'Λίστα Ï€Ïοεπιλεγμένων τιμών',
+ 'ModelFieldTypeImage' => 'Εικόνα',
+ 'ModelFieldTypeSingleList' => 'Απλή λίστα',
+ 'ModelFieldTypeFile' => 'ΑÏχείο',
+ 'ModelFieldTypeFormatted' => 'ΕξαÏτάται από άλλα πεδία',
+ 'ModelFieldParameters' => 'ΠαÏάμετÏοι',
+ 'ModelFieldHasHistory' => 'ΚÏατείστε ιστοÏικό',
+ 'ModelFieldFlat' => 'Εμφάμιση σε μία σειÏά',
+ 'ModelFieldStep' => 'Τιμή αξησης:',
+ 'ModelFieldFileFormat' => 'ΤÏπος αÏχείου:',
+ 'ModelFieldFileFile' => 'Απλό αÏχείο',
+ 'ModelFieldFileImage' => 'Εικόνα',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Ήχος',
+ 'ModelFieldFileProgram' => 'ΠÏόγÏαμμα',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'ΧÏήση των πεδίων',
+ 'ModelOptionsFieldsAuto' => 'Αυτόματα',
+ 'ModelOptionsFieldsNone' => 'Κανένα',
+ 'ModelOptionsFieldsTitle' => 'Ως τίτλος',
+ 'ModelOptionsFieldsId' => 'Ως αναγνωÏιστικό',
+ 'ModelOptionsFieldsCover' => 'Ως εξώφυλλο',
+ 'ModelOptionsFieldsPlay' => 'Για το κουμπί ΑναπαÏαγωγή',
+ 'ModelCollectionSettings' => 'Ρυθμίσεις συλλογής',
+ 'ModelCollectionSettingsLending' => 'Στοιχεία που μποÏοÏν να δανειστοÏν',
+ 'ModelCollectionSettingsTagging' => 'ΧÏήση ως λέξεις κλειδιά',
+ 'ModelFilterActivated' => 'Εμφάνιση στο παÏάθυÏο αναζήτησης',
+ 'ModelFilterComparison' => 'ΣÏγκÏιση',
+ 'ModelFilterContain' => 'ΠεÏιέχει',
+ 'ModelFilterDoesNotContain' => 'Îα μην πεÏιέχει',
+ 'ModelFilterRegexp' => 'Απλή έκφÏαση',
+ 'ModelFilterRange' => 'ΕÏÏος',
+ 'ModelFilterNumeric' => 'ΑÏιθμητική σÏγκÏιση',
+ 'ModelFilterQuick' => 'ΔημιουÏγία γÏήγοÏου φίλτÏου',
+ 'ModelTooltipName' => 'ΧÏησιμοποίηση ενός ονόματος το οποίο θα είναι και μοντέλο χÏήσης και για άλλες συλλογές. Εάν το αφήσετε κενό, οι Ïυθμίσεις θα αποθηκεÏονται στην ίδια τη συλλογή',
+ 'ModelTooltipLabel' => 'Το όνομα του πεδίου όπως θα εμφανίζεται',
+ 'ModelTooltipGroup' => 'ΧÏησιμεÏει στην ομαδοποίηση των πεδίων. Τα πεδία χωÏίς ομάδα θα ταξινομοÏνται στην ομάδα από Ï€Ïοεπιλογή',
+ 'ModelTooltipHistory' => 'Αν Θα αποθηκεÏονται οι Ï€ÏοηγοÏμενες τιμές σε μια λίστα σχετική με το πεδίο',
+ 'ModelTooltipFormat' => 'Αυτή η μοÏφή χÏησιμεÏει ώστε να οÏιστεί η ενέÏγεια πατώντας το κουμπί ΑναπαÏαγωγή',
+ 'ModelTooltipLending' => 'Αυτό θα Ï€Ïοσθέσει μεÏικά πεδία για την διαχείÏιση των δανεισμών',
+ 'ModelTooltipTagging' => 'Αυτό θα Ï€Ïοσθέσει μεÏικά πεδία για να διαχειÏίζεστε τις λέξεις κλειδιά',
+ 'ModelTooltipNumeric' => 'Θα Ï€Ïέπει οι τιμές να θεωÏοÏνται ως αÏιθμητικές για τις συγκÏίσεις',
+ 'ModelTooltipQuick' => 'Αυτό θα Ï€Ïοσθέσει ένα υπο-Î¼ÎµÎ½Î¿Ï ÏƒÏ„Î¿ Î¼ÎµÎ½Î¿Ï Î¦Î¯Î»Ï„Ïα',
+
+ 'ResultsTitle' => 'Επιλέξτε ένα στοιχείο', # Accepts model codes
+ 'ResultsNextTip' => 'Αναζήτηση στο επόμενο site',
+ 'ResultsPreview' => 'ΠÏοεσκόπηση',
+ 'ResultsInfo' => 'ΜποÏείτε να Ï€Ïοσθέσετε πεÏισσότεÏα στοιχεία στην συλλογή, επιλέγοντας τα στοιχεία κÏατώντας πατημένο το πλήκτÏο Ctrl ή Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'ΠÏοτιμήσεις',
+ 'OptionsExpertMode' => 'ΛειτουÏγία για Ï€ÏοχωÏημένους',
+ 'OptionsPrograms' => 'ΚαθοÏίστε τις εφαÏμογές για το άνοιγμα των αÏχείων, αφήστε κενό για χÏήση των Ï€Ïοεπιλογών του συστήματος',
+ 'OptionsBrowser' => 'ΠεÏιηγητής ΙστιοχώÏου',
+ 'OptionsPlayer' => 'ΑναπαÏαγωγή Video',
+ 'OptionsAudio' => 'ΑναπαÏαγωγή ήχου',
+ 'OptionsImageEditor' => 'ΠÏόγÏαμμα επεξεÏγασίας εικόνας',
+ 'OptionsCdDevice' => 'Συσκευή CD',
+ 'OptionsImages' => 'Κατάλογος εικόνων',
+ 'OptionsUseRelativePaths' => 'ΧÏήση των σχετικών διαδÏομών για τις εικόνες',
+ 'OptionsLayout' => 'ΤÏόπος εμφάνισης (κεντÏικό παÏάθυÏο)',
+ 'OptionsStatus' => 'Εμφάνιση status bar',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'ΠÏοσοχή: Οι αλλαγές θα Ï€ÏαγματοποιηθοÏν μετά την επανεκκίνηση της εφαÏμογής.',
+ 'OptionsRemoveConfirm' => 'Επιβεβαίωση Ï€Ïιν από τη διαγÏαφή',
+ 'OptionsAutoSave' => 'Αυτόματη αποθήκευση της συλλογής',
+ 'OptionsAutoLoad' => 'ΦόÏτωση της Ï€ÏοηγοÏμενης συλλογής κατά την εκκίνηση',
+ 'OptionsSplash' => 'Εμφάνιση splash screen',
+ 'OptionsTearoffMenus' => 'ΕνεÏγοποίηση δυνατότητας αποκόλλησης των Î¼ÎµÎ½Î¿Ï Î±Ï€ÏŒ την γÏαμμή εÏγαλειών',
+ 'OptionsSpellCheck' => 'ΧÏήση του οÏθογÏÎ±Ï†Î¹ÎºÎ¿Ï ÎµÎ»Î­Î³Ï‡Î¿Ï… στα μεγάλα πεδία κειμένου',
+ 'OptionsProgramTitle' => 'Επιλέξτε το Ï€ÏόγÏαμμα που θα χÏησιμοποιείται',
+ 'OptionsPlugins' => 'ΙστιοχώÏος για αναζήτηση δεδωμένων',
+ 'OptionsAskPlugins' => 'Αναζήτηση (Όλα τα sites)',
+ 'OptionsPluginsMulti' => 'Πολλαπλά sites',
+ 'OptionsPluginsMultiAsk' => 'Αναζήτηση (ΜεÏικά sites)',
+ 'OptionsPluginsMultiPerField' => 'Πολλές ιστοσελίδες (ανά πεδίο)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Πολλες ιστοσελίδες ανά σειÏά επιλογής',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Για κάθε πεδίο θα συμπληÏώνουμε το πεδίο με την Ï€Ïώτη μη κενή πληÏοφοÏία αÏχίζοντας απο Ï„ ααÏιστεÏά',
+ 'OptionsPluginsMultiPerFieldFirst' => 'ΠÏώτο',
+ 'OptionsPluginsMultiPerFieldLast' => 'Τελευταίο',
+ 'OptionsPluginsMultiPerFieldRemove' => 'ΑφαίÏεση',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Λίστα κενών επιλεγμένων πεδίων',
+ 'OptionsPluginsList' => 'ΟÏισμός λίστας',
+ 'OptionsAskImport' => 'Επιλεξτε τα πεδια για εισαγωγή',
+ 'OptionsProxy' => 'ΧÏήση proxy',
+ 'OptionsCookieJar' => 'ΧÏήση αυτου του αÏχείου cookie',
+ 'OptionsLang' => 'Γλώσσα',
+ 'OptionsMain' => 'ΚυÏίως',
+ 'OptionsPaths' => 'ΔιαδÏομές',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'ΕπιπÏόσθετα',
+ 'OptionsDisplay' => 'Εμφάνιση',
+ 'OptionsToolbar' => 'ΓÏαμμή εÏγαλειών',
+ 'OptionsToolbars' => {0 => 'Καμία', 1 => 'ΜικÏή', 2 => 'Μεγάλη', 3 => 'ΕÏγαλεία συστήματος'},
+ 'OptionsToolbarPosition' => 'Θέση',
+ 'OptionsToolbarPositions' => {0 => 'Επάνω', 1 => 'Κάτω', 2 => 'ΑÏιστεÏά', 3 => 'Δεξιά'},
+ 'OptionsExpandersMode' => 'ΥπεÏβολικά μακÏÏ ÎµÏ€ÎµÎºÏ„ÎµÎ¹Î½ÏŒÎ¼ÎµÎ½Î¿ κείμενο',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'ΜοÏφή ΗμεÏομηνίας',
+ 'OptionsDateFormatTooltip' => 'Η μοÏφή είναι αυτή που χÏησιμοποιείται από strftime(3). Η Ï€Ïοεπιλογή είναι %d/%m/%Y',
+ 'OptionsView' => 'Εμφάνιση λίστας (αÏιστεÏή στήλη)',
+ 'OptionsViews' => {0 => 'Κείμενο', 1 => 'Εικόνα', 2 => 'ΛεπτομεÏÏŽÏ‚'},
+ 'OptionsColumns' => 'Κολώνες',
+ 'OptionsMailer' => 'ΤÏόπος αποστολής e-mail',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'E-mail αποστολέα',
+ 'OptionsTransform' => 'Βάλτε τα άÏθÏα στο τέλος των τίτλων',
+ 'OptionsArticles' => 'ΆÏθÏα (ΧωÏιστά με κόμμα)',
+ 'OptionsSearchStop' => 'ΕπιτÏέπεται η διακοπή της αναζήτησης',
+ 'OptionsBigPics' => 'ΧÏήση μεγάλων εικόνων όταν είναι διαθέσιμες',
+ 'OptionsAlwaysOriginal' => 'ΧÏήση του κυÏίως τίτλου αν το πεδίο είναι κενό',
+ 'OptionsRestoreAccelerators' => 'ΕπαναφοÏά των συντομεÏσεων',
+ 'OptionsHistory' => 'Μέγεθος ιστοÏικοÏ',
+ 'OptionsClearHistory' => 'ΚαθάÏισμα ιστοÏικοÏ',
+ 'OptionsStyle' => 'Θέμα εμφάνισης',
+ 'OptionsDontAsk' => 'Îα μην ξαναγίνει η εÏώτηση',
+ 'OptionsPathProgramsGroup' => 'ΕφαÏμογές',
+ 'OptionsProgramsSystem' => 'ΧÏήση των Ï€Ïοεπιλεγμένων εφαÏμογών συστήματος',
+ 'OptionsProgramsUser' => 'ΧÏηση συγκεκÏιμένων εφαÏμογών',
+ 'OptionsProgramsSet' => 'ΟÏισμός των εφαÏμογών',
+ 'OptionsPathImagesGroup' => 'Εικόνες',
+ 'OptionsInternetDataGroup' => 'Εισαγωγή δεδομένων',
+ 'OptionsInternetSettingsGroup' => 'Ρυθμίσεις',
+ 'OptionsDisplayInformationGroup' => 'Εμφάνιση πληÏοφοÏιών',
+ 'OptionsDisplayArticlesGroup' => 'ΆÏθÏα',
+ 'OptionsImagesDisplayGroup' => 'Εμφάνιση',
+ 'OptionsImagesStyleGroup' => 'ΜοÏφή',
+ 'OptionsDetailedPreferencesGroup' => 'ΠÏοτιμήσεις',
+ 'OptionsFeaturesConveniencesGroup' => 'Ευκολίες',
+ 'OptionsPicturesFormat' => 'Prefix για τις εικόνες:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Τίτλος ή όνομα συσχετισμένου στοιχείου',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ή . θα αντικατασταθεί από τον κατάλογο της συλλογής (μόνο στην αÏχή της διαδÏομής)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% θα αντικατασταθεί από το όνομα της συλλογής χωÏίς suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% μποÏεί να χÏησιμοποιηθεί μόνο στην αÏχή της διαδÏομής των εικόνων',
+ 'OptionsConfigureMailers' => 'Ρυθμίσεις Ï€ÏογÏαμμάτων ηλ.ταχυδÏομείου',
+
+ 'ImagesOptionsButton' => 'Ρυθμίσεις',
+ 'ImagesOptionsTitle' => 'Ρυθμίσεις για την λίστα εικόνων',
+ 'ImagesOptionsSelectColor' => 'Επιλέξτε χÏώμα',
+ 'ImagesOptionsUseOverlays' => 'ΧÏήση εφφέ στις εικόνες',
+ 'ImagesOptionsBg' => 'ΠαÏασκήνιο',
+ 'ImagesOptionsBgPicture' => 'ΧÏήση εικόνας παÏασκηνίου',
+ 'ImagesOptionsFg'=> 'Επιλογή',
+ 'ImagesOptionsBgTooltip' => 'Αλλαγή χÏώματος παÏασκηνίου',
+ 'ImagesOptionsFgTooltip'=> 'Αλλαγή χÏώματος επιλογής',
+ 'ImagesOptionsResizeImgList' => 'Αυτόματη ÏÏθμιση του αÏÎ¹Î¸Î¼Î¿Ï Ï„Ï‰Î½ στηλών',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Μέγεθος',
+ 'ImagesOptionsSizeList' => {0 => 'Î Î¿Î»Ï Î¼Î¹ÎºÏÏŒ', 1 => 'ΜικÏÏŒ', 2 => 'Μεσαίο', 3 => 'Μεγάλο', 4 => 'Î Î¿Î»Ï Î¼ÎµÎ³Î¬Î»Î¿'},
+ 'ImagesOptionsSizeTooltip' => 'Επιλέξτε το μέγεθος της εικόνας',
+
+ 'DetailedOptionsTitle' => 'Ρυθμίσεις της λίστας',
+ 'DetailedOptionsImageSize' => 'Μέγεθος εικόνας',
+ 'DetailedOptionsGroupItems' => 'Ομαδοποίηση στοιχείων ανά',
+ 'DetailedOptionsSecondarySort' => 'Ταξινόμηση πεδίων(στοιχείων της ανωτέÏω ομάδας)',
+ 'DetailedOptionsFields' => 'Επιλογή πεδίων για εμφάνιση',
+ 'DetailedOptionsGroupedFirst' => 'Ομαδοποίηση αταξινόμητων στοιχείων',
+ 'DetailedOptionsAddCount' => 'ΠÏοσθήκη του αÏÎ¹Î¸Î¼Î¿Ï Ï„Ï‰Î½ στοιχείων στην κατηγοÏία',
+
+ 'ExtractButton' => 'ΠληÏοφοÏίες',
+ 'ExtractTitle' => 'ΠληÏοφοÏίες του αÏχείου video',
+ 'ExtractImport' => 'ΟΚ',
+
+ 'FieldsListOpen' => 'ΦόÏτωση λίστας πεδίων από αÏχείο',
+ 'FieldsListSave' => 'Αποθήκευση της λίστας πεδίων σε αÏχείο',
+ 'FieldsListError' => 'Αυτή η λίστα πεδίων δεν μποÏεί να χÏησιμοποιηθεί με αυτόν τον Ï„Ïπο συλλογής',
+ 'FieldsListIgnore' => '--- Îα αγνοηθεί',
+
+ 'ExportTitle' => 'Εξαγωγή συλλογής',
+ 'ExportFilter' => 'Εξαγωγή μόνο των εμφανιζομένων στοιχείων',
+ 'ExportFieldsTitle' => 'Εξαγωγή πεδίων',
+ 'ExportFieldsTip' => 'Επιλέξτε τα πεδία για εξαγωγή',
+ 'ExportWithPictures' => 'ΑντιγÏαφή των εικόνων σε Ïπο-κατάλογο',
+ 'ExportSortBy' => 'Ταξινόμηση ανά',
+ 'ExportOrder' => 'ΣειÏά',
+
+ 'ImportListTitle' => 'Εισαγωγή άλλης συλλογής',
+ 'ImportExportData' => 'Δεδομένα',
+ 'ImportExportFile' => 'ΑÏχείο',
+ 'ImportExportFieldsUnused' => 'ΑχÏησιμοποίητα πεδία',
+ 'ImportExportFieldsUsed' => 'ΧÏησιμοποιημένα πεδία',
+ 'ImportExportFieldsFill' => 'Όλα τα πεδία',
+ 'ImportExportFieldsClear' => 'Κανένα πεδίο',
+ 'ImportExportFieldsEmpty' => 'ΠÏέπει να επιλέξτε τουλάχιστον ένα πεδίο',
+ 'ImportExportFileEmpty' => 'ΠÏέπει να οÏίσετε ένα όνομα αÏχείου',
+ 'ImportFieldsTitle' => 'Εισαγωγή πεδίων',
+ 'ImportFieldsTip' => 'Επιλέξτε τα πεδία για εισαγωγή',
+ 'ImportNewList' => 'ΔημιουÏγία νέας συλλογής',
+ 'ImportCurrentList' => 'ΠÏοσθήκη σε αυτή τη συλλογή',
+ 'ImportDropError' => 'Σφάλμα κατά το άνοιγμα τουλάχιστον ενός αÏχείου. Θα γίνει επαναφόÏτωση της Ï€ÏοηγοÏμενης λίστας.',
+ 'ImportGenerateId' => 'ΔημιουÏγία αναγνωÏÎ¹ÏƒÏ„Î¹ÎºÎ¿Ï Î³Î¹Î± κάθε στοιχείο',
+
+ 'FileChooserOpenFile' => 'Επιλέξτε αÏχείο Ï€Ïος χÏήση',
+ 'FileChooserDirectory' => 'Κατάλογος',
+ 'FileChooserOpenDirectory' => 'Επιλέξτε έναν κατάλογο',
+ 'FileChooserOverwrite' => 'Το αÏχείο υπάÏχει ήδη. Θέλετε να το αντικαταστήσετε;',
+ 'FileAllFiles' => 'Όλα τα αÏχεία',
+ 'FileVideoFiles' => 'ΑÏχεία βίντεο',
+ 'FileEbookFiles' => 'ΑÏχεία e-book',
+ 'FileAudioFiles' => 'ΑÏχεία ήχου',
+ 'FileGCstarFiles' => 'Συλλογές GCstar',
+
+ #Some default panels
+ 'PanelCompact' => 'ΣυγκεντÏωτικά',
+ 'PanelReadOnly' => 'Μόνο ανάγνωση',
+ 'PanelForm' => 'ΚαÏτέλες',
+
+ 'PanelSearchButton' => 'Λήψη στοιχείων',
+ 'PanelSearchTip' => 'Αναζήτηση στο Internet πληÏοφοÏίες γι\' αυτό το όνομα',
+ 'PanelSearchContextChooseOne' => 'Επιλογή ιστοσελίδας ...',
+ 'PanelSearchContextMultiSite' => 'ΧÏήση «πολλών ιστοσελίδων»',
+ 'PanelSearchContextMultiSitePerField' => 'ΧÏήση «πολλών ιστοσελίδων ανά πεδίο»',
+ 'PanelSearchContextOptions' => 'Αλλαγή επιλογών ...',
+ 'PanelImageTipOpen' => 'Πατήστε στην εικόνα για να επιλέξτε άλλη.',
+ 'PanelImageTipView' => 'Πατήστε στην εικόνα για να τη δείτε σε Ï€Ïαγματικό μέγεθος.',
+ 'PanelImageTipMenu' => ' Δεξί κλικ για πεÏισσότεÏες επιλογές.',
+ 'PanelImageTitle' => 'Επιλέξτε μια εικόνα',
+ 'PanelImageNoImage' => 'Καμία εικόνα',
+ 'PanelSelectFileTitle' => 'Επιλέξτε ένα αÏχείο',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'ΕπαναφοÏά Ï€Ïοεπιλογής',
+ 'PanelRefresh' => 'ΕνημέÏωση',
+ 'PanelRefreshTip' => 'ΕνημέÏωση πληÏοφοÏιών από το διαδίκτυο',
+
+ 'PanelFrom' =>'Από',
+ 'PanelTo' =>'Εως',
+
+ 'PanelWeb' => 'Εμφάνιση πληÏοφοÏιών από το Internet',
+ 'PanelWebTip' => 'Εμφάνιση πληÏοφοÏιών Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… στοιχείου στο Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'ΔιαγÏαφή ανωτέÏω στοιχείου', # Accepts model codes
+
+ 'PanelDateSelect' => 'Αλλαγή',
+ 'PanelNobody' => 'Κανένας',
+ 'PanelUnknown' => 'Άγνωστος',
+ 'PanelAdded' => 'ΗμεÏομηνία Ï€Ïοσθήκης',
+ 'PanelRating' => 'Βαθμολογία',
+ 'PanelPressRating' => 'Βαθμολόγηση ανά κλικ',
+ 'PanelLocation' => 'Τοποθεσία',
+
+ 'PanelLending' => 'Δανεισμοί',
+ 'PanelBorrower' => 'Δανειολήπτες',
+ 'PanelLendDate' => 'ΗμεÏομηνία δανεισμοÏ',
+ 'PanelHistory' => 'ΙστοÏικό δανεισμών',
+ 'PanelReturned' => 'Εχει επιστÏαφεί', # Accepts model codes
+ 'PanelReturnDate' => 'ΗμεÏομηνία επιστÏοφής',
+ 'PanelLendedYes' => 'Δανεισμένο',
+ 'PanelLendedNo' => 'Διαθέσιμο',
+
+ 'PanelTags' => 'Λέξεις κλειδιά',
+ 'PanelFavourite' => 'Σελιδοδείκτης',
+ 'TagsAssigned' => 'Σχετικές λέξεις κλειδιά',
+
+ 'PanelUser' => 'Πεδία χÏήστη',
+
+ 'CheckUndef' => 'ΑδιάφοÏο',
+ 'CheckYes' => 'Îαι',
+ 'CheckNo' => 'Όχι',
+
+ 'ToolbarAll' => 'Εμφάνιση όλων',
+ 'ToolbarAllTooltip' => 'Εμφάνιση όλης της συλλογής',
+ 'ToolbarGroupBy' => 'Ομαδοποίηση ανά',
+ 'ToolbarGroupByTooltip' => 'Επιλέξτε με ποιο πεδίο θα γίνει η ομαδοποίηση των στοιχείων στη λίστα',
+ 'ToolbarQuickSearch' => 'ΓÏήγοÏη αναζήτηση',
+ 'ToolbarQuickSearchLabel' => 'Αναζήτηση',
+ 'ToolbarQuickSearchTooltip' => 'Επιλέξτε σε ποιο πεδίο θα γίνει η αναζήτηση. Εισάγετε τα κÏιτήÏια αναζήτησης και πατήστε Enter',
+ 'ToolbarSeparator' => ' ΔιαχωÏιστής',
+
+ 'PluginsTitle' => 'Αναζήτηση στοιχείου',
+ 'PluginsQuery' => 'Αναζήτηση',
+ 'PluginsFrame' => 'Αναζήτηση σε ιστοσελίδα',
+ 'PluginsLogo' => 'Λογότυπο',
+ 'PluginsName' => 'Όνομα',
+ 'PluginsSearchFields' => 'Πεδία αναζήτησης',
+ 'PluginsAuthor' => 'ΓÏάφτηκε από',
+ 'PluginsLang' => 'Γλώσσα',
+ 'PluginsUseSite' => 'ΧÏήση της επιλεγμένης ιστοσελίδας για τις αναζητήσεις',
+ 'PluginsPreferredTooltip' => 'Η ιστοσελίδα συνιστάται από το GCstar',
+ 'PluginDisabled' => 'ΑπενεÏγοποιημένο',
+
+ 'BorrowersTitle' => 'ΔιαχείÏιση των δανειοληπτών',
+ 'BorrowersList' => 'Δανειολήπτες',
+ 'BorrowersName' => 'Όνομα',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'ΠÏοσθήκη',
+ 'BorrowersRemove' => 'ΔιαγÏαφή',
+ 'BorrowersEdit' => 'ΕπεξεÏγασία',
+ 'BorrowersTemplate' => 'Μοντέλο e-mail',
+ 'BorrowersSubject' => 'Θέμα μηνÏματος',
+ 'BorrowersNotice1' => '%1 θα αντικατασταθεί από το όνομα του δανειολήπτη',
+ 'BorrowersNotice2' => '%2 Θα αντικατασταθεί από το όνομα του τίτλου',
+ 'BorrowersNotice3' => '%3 θα αντικατασταθεί από την ημεÏομηνία δανεισμοÏ',
+
+ 'BorrowersImportTitle' => 'Εισάγετε τις πληÏοφοÏίες των δανειοληπτών',
+ 'BorrowersImportType' => 'ΤÏπος αÏχείου :',
+ 'BorrowersImportFile' => 'ΑÏχείο:',
+
+ 'BorrowedTitle' => 'Δανεισμένα στοιχεία', # Accepts model codes
+ 'BorrowedDate' => 'Από',
+ 'BorrowedDisplayInPanel' => 'Εμφάνιση του στοιχείου στο κυÏίως παÏάθυÏο', # Accepts model codes
+
+ 'MailTitle' => 'Στείλτε e-mail',
+ 'MailFrom' => 'Αποστολέας : ',
+ 'MailTo' => 'ΠαÏαλήπτης : ',
+ 'MailSubject' => 'Θέμα : ',
+ 'MailSmtpError' => 'ΠÏόβλημα σÏνδεσης με τον SMTP server',
+ 'MailSendmailError' => 'ΠÏόβλημα κατά την εκκίνηση του sendmail',
+
+ 'SearchTooltip' => 'Αναζήτηση σε όλα τα στοιχεία', # Accepts model codes
+ 'SearchTitle' => 'Αναζήτηση', # Accepts model codes
+ 'SearchNoField' => 'Δεν έχετε επιλέξει κάποιο πεδίο για το κουτί αναζήτησης.
+ΠÏοσθέστε μεÏικά στην καÏτέλα με τα φίλτÏα στις Ïυθμίσεις της συλλογής.',
+
+ 'QueryReplaceField' => 'Πεδία Ï€Ïος επεξεÏγασία',
+ 'QueryReplaceOld' => 'ΤÏέχουσα τιμή',
+ 'QueryReplaceNew' => 'Îέα τιμή',
+ 'QueryReplaceLaunch' => 'Αντικατάσταση',
+
+ 'ImportWindowTitle' => 'Επιλέξτε τα πεδία για εισαγωγή',
+ 'ImportViewPicture' => 'Εμφάνιση εικόνας',
+ 'ImportSelectAll' => 'Επιλογή όλων',
+ 'ImportSelectNone' => 'Καμία επιλογή',
+
+ 'MultiSiteTitle' => 'Αναζήτηση στις ιστοσελίδες',
+ 'MultiSiteUnused' => 'ΑχÏησιμοποίητα plugins',
+ 'MultiSiteUsed' => 'Plugins Ï€Ïος χÏήση',
+ 'MultiSiteLang' => 'Fill list with English plugins',
+ 'MultiSiteEmptyError' => 'Η λίστα με τις ιστοσελίδες είναι άδεια',
+ 'MultiSiteClear' => 'ΚαθαÏισμός λίστας',
+
+ 'DisplayOptionsTitle' => 'Εμφάνιση των στοιχείων',
+ 'DisplayOptionsAll' => 'Επιλογή όλων',
+ 'DisplayOptionsSearch' => 'Κουμπί αναζήτησης',
+
+ 'GenresTitle' => 'ΜετατÏοπή κατηγοÏίας',
+ 'GenresCategoryName' => 'ΧÏηση της κατηγοÏίας',
+ 'GenresCategoryMembers' => 'ΚατηγοÏίες Ï€Ïος αντικατάσταση',
+ 'GenresLoad' => 'ΦόÏτωση λίστας',
+ 'GenresExport' => 'Αποθήκευση της λίστας σε αÏχείο',
+ 'GenresModify' => 'ΕπεξεÏγασία μετατÏοπής',
+
+ 'PropertiesName' => 'Όνομα συλλογής',
+ 'PropertiesLang' => 'Κωδικός γλώσσας',
+ 'PropertiesOwner' => 'Ιδιοκτήτης',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'ΠεÏιγÏαφή',
+ 'PropertiesFile' => 'ΠληÏοφοÏίες αÏχείου',
+ 'PropertiesFilePath' => 'ΠλήÏη διαδÏομή',
+ 'PropertiesItemsNumber' => 'ΑÏιθμός στοιχείων', # Accepts model codes
+ 'PropertiesFileSize' => 'Μέγεθος',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Ιδιότητες συλλογής',
+ 'PropertiesDefaultPicture' => 'ΠÏοεπιλεγμένη εικόνα',
+
+ 'MailProgramsTitle' => 'ΠÏογÏάμματα αποστολής e-mail',
+ 'MailProgramsName' => 'Όνομα',
+ 'MailProgramsCommand' => 'ΓÏαμμή εντολών',
+ 'MailProgramsRestore' => 'ΠÏοεπιλεγμένα Ï€ÏογÏάμματα',
+ 'MailProgramsAdd' => 'ΠÏοσθήκη Ï€ÏογÏάμματος',
+ 'MailProgramsInstructions' => 'Στη γÏαμμή εντολών, γίνονται κάποιες αντικαταστάσεις:
+ %f αντικαθίσταται από την διεÏθυνση e-mail του χÏήστη.
+ %t αντικαθίσταται από τον παÏαλήπτη.
+ %s αντικαθίσταται από το θέμα του μηνÏματος
+ %b αντικαθίσταται από το κυÏίως μήνυμα',
+
+ 'BookmarksBookmarks' => 'Σελιδοδείκτες',
+ 'BookmarksFolder' => 'Φάκελοι',
+ 'BookmarksLabel' => 'Όνομα',
+ 'BookmarksPath' => 'ΔιαδÏομή',
+ 'BookmarksNewFolder' => 'Îέος κατάλογος',
+
+ 'AdvancedSearchType' => 'ΤÏπος αναζήτησης',
+ 'AdvancedSearchTypeAnd' => 'Στοιχεία που ταιÏιάζουν με όλα τα κÏιτήÏια', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Στοιχεία που ταιÏιάζουν τουλάχιστον με ένα κÏιτήÏιο', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'ΚÏιτήÏια',
+ 'AdvancedSearchAnyField' => 'Όλα τα πεδία',
+ 'AdvancedSearchSaveTitle' => 'Αποθήκευση αναζήτησης',
+ 'AdvancedSearchSaveName' => 'Όνομα',
+ 'AdvancedSearchSaveOverwrite' => 'ΥπάÏχει ήδη αποθηκευμένη αναζήτηση με αυτό το όνομα. ΠαÏακαλώ επιλέξτε ένα άλλο.',
+ 'AdvancedSearchUseCase' => 'ΑκÏιβές όνομα',
+ 'AdvancedSearchIgnoreDiacritics' => 'Îα μην λαμβάνονται Ï…Ï€\'οψη οι τονισμοί και άλλα διακÏιτικά',
+
+ 'BugReportSubject' => 'ΔημιουÏγία αναφοÏάς bug από το GCstar',
+ 'BugReportVersion' => 'Έκδοση',
+ 'BugReportPlatform' => 'ΛειτουÏγικό σÏστημα',
+ 'BugReportMessage' => 'Μήνυμα σφάλματος',
+ 'BugReportInformation' => 'ΠÏόσθετες πληÏοφοÏίες',
+
+#Statistics
+ 'Stats3DPie' => 'Πίτα 3Δ',
+ 'StatsAccumulate' => 'ΣÏνοψη τιμών',
+ 'StatsArea' => 'ΠεÏιοχές',
+ 'StatsBars' => 'ΜπάÏες',
+ 'StatsDisplayNumber' => 'Εμφάνιση αÏιθμών',
+ 'StatsFieldToUse' => 'Πεδίο Ï€Ïος χÏήση',
+ 'StatsFontSize' => 'Μέγεθος γÏαμματοσειÏάς',
+ 'StatsGenerate' => 'ΔημιουÏγία',
+ 'StatsHeight' => 'Ύψος',
+ 'StatsHistory' => 'ΙστοÏικό',
+ 'StatsKindOfGraph' => 'ΤÏπος γÏαφήματος',
+ 'StatsPie' => 'Πίτα',
+ 'StatsSave' => 'Αποθήκευση εικόνας στατιστικων σε αÏχείο',
+ 'StatsShowAllDates' => 'Εμφάνιση όλων των ημεÏομηνιών',
+ 'StatsSortByNumber' => 'Ταξινόμηση ανά αÏιθμό {lowercaseX}',
+ 'StatsWidth' => 'Πλάτος',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..0653a56
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EN::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Include fields names on the top',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Replace the separator with',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..3334ca4
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EN::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..a26ecba
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::EN::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'WithJS' => 'Use Javascript',
+ 'FileTemplate' => 'Template',
+ 'Preview' => 'Preview',
+ 'NoPreview' => 'No preview available',
+ 'TemplateExternalFile' => 'Template file',
+ 'Title' => 'Page title',
+ 'InfoFile' => 'Movies list is in file: ',
+ 'InfoDir' => 'Images are in: ',
+ 'HeightImg' => 'Height (in pixels) of the image to be exported',
+ 'OpenFileInBrowser' => 'Open generated file in web browser',
+ 'Note' => 'List generated by <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Enter search text',
+ 'SearchType1' => 'Title only',
+ 'SearchType2' => 'Full information',
+ 'SearchButton' => 'Search',
+ 'SearchTitle' => 'Display only movies matching previous criteria',
+ 'AllButton' => 'All',
+ 'AllTitle' => 'Display all movies',
+ 'Expand' => 'Expand all',
+ 'ExpandTitle' => 'Display all movies information',
+ 'Collapse' => 'Collapse all',
+ 'CollapseTitle' => 'Collapse all movies information',
+ 'Borrowed' => 'Borrowed by: ',
+ 'NotBorrowed' => 'Available',
+ 'Top' => 'Top',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..fdfa311
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::EN::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..8356cd4
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::EN::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Include DROP instruction',
+ 'WithCreate' => 'Include CREATE instruction',
+ 'TableName' => 'Table Name',
+ 'InfoFile' => 'SQL file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2345b0e
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EN::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archive is in file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..b68ac14
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::EN::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Template file',
+ 'ModelText' => 'Template text',
+ 'Models' => 'Template to use',
+ 'UseFile' => 'Use file',
+ 'UseModel' => 'Use text area',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..ecdcc0d
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::EN::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..9c1c731
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EN::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignore first line',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..887a205
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportFolder.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::EN::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied before removing anything).\nLeave empty if not needed.\nKnown fields : $T:Title, $A:Article, $Y:Year, $S:Season, $E:Episode, $N:Serie Name'
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..35c1fd3
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EN::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportList.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportList.pm
new file mode 100644
index 0000000..bb5346b
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::EN::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Names list',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'CommentAuto' => 'Item automatically imported.',
+ 'CommentSite' => 'Website: ',
+ 'CommentTitle' => 'Title: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..4e09fa6
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::EN::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..cb55181
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::EN::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'File is not a supported Tellico collection',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..d4c9162
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCTVepisodes.pm
@@ -0,0 +1,51 @@
+{
+ package GCLang::EN::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => { 0 => 'Episodes',
+ 1 => 'Episode',
+ X => 'Episodes',
+ lowercase1 => 'episode',
+ lowercaseX => 'episodes'
+ },
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..aeddfbe
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::EN::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => { 0 => 'Series',
+ 1 => 'Series',
+ X => 'Series',
+ lowercase1 => 'series',
+ lowercaseX => 'series'
+ },
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..b5727e6
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCboardgames.pm
@@ -0,0 +1,89 @@
+{
+ package GCLang::EN::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Games',
+ 1 => 'Game',
+ X => 'Games',
+ lowercase1 => 'game',
+ lowercaseX => 'games'
+ },
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCbooks.pm b/lib/gcstar/GCLang/EN/GCModels/GCbooks.pm
new file mode 100644
index 0000000..964e573
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCbooks.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::EN::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => {0 => 'Books',
+ 1 => 'Book',
+ X => 'Books',
+ lowercase1 => 'book',
+ lowercaseX => 'books'
+ },
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'Series',
+ Rank => 'Rank',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCcoins.pm b/lib/gcstar/GCLang/EN/GCModels/GCcoins.pm
new file mode 100644
index 0000000..f895ac2
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCcoins.pm
@@ -0,0 +1,107 @@
+{
+ package GCLang::EN::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => {0 => 'Coins',
+ 1 => 'Coin',
+ X => 'Coins',
+ lowercase1 => 'coin',
+ lowercaseX => 'coins'
+ },
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCcomics.pm b/lib/gcstar/GCLang/EN/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d3054af
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCcomics.pm
@@ -0,0 +1,76 @@
+{
+ package GCLang::EN::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics',
+ lowercase1 => 'comic',
+ lowercaseX => 'comics'
+ },
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCfilms.pm b/lib/gcstar/GCLang/EN/GCModels/GCfilms.pm
new file mode 100644
index 0000000..57d49d0
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCfilms.pm
@@ -0,0 +1,96 @@
+{
+ package GCLang::EN::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Movies collection',
+ Items => {0 => 'Movies',
+ 1 => 'Movie',
+ X => 'Movies',
+ lowercase1 => 'movie',
+ lowercaseX => 'movies'
+ },
+ NewItem => 'New movie',
+
+
+ Id => 'Id',
+ Title => 'Title',
+ Date => 'Date',
+ Time => 'Length',
+ Director => 'Director',
+ Country => 'Country',
+ MinimumAge => 'Minimum age',
+ Genre => 'Genre',
+ Image => 'Picture',
+ Original => 'Alternative titles',
+ Actors => 'Cast',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Comments',
+ Synopsis => 'Synopsis',
+ Seen => 'Viewed',
+ Number => '# of Media',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Web page',
+ Audio => 'Audio',
+ Video => 'Video format',
+ Trailer => 'Video file',
+ Serie => 'Series',
+ Rank => 'Rank',
+ Subtitles => 'Subtitles',
+
+ SeenYes => 'Viewed',
+ SeenNo => 'Not viewed',
+
+ AgeUnrated => 'Unrated',
+ AgeAll => 'All Ages',
+ AgeParent => 'Parental Guidance',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+
+ Information => 'Information',
+ Languages => 'Languages',
+ Encoding => 'Encoding',
+
+ FilterAudienceAge => 'Audience age',
+ FilterSeenNo => '_Not Yet Viewed',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Rating At _Least...',
+
+ ExtractSize => 'Size',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCgames.pm b/lib/gcstar/GCLang/EN/GCModels/GCgames.pm
new file mode 100644
index 0000000..af30095
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCgames.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::EN::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Video games collection',
+ Items => {0 => 'Games',
+ 1 => 'Game',
+ X => 'Games',
+ lowercase1 => 'game',
+ lowercaseX => 'games'
+ },
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Players => 'Number of players',
+ Released => 'Release Date',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Unlockables => 'Unlockables',
+ Unlockable => 'Unlockable',
+ Howto => 'How to unlock',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..6153bcf
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCgeneric.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::EN::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Items',
+ 1 => 'Item',
+ X => 'Items',
+ lowercase1 => 'item',
+ lowercaseX => 'items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCminicars.pm b/lib/gcstar/GCLang/EN/GCModels/GCminicars.pm
new file mode 100644
index 0000000..a672301
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::EN::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicles',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCmusics.pm b/lib/gcstar/GCLang/EN/GCModels/GCmusics.pm
new file mode 100644
index 0000000..87b1cfe
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCmusics.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::EN::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => {0 => 'Albums',
+ 1 => 'Album',
+ X => 'Albums',
+ lowercase1 => 'album',
+ lowercaseX => 'albums'
+ },
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..0a84b76
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::EN::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodicals',
+ 1 => 'Periodical',
+ X => 'Periodicals',
+ lowercase1 => 'periodical',
+ lowercaseX => 'periodicals'
+ },
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..6229917
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::EN::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart cards',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..f0a26ef
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::EN::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCstamps.pm b/lib/gcstar/GCLang/EN/GCModels/GCstamps.pm
new file mode 100644
index 0000000..a04e473
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCstamps.pm
@@ -0,0 +1,192 @@
+{
+ package GCLang::EN::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps',
+ lowercase1 => 'stamp',
+ lowercaseX => 'stamps'
+ },
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCModels/GCwines.pm b/lib/gcstar/GCLang/EN/GCModels/GCwines.pm
new file mode 100644
index 0000000..57f2688
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCModels/GCwines.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::EN::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => { 0 => 'Wines',
+ 1 => 'Wine',
+ X => 'Wines',
+ lowercase1 => 'wine',
+ lowercaseX => 'wines'
+ },
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/EN/GCstar.pm b/lib/gcstar/GCLang/EN/GCstar.pm
new file mode 100644
index 0000000..a7c6486
--- /dev/null
+++ b/lib/gcstar/GCLang/EN/GCstar.pm
@@ -0,0 +1,715 @@
+{
+ package GCLang::EN;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'English',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Warning</b>:
+
+Information downloaded from web sites (through the
+search plugins) is for <b>personal use only</b>.
+
+Any redistribution is forbidden without the site\'s
+<b>explicit authorization</b>.
+
+To determine which site owns the information, you
+may use the <b>button below item details</b>.',
+
+ 'AllItemsFiltered' => 'No {lowercaseX} match your filter criteria', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installing in ',
+ 'InstallMandatory' => 'Mandatory components',
+ 'InstallOptional' => 'Optional Components',
+ 'InstallErrorMissing' => 'Error : Following Perl components have to be installed: ',
+ 'InstallPrompt' => 'Base directory for installation [/usr/local]: ',
+ 'InstallEnd' => 'End of the installation',
+ 'InstallNoError' => 'No error',
+ 'InstallLaunch' => 'To use this application you can launch ',
+ 'InstallDirectory' => 'Base directory',
+ 'InstallTitle' => 'GCstar installation',
+ 'InstallDependencies' => 'Dependencies',
+ 'InstallPath' => 'Path',
+ 'InstallOptions' => 'Options',
+ 'InstallSelectDirectory' => 'Select base directory for the installation',
+ 'InstallWithClean' => 'Remove files found in installation directory',
+ 'InstallWithMenu' => 'Add GCstar to Applications menu',
+ 'InstallNoPermission' => 'Error: You don\'t have permission to write in the selected directory',
+ 'InstallMissingMandatory' => 'Mandatory dependencies are missing. You won\'t be able to install GCstar until they have been added to your system.',
+ 'InstallMissingOptional' => 'Some optional dependencies are missing. These are listed below. GCstar can be installed but some features won\'t be available.',
+ 'InstallMissingNone' => 'There are no missing dependencies. You may continue and install GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Missing',
+ 'InstallMissingFor' => 'Missing for',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy to use (just press enter if none): ',
+ 'UpdateNoPermission' => 'Write permission denied in this directory: ',
+ 'UpdateNone' => 'No updates have been found',
+ 'UpdateFileNotFound' => 'File not found',
+
+#Splash
+ 'SplashInit' => 'Initializing',
+ 'SplashLoad' => 'Loading Collection',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Ready',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'It seems you were previously using GCfilms. What do you want to import from GCfilms to GCstar (it won\'t impact GCfilms if you still want to use it)?',
+ 'GCfilmsImportOptions' => 'Settings',
+ 'GCfilmsImportData' => 'Movies list',
+
+#Menus
+ 'MenuFile' => '_File',
+ 'MenuNewList' => '_New Collection',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Recent Collections',
+ 'MenuLend' => 'Display _Borrowed {X}', # Accepts model codes
+ 'MenuImport' => '_Import',
+ 'MenuExport' => '_Export',
+ 'MenuAddItem' => '_Add {1}', # Accepts model codes
+
+ 'MenuEdit' => '_Edit',
+ 'MenuDuplicate' => 'Du_plicate {1}', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate {X}', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All {X}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Remove {1}', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove {X}', # Accepts model codes
+ 'MenuEditFields' => '_Change Collection Fields',
+ 'MenuEditLockItems' => '_Lock Collection',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Saved Searches',
+ 'MenuSavedSearchesSave' => 'Save Current Search',
+ 'MenuSavedSearchesEdit' => 'Modify Saved Searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Show _All {X}', # Accepts model codes
+ 'MenuNoFilter' => '_Any',
+
+ 'MenuConfiguration' => '_Settings',
+ 'MenuDisplayMenu' => 'Di_splay',
+ 'MenuDisplayFullScreen' => '_Full screen',
+ 'MenuDisplayMenuBar' => '_Menus',
+ 'MenuDisplayToolBar' => '_Toolbar',
+ 'MenuDisplayStatusBar' => 'B_ottom bar',
+ 'MenuDisplayOptions' => '_Displayed Information',
+ 'MenuBorrowers' => '_Borrowers',
+ 'MenuToolbarConfiguration' => '_Toolbar Controls',
+ 'MenuDefaultValues' => 'Default values for new {1}', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre _Conversion',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add Current Collection',
+ 'MenuBookmarksEdit' => '_Edit Bookmarked Collections',
+
+ 'MenuHelp' => '_Help',
+ 'MenuHelpContent' => '_Content',
+ 'MenuAllPlugins' => 'View _Plugins',
+ 'MenuBugReport' => 'Report a Problem',
+ 'MenuAbout' => '_About GCstar',
+
+ 'MenuNewWindow' => 'Show {1} in _New Window', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show {X} in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand All',
+ 'ContextCollapseAll' => 'Collapse All',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Do you really want to remove this {lowercase1}?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these {lowercaseX}?', # Accepts model codes
+
+ 'DefaultNewItem' => 'New {lowercase1}', # Accepts model codes
+ 'NewItemTooltip' => 'Add a new {lowercase1}', # Accepts model codes
+ 'NoItemFound' => 'Nothing was found. Would you like to search another site?',
+ 'OpenList' => 'Please select collection',
+ 'SaveList' => 'Please choose where to save the collection',
+ 'SaveListTooltip' => 'Save current collection',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'Set your preferences',
+ 'ViewTooltip' => 'Change collection display',
+ 'PlayTooltip' => 'Launch file associated to the {lowercase1}', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Search in progress...',
+ 'StatusGetInfo' => 'Getting information...',
+ 'StatusGetImage' => 'Getting picture...',
+
+ 'SaveError' => 'Cannot save items list. Please check access rights and disk free space.',
+ 'OpenError' => 'Cannot open items list. Please check access rights.',
+ 'OpenFormatError' => 'Cannot open items list. Format may be incorrect.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Selected directory to save images is not correct. Please select another one.',
+ 'OptionsCreationError'=> 'Cannot create options file: ',
+ 'OptionsOpenError'=> 'Cannot open options file: ',
+ 'OptionsSaveError'=> 'Cannot save options file: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'What to see this evening?',
+ 'RandomError'=> 'You have no {lowercaseX} that could be chosen', # Accepts model codes
+ 'RandomEnd'=> 'You have no more {lowercaseX} to choose from!', # Accepts model codes
+ 'RandomNextTip'=> 'Next suggestion',
+ 'RandomOkTip'=> 'Accept this suggestion',
+
+ 'AboutTitle' => 'About GCstar',
+ 'AboutDesc' => 'Personal collections manager',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Distributed under the terms of the GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'English translation by Christian Jodar and Jason Day',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo and webdesign by le Spektre',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+
+#Collection models
+ 'ModelsSelect' => 'Select a collection type',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items can be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be considered as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+#Web searches
+ 'PluginsTitle' => 'Search an item',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Search site',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Name',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Author',
+ 'PluginsLang' => 'Language',
+ 'PluginsUseSite' => 'Use selected site for future searches',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'ResultsTitle' => 'Select a {lowercase1}', # Accepts model codes
+ 'ResultsNextTip' => 'Search in next site',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple {lowercaseX} to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'ImportWindowTitle' => 'Select Fields to be Imported',
+ 'ImportViewPicture' => 'View Picture',
+ 'ImportSelectAll' => 'Select All',
+ 'ImportSelectNone' => 'Select None',
+
+ 'MultiSiteTitle' => 'Sites to use for searches',
+ 'MultiSiteUnused' => 'Unused plugins',
+ 'MultiSiteUsed' => 'Plugins to be used',
+ 'MultiSiteLang' => 'Fill List with English Plugins',
+ 'MultiSiteEmptyError' => 'You have an empty site list',
+ 'MultiSiteClear' => 'Clear List',
+
+#Settings
+ 'OptionsTitle' => 'Preferences',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Web browser',
+ 'OptionsPlayer' => 'Video player',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Images directory',
+ 'OptionsUseRelativePaths' => 'Use relative paths for images',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Display status bar',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Warning: Changes in this tab won\'t take effect until the application is restarted.',
+ 'OptionsRemoveConfirm' => 'Ask confirmation before item deletion',
+ 'OptionsAutoSave' => 'Automatically save collection',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Show splash screen',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Select the program to be used',
+ 'OptionsPlugins' => 'Site to retrieve data from',
+ 'OptionsAskPlugins' => 'Ask (All sites)',
+ 'OptionsPluginsMulti' => 'Many sites',
+ 'OptionsPluginsMultiAsk' => 'Ask (Many sites)',
+ 'OptionsPluginsMultiPerField' => 'Many sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each field we will fill the field with the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Set list',
+ 'OptionsAskImport' => 'Select fields to be imported',
+ 'OptionsProxy' => 'Use a proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Language',
+ 'OptionsMain' => 'Main',
+ 'OptionsPaths' => 'Paths',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Features',
+ 'OptionsDisplay' => 'Display',
+ 'OptionsToolbar' => 'Toolbar',
+ 'OptionsToolbars' => {0 => 'None', 1 => 'Small', 2 => 'Large', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {0 => 'Top', 1 => 'Bottom', 2 => 'Left', 3 => 'Right'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Items list',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Image', 2 => 'Detailed'},
+ 'OptionsColumns' => 'Columns',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Your e-mail',
+ 'OptionsTransform' => 'Place articles at the end of titles',
+ 'OptionsArticles' => 'Articles (Comma separated)',
+ 'OptionsSearchStop' => 'Allow search to be aborted',
+ 'OptionsBigPics' => 'Download hi-res artwork when available',
+ 'OptionsAlwaysOriginal' => 'Use main title as the original title if none present',
+ 'OptionsRestoreAccelerators' => 'Restore Accelerators',
+ 'OptionsHistory' => 'Size of history',
+ 'OptionsClearHistory' => 'Clear History',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Don\'t ask anymore',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Override default programs',
+ 'OptionsProgramsSet' => 'Set Programs',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure Mailing Programs',
+
+#Image list settings
+ 'ImagesOptionsButton' => 'Settings',
+ 'ImagesOptionsTitle' => 'Settings for images list',
+ 'ImagesOptionsSelectColor' => 'Select a color',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Background',
+ 'ImagesOptionsBgPicture' => 'Use a background picture',
+ 'ImagesOptionsFg'=> 'Selection',
+ 'ImagesOptionsBgTooltip' => 'Change background color',
+ 'ImagesOptionsFgTooltip'=> 'Change selection color',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Size',
+ 'ImagesOptionsSizeList' => {0 => 'Very Small', 1 => 'Small', 2 => 'Medium', 3 => 'Large', 4 => 'Extra Large'},
+ 'ImagesOptionsSizeTooltip' => 'Select image size',
+
+#Detailed list settings
+ 'DetailedOptionsTitle' => 'Settings for detailed list',
+ 'DetailedOptionsImageSize' => 'Images size',
+ 'DetailedOptionsGroupItems' => 'Group items by',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Select fields to display',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+#Fields to display
+ 'DisplayOptionsTitle' => 'Items to display',
+ 'DisplayOptionsAll' => 'Select all',
+ 'DisplayOptionsSearch' => 'Search button',
+
+#Extract plugins
+ 'ExtractButton' => 'Information',
+ 'ExtractTitle' => 'File information',
+ 'ExtractImport' => 'Use values',
+
+#Fields list
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+#Export plugins
+ 'ExportTitle' => 'Export item list',
+ 'ExportFilter' => 'Export only displayed items',
+ 'ExportFieldsTitle' => 'Fields to be exported',
+ 'ExportFieldsTip' => 'Select fields you want to export',
+ 'ExportWithPictures' => 'Copy pictures in a sub-directory',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+#Import plugins
+ 'ImportListTitle' => 'Import another items list',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'File',
+ 'ImportExportFieldsUnused' => 'Unused fields',
+ 'ImportExportFieldsUsed' => 'Used fields',
+ 'ImportExportFieldsFill' => 'Add All',
+ 'ImportExportFieldsClear' => 'Remove All',
+ 'ImportExportFieldsEmpty' => 'You must choose at least one field',
+ 'ImportExportFileEmpty' => 'You have to specify a file name',
+ 'ImportFieldsTitle' => 'Fields to be imported',
+ 'ImportFieldsTip' => 'Select fields you want to import',
+ 'ImportNewList' => 'Create a new collection',
+ 'ImportCurrentList' => 'Add to current collection',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+#File chooser
+ 'FileChooserOpenFile' => 'Please select file to use',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Select a directory',
+ 'FileChooserOverwrite' => 'This file already exists. Do you want to overwrite it?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+#Some default panels
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Read Only',
+ 'PanelForm' => 'Tabs',
+
+#Default labels used in panels
+ 'PanelSearchButton' => 'Fetch Information',
+ 'PanelSearchTip' => 'Search web for information on this name',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Click on the picture to select different one.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Right click for more options.',
+ 'PanelImageTitle' => 'Select a picture',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Select File',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore Default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Automatically update blank fields',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'View Information',
+ 'PanelWebTip' => 'View information on the web about this {lowercase1}', # Accepts model codes
+ 'PanelRemoveTip' => 'Remove current {lowercase1}', # Accepts model codes
+
+ 'PanelDateSelect' => 'Select',
+ 'PanelNobody' => 'Nobody',
+ 'PanelUnknown' => 'Unknown',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Rating',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Location',
+
+ 'PanelLending' => 'Lending',
+ 'PanelBorrower' => 'Borrower',
+ 'PanelLendDate' => 'Out Since',
+ 'PanelHistory' => 'Lending History',
+ 'PanelReturned' => '{1} Returned', # Accepts model codes
+ 'PanelReturnDate' => 'Return date',
+ 'PanelLendedYes' => 'Lended',
+ 'PanelLendedNo' => 'Available',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Either',
+ 'CheckYes' => 'Yes',
+ 'CheckNo' => 'No',
+
+#Toolbar
+ 'ToolbarRandom' => 'Tonight',
+ 'ToolbarAll' => 'View All',
+ 'ToolbarAllTooltip' => 'View all items',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+#Borrowers
+ 'BorrowersTitle' => 'Borrower Configuration',
+ 'BorrowersList' => 'Borrowers',
+ 'BorrowersName' => 'Name',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Add',
+ 'BorrowersRemove' => 'Remove',
+ 'BorrowersEdit' => 'Edit',
+ 'BorrowersTemplate' => 'Mail template',
+ 'BorrowersSubject' => 'Mail subject',
+ 'BorrowersNotice1' => '%1 will be replaced with the borrower\'s name',
+ 'BorrowersNotice2' => '%2 will be replaced with the item title',
+ 'BorrowersNotice3' => '%3 will be replaced with the borrow date',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Borrowed {lowercaseX}', # Accepts model codes
+ 'BorrowedDate' => 'Since',
+ 'BorrowedDisplayInPanel' => 'Show {1} in Main Window', # Accepts model codes
+
+#Mail
+ 'MailTitle' => 'Send an e-mail',
+ 'MailFrom' => 'From: ',
+ 'MailTo' => 'To: ',
+ 'MailSubject' => 'Subject: ',
+ 'MailSmtpError' => 'Problem when connecting to SMTP server',
+ 'MailSendmailError' => 'Problem when launching sendmail',
+
+#Search dialog
+ 'SearchTooltip' => 'Search all {lowercaseX}', # Accepts model codes
+ 'SearchTitle' => '{1} Search', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => '{X} matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => '{X} matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+#Query replace
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Current value',
+ 'QueryReplaceNew' => 'New value',
+ 'QueryReplaceLaunch' => 'Replace',
+
+#Collection properties
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of {lowercaseX}', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+#Mail sending
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+#Bookmarks
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Folders',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+#Bug report
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+#Not used yet
+ 'GenresTitle' => 'Genre Conversion',
+ 'GenresCategoryName' => 'Genre to use',
+ 'GenresCategoryMembers' => 'Genre to replace',
+ 'GenresLoad' => 'Load a list',
+ 'GenresExport' => 'Save list to a file',
+ 'GenresModify' => 'Edit conversion',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..f0badd4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ES::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Añadir títulos de columnas',
+ 'Separator' => 'Delimitador',
+ 'Replacement' => 'Reemplazar delimitador con',
+ 'Charset' => 'Codificación de caracteres',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..7c3e8c4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ES::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..786d63f
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ES::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Fichero de plantilla inválido',
+ 'UseFile' => 'Usar el fichero especificado abajo',
+ 'TemplateExternalFile' => 'Fichero de plantilla',
+ 'WithJS' => 'Utilizar Javascript',
+ 'FileTemplate' => 'Plantilla :',
+ 'Preview' => 'Vista previa',
+ 'NoPreview' => 'Vista previa no disponible',
+ 'Title' => 'Título de la página',
+ 'InfoFile' => 'El listado se encuentra en el archivo : ',
+ 'InfoDir' => 'Las imágenes se encuentran en : ',
+ 'HeightImg' => 'Altura en pixels de las imágenes a exportar : ',
+ 'OpenFileInBrowser' => 'Abrir el fichero generado en el navegador web',
+ 'Note' => 'Listado generado con <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduzca el texto a buscar',
+ 'SearchType1' => 'Sólo el Título',
+ 'SearchType2' => 'Toda la información',
+ 'SearchButton' => 'Buscar',
+ 'SearchTitle' => 'Mostrar sólo las películas coincidentes con los criterios anteriores',
+ 'AllButton' => 'Todas',
+ 'AllTitle' => 'Mostrar todas las películas',
+ 'Expand' => 'Todos desplegados',
+ 'ExpandTitle' => 'Mostrar la información de todas las películas',
+ 'Collapse' => 'Todos plegados',
+ 'CollapseTitle' => 'Ocultar la información de todas las películas',
+ 'Borrowed' => 'Prestatario : ',
+ 'NotBorrowed' => 'Disponible',
+ 'Top' => 'Arriba',
+ 'Bottom' => 'Abajo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..d2716d4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ES::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..bb1c0b3
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ES::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Incluir una instrucción DROP',
+ 'WithCreate' => 'Incluir una instrucción CREATE',
+ 'TableName' => 'Nombre de la tabla',
+ 'InfoFile' => 'Fichero SQL : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..5b42298
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ES::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'El archivo .tar.gz se encuentra en : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..f2ff186
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ES::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fichero modelo',
+ 'ModelText' => 'Texto de modelo',
+ 'Models' => 'Modelo a utilizar',
+ 'UseFile' => 'Especificar con un fichero',
+ 'UseModel' => 'Especificar en la zona de texto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..0706bb3
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ES::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Donde se debería buscar',
+ 'Default' => 'Directorio predeterminado de Alexandria',
+ 'Specified' => 'Directorio especificado abajo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..72e761e
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ES::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Codificación de caracteres',
+ 'Header' => 'Ignorar primera linea',
+ 'Separator' => 'Delimitador',
+ 'Plugin' => 'Sitio a usar',
+ 'UseFirst' => 'Seleccionar el primero si hay muchos resultados',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..6037227
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ES::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Carpeta',
+ 'Recursive' => 'Navegar sub-carpetas',
+ 'Suffixes' => 'Sufijos o extensiones de los ficheros',
+ 'SuffixesTooltip' => 'Una lista separada por comas de sufijos o extensiones a tener en cuenta',
+ 'Remove' => 'Para eliminar de los nombres',
+ 'RemoveTooltip' => 'Una lista separada por comas de palabras que se deberían elimnar de los nombres de los ficheros para crear los nombres nuevos',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..9c155c5
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ES::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiar imágenes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportList.pm
new file mode 100644
index 0000000..df81bae
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ES::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista de títulos',
+ 'Plugin' => 'Sitio a usar',
+ 'UseFirst' => 'Seleccionar el primero si hay muchos resultados',
+ 'CommentAuto' => 'Película importada automáticamente.',
+ 'CommentSite' => 'Sitio web : ',
+ 'CommentTitle' => 'Título : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3dc9f6a
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ES::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..2560252
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ES::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'El fichero no es una colección de video Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..87ed536
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCTVepisodes.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::ES::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de series de televisión (episodios)',
+ Items => {0 => 'Episodio',
+ 1 => 'Episodio',
+ lowercase1 => 'episodio',
+ X => 'Episodios',
+ lowercaseX => 'episodios',
+ P1 => 'El Episodio',
+ lowercaseP1 => 'el episodio',
+ U1 => 'Un Episodio',
+ lowercaseU1 => 'un episodio',
+ AP1 => 'Al Episodio',
+ lowercaseAP1 => 'al episodio',
+ DP1 => 'Del Episodio',
+ lowercaseDP1 => 'del episodio',
+ PX => 'Los Episodios',
+ lowercasePX => 'los episodios',
+ E1 => 'Este Episodio',
+ lowercaseE1 => 'este episodio',
+ EX => 'Estos Episodios',
+ lowercaseEX => 'estos episodios'
+ },
+ NewItem => 'Episodio nuevo',
+ NewSeries => 'Nueva serie',
+ Episode => 'Episodio',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..f7dfd9f
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCTVseries.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::ES::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de series de television (series)',
+ Items => {0 => 'Serie',
+ 1 => 'Serie',
+ lowercase1 => 'serie',
+ X => 'Series',
+ lowercaseX => 'series',
+ P1 => 'La Serie',
+ lowercaseP1 => 'la serie',
+ U1 => 'Una Serie',
+ lowercaseU1 => 'una serie',
+ AP1 => 'A La Serie',
+ lowercaseAP1 => 'a la serie',
+ DP1 => 'De la Serie',
+ lowercaseDP1 => 'de la serie',
+ PX => 'Las Series',
+ lowercasePX => 'las series',
+ E1 => 'Esta Serie',
+ lowercaseE1 => 'esta serie',
+ EX => 'Estas Series',
+ lowercaseEX => 'estas series'
+ },
+ NewItem => 'Nueva serie',
+ Name => 'Nombre',
+ Season => 'Temporada',
+ Part => 'Parte',
+ Episodes => 'Episodios',
+ FirstAired => 'Inicio de emisión',
+ Time => 'Duración de episidio',
+ Producer => 'Productor',
+ Music => 'Música',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..f688abb
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCboardgames.pm
@@ -0,0 +1,103 @@
+{
+ package GCLang::ES::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de juegos de mesa',
+ Items => {0 => 'Juego',
+ 1 => 'Juego',
+ lowercase1 => 'juego',
+ X => 'Juegos',
+ lowercaseX => 'juegos',
+ P1 => 'El Juego',
+ lowercaseP1 => 'el juego',
+ U1 => 'Un Juego',
+ lowercaseU1 => 'un juego',
+ AP1 => 'Al Juego',
+ lowercaseAP1 => 'al juego',
+ DP1 => 'Del Juego',
+ lowercaseDP1 => 'del juego',
+ PX => 'Los Juegos',
+ lowercasePX => 'los juegos',
+ E1 => 'Este Juego',
+ lowercaseE1 => 'este juego',
+ EX => 'Estos Juegos',
+ lowercaseEX => 'estos juegos'
+ },
+ NewItem => 'Nuevo juego',
+
+ Id => 'Id',
+ Name => 'Nombre',
+ Original => 'Nombre original',
+ Box => 'Foto de la caja',
+ DesignedBy => 'Diseñado por',
+ PublishedBy => 'Publicado por',
+ Players => 'Número de jugadores',
+ PlayingTime => 'Duración del juego',
+ SuggestedAge => 'Edades sugeridas',
+ Released => 'Fecha de publicación',
+ Description => 'Descripción',
+ Category => 'Categoría',
+ Mechanics => 'Mecánica',
+ ExpandedBy => 'Expandido por',
+ ExpansionFor => 'Expansión para',
+ GameFamily => 'Familia del juego',
+ IllustratedBy => 'Ilustrado por',
+ Url => 'Página web',
+ TimesPlayed => 'Veces jugado',
+ CompleteContents => 'Contenido completo',
+ Copies => 'Número de copias',
+ Condition => 'Condición',
+ Photos => 'Fotos',
+ Photo1 => 'Primera foto',
+ Photo2 => 'Segunda foto',
+ Photo3 => 'Tercera foto',
+ Photo4 => 'Cuarta foto',
+ Comments => 'Comentarios',
+
+ Perfect => 'Perfecto',
+ Good => 'Bien',
+ Average => 'Normal',
+ Poor => 'Mal',
+
+ CompleteYes => 'Contenido completo',
+ CompleteNo => 'Faltan piezas',
+
+ General => 'General',
+ Details => 'Detalles',
+ Personal => 'Personal',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuación al _menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ES/GCModels/GCbooks.pm
new file mode 100644
index 0000000..64845fa
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCbooks.pm
@@ -0,0 +1,88 @@
+{
+ package GCLang::ES::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de libros',
+ Items => {0 => 'Libro',
+ 1 => 'Libro',
+ lowercase1 => 'libro',
+ X => 'Libros',
+ lowercaseX => 'libros',
+ P1 => 'El Libro',
+ lowercaseP1 => 'el libro',
+ U1 => 'Un Libro',
+ lowercaseU1 => 'un libro',
+ AP1 => 'Al Libro',
+ lowercaseAP1 => 'al libro',
+ DP1 => 'Del Libro',
+ lowercaseDP1 => 'del libro',
+ PX => 'Los Libros',
+ lowercasePX => 'los libros',
+ E1 => 'Este Libro',
+ lowercaseE1 => 'este libro',
+ EX => 'Estos Libros',
+ lowercaseEX => 'estos libros'
+ },
+
+ NewItem => 'Nuevo libro',
+
+ Isbn => 'ISBN',
+ Title => 'Título',
+ Cover => 'Portada',
+ Authors => 'Autores',
+ Publisher => 'Editor',
+ Publication => 'Fecha de edición',
+ Language => 'Idioma',
+ Genre => 'Género',
+ Serie => 'Serie',
+ Rank => 'Capítulo',
+ Bookdescription => 'Descripción',
+ Pages => 'Páginas',
+ Read => 'Leído',
+ Acquisition => 'Fecha de adquisición',
+ Edition => 'Edición',
+ Format => 'Formato',
+ Comments => 'Comentarios',
+ Url => 'Página web',
+ Translator => 'Traductor',
+ Artist => 'Artista',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detalles',
+
+ ReadNo => 'No leído',
+ ReadYes => 'Leído',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ES/GCModels/GCcoins.pm
new file mode 100644
index 0000000..52a2fe4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCcoins.pm
@@ -0,0 +1,126 @@
+{
+ package GCLang::ES::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección numismática',
+ Items => {0 => 'Moneda',
+ 1 => 'Moneda',
+ lowercase1 => 'moneda',
+ X => 'Monedas',
+ lowercaseX => 'monedas',
+ P1 => 'La Moneda',
+ lowercaseP1 => 'la moneda',
+ U1 => 'Una Moneda',
+ lowercaseU1 => 'una moneda',
+ AP1 => 'A La Moneda',
+ lowercaseAP1 => 'a la moneda',
+ DP1 => 'De La Moneda',
+ lowercaseDP1 => 'de la moneda',
+ PX => 'Las Monedas',
+ lowercasePX => 'Las Monedas',
+ E1 => 'Esta Moneda',
+ lowercaseE1 => 'esta moneda',
+ EX => 'Estas Monedas',
+ lowercaseEX => 'estas monedas'
+ },
+
+ NewItem => 'Nueva moneda',
+
+ Name => 'Nombre',
+ Country => 'País',
+ Year => 'Año',
+ Currency => 'Divisa',
+ Value => 'Valor',
+ Picture => 'Imágen principal',
+ Diameter => 'Diámetro',
+ Metal => 'Metal',
+ Edge => 'Borde',
+ Edge1 => 'Borde 1',
+ Edge2 => 'Borde 2',
+ Edge3 => 'Borde 3',
+ Edge4 => 'Borde 4',
+ Head => 'Cara',
+ Tail => 'Cruz',
+ Comments => 'Comentarios',
+ History => 'Historia',
+ Website => 'Página web',
+ Estimate => 'Estimación',
+ References => 'Referencias',
+ Type => 'Tipo',
+ Coin => 'Moneda',
+ Banknote => 'Billete',
+
+ Main => 'Principal',
+ Description => 'Descripción',
+ Other => 'Otra información',
+ Pictures => 'Imágenes',
+
+ Location => 'Localización',
+ Front => 'Delante',
+ Back => 'Detrás',
+
+ Condition => 'Condición (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ES/GCModels/GCcomics.pm
new file mode 100644
index 0000000..5179e57
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCcomics.pm
@@ -0,0 +1,90 @@
+{
+ package GCLang::ES::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de cómics',
+ Items => {0 => 'Cómics',
+ 1 => 'Cómic',
+ lowercase1 => 'cómic',
+ X => 'Cómics',
+ lowercaseX => 'cómics',
+ P1 => 'El Cómic',
+ lowercaseP1 => 'el cómics',
+ U1 => 'Un Cómic',
+ lowercaseU1 => 'un cómic',
+ AP1 => 'Al Cómic',
+ lowercaseAP1 => 'al cómic',
+ DP1 => 'Del Cómic',
+ lowercaseDP1 => 'del cómic',
+ PX => 'Los Cómics',
+ lowercasePX => 'los cómics',
+ E1 => 'Este Cómic',
+ lowercaseE1 => 'este cómic',
+ EX => 'Estos Cómics',
+ lowercaseEX => 'estos cómics'
+ },
+ NewItem => 'Cómic nuevo',
+
+
+ Id => 'Id',
+ Name => 'Nombre',
+ Series => 'Serie',
+ Volume => 'Volumen',
+ Title => 'Título',
+ Writer => 'Escritor',
+ Illustrator => 'Ilustrador',
+ Colourist => 'Colorista',
+ Publisher => 'Publicado por',
+ Synopsis => 'Sinopsis',
+ Collection => 'Colección',
+ PublishDate => 'Fecha de publicación',
+ PrintingDate => 'Fecha de impresión',
+ ISBN => 'ISBN',
+ Type => 'Tipo',
+ Category => 'Categoría',
+ Format => 'Formato',
+ NumberBoards => 'Número de páginas',
+ Signing => 'Dedicado',
+ Cost => 'Coste',
+ Rating => 'Puntuación',
+ Comment => 'Comentarios',
+ Url => 'Página web',
+
+ FilterRatingSelect => 'Puntuación al _menos...',
+
+ Main => 'Elementos principales',
+ General => 'General',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ES/GCModels/GCfilms.pm
new file mode 100644
index 0000000..25a243c
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCfilms.pm
@@ -0,0 +1,112 @@
+{
+ package GCLang::ES::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de películas',
+ Items => {0 => 'Película',
+ 1 => 'Película',
+ lowercase1 => 'película',
+ X => 'Películas',
+ lowercaseX => 'películas',
+ P1 => 'La Película',
+ lowercaseP1 => 'la película',
+ U1 => 'Una Película',
+ lowercaseU1 => 'una película',
+ AP1 => 'A la Película',
+ lowercaseAP1 => 'a la película',
+ DP1 => 'De la Película',
+ lowercaseDP1 => 'de la película',
+ PX => 'Las Películas',
+ lowercasePX => 'las películas',
+ E1 => 'Esta Película',
+ lowercaseE1 => 'esta película',
+ EX => 'Estas Películas',
+ lowercaseEX => 'estas películas'
+ },
+
+ NewItem => 'Nueva película',
+
+
+ Id => 'Id',
+ Title => 'Título',
+ Date => 'Fecha de salida',
+ Time => 'Duración',
+ Director => 'Director',
+ Country => 'Nacionalidad',
+ MinimumAge => 'Edad mínima',
+ Genre => 'Géneros',
+ Image => 'Imagen',
+ Original => 'Título original',
+ Actors => 'Actores',
+ Actor => 'Actor',
+ Role => 'Papel',
+ Comment => 'Comentarios',
+ Synopsis => 'Sinopsis',
+ Seen => 'Ya vista',
+ Number => 'Número',
+ Format => 'Soporte',
+ Region => 'Región',
+ Identifier => 'Identificador',
+ Url => 'URL',
+ Audio => 'Audio',
+ Video => 'Formato de video',
+ Trailer => 'Fichero de video',
+ Serie => 'Serie',
+ Rank => 'Capítulo',
+ Subtitles => 'Subtítulos',
+
+ SeenYes => 'Película ya vista',
+ SeenNo => 'Película no vista',
+
+ AgeUnrated => 'Desconocida',
+ AgeAll => 'Ninguna',
+ AgeParent => 'Control paterno',
+
+ Main => 'Elementos principales',
+ General => 'Ficha de la película',
+ Details => 'Información personal',
+ Lending => 'Préstamo',
+
+ Information => 'Informacion',
+ Languages => 'Idiomas',
+ Encoding => 'Codificación',
+
+ FilterAudienceAge => 'Edad mínima',
+ FilterSeenNo => 'Películas no vistas',
+ FilterSeenYes => '_Ya vista',
+ FilterRatingSelect => 'Puntuación al _menos...',
+
+ ExtractSize => 'Tamaño',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCgames.pm b/lib/gcstar/GCLang/ES/GCModels/GCgames.pm
new file mode 100644
index 0000000..51c8485
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCgames.pm
@@ -0,0 +1,99 @@
+{
+ package GCLang::ES::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de video juegos',
+ Items => {0 => 'Juego',
+ 1 => 'Juego',
+ lowercase1 => 'juego',
+ X => 'Juegos',
+ lowercaseX => 'juegos',
+ P1 => 'El Juego',
+ lowercaseP1 => 'el juego',
+ U1 => 'Un Juego',
+ lowercaseU1 => 'un juego',
+ AP1 => 'Al Juego',
+ lowercaseAP1 => 'al juego',
+ DP1 => 'Del Juego',
+ lowercaseDP1 => 'del juego',
+ PX => 'Los Juegos',
+ lowercasePX => 'los juegos',
+ E1 => 'Este Juego',
+ lowercaseE1 => 'este juego',
+ EX => 'Estos Juegos',
+ lowercaseEX => 'estos juegos'
+ },
+ NewItem => 'Nuevo juego',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nombre',
+ Platform => 'Plataforma',
+ Players => 'Número de jugadores',
+ Released => 'Fecha de publicación',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Género',
+ Box => 'Portada de la caja',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completado (%)',
+ Executable => 'Ejecutable',
+ Description => 'Descripción',
+ Codes => 'Códigos',
+ Code => 'Código',
+ Effect => 'Efecto',
+ Secrets => 'Secretos',
+ Screenshots => 'Capturas de pantallas',
+ Screenshot1 => 'Primera captura',
+ Screenshot2 => 'Seguna captura',
+ Comments => 'Comentarios',
+ Url => 'Página web',
+ Unlockables => 'Desbloqueables',
+ Unlockable => 'Desbloqueable',
+ Howto => 'Cómo desbloquear',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Detalles',
+ Tips => 'Consejos',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuación al _menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..e0519bd
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCgeneric.pm
@@ -0,0 +1,59 @@
+{
+ package GCLang::ES::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Artículo',
+ 1 => 'Artículo',
+ lowercase1 => 'artículo',
+ X => 'Artículos',
+ lowercaseX => 'artículos',
+ P1 => 'el artículo',
+ lowercaseP1 => 'el artículo',
+ U1 => 'Un Artículo',
+ lowercaseU1 => 'un artículo',
+ AP1 => 'Al Artículo',
+ lowercaseAP1 => 'al artículo',
+ DP1 => 'Del Artículo',
+ lowercaseDP1 => 'del artículo',
+ PX => 'Los Artículos',
+ lowercasePX => 'los artículos',
+ E1 => 'Este Artículos',
+ lowercaseE1 => 'este artículo',
+ EX => 'Estos Artículos',
+ lowercaseEX => 'estos artículos'
+ },
+
+ NewItem => 'Nuevo artículo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ES/GCModels/GCminicars.pm
new file mode 100644
index 0000000..6d582c7
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCminicars.pm
@@ -0,0 +1,195 @@
+{
+ package GCLang::ES::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehículo',
+ 1 => 'Vehículo',
+ X => 'Vehículos',
+ lowercaseX => 'vehículos',
+ P1 => 'El Vehículo',
+ lowercaseP1 => 'el vehículo',
+ U1 => 'Un Vehículo',
+ lowercaseU1 => 'un vehículo',
+ AP1 => 'Al Vehículo',
+ lowercaseAP1 => 'al vehículo',
+ DP1 => 'Del Vehículo',
+ lowercaseDP1 => 'del vehículo',
+ PX => 'Los Vehículos',
+ lowercasePX => 'los vehículos',
+ E1 => 'Este Vehículo',
+ lowercaseE1 => 'este vehículo',
+ EX => 'Estos Vehículos',
+ lowercaseEX => 'estos vehículos'
+ },
+ NewItem => 'Nuevo vehículo',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Designe date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Réalism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Nunmber of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ES/GCModels/GCmusics.pm
new file mode 100644
index 0000000..184a9e9
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCmusics.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::ES::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de música',
+ Items => {0 => 'Ãlbum',
+ 1 => 'Ãlbum',
+ lowercase1 => 'Ãlbum',
+ X => 'Ãlbumes',
+ lowercaseX => 'álbumes',
+ P1 => 'El Ãlbum',
+ lowercaseP1 => 'el álbum',
+ U1 => 'Un Ãlbum',
+ lowercaseU1 => 'un álbum',
+ AP1 => 'Al Ãlbum',
+ lowercaseAP1 => 'al álbum',
+ DP1 => 'Del Ãlbum',
+ lowercaseDP1 => 'del álbum',
+ PX => 'Los Ãlbumes',
+ lowercasePX => 'los álbumes',
+ E1 => 'Este Ãlbum',
+ lowercaseE1 => 'este álbum ',
+ EX => 'Estos Ãlbumes',
+ lowercaseEX => 'estos álbumes'
+ },
+ NewItem => 'Ãlbum nuevo',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Título',
+ Cover => 'Portada',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Duración',
+ Release => 'Fecha de publicación',
+ Genre => 'Género',
+ Origin => 'Origen',
+
+#For tracks list
+ Tracks => 'Lista de canciones',
+ Number => 'Número',
+ Track => 'Título',
+ Time => 'Duración',
+
+ Composer => 'Compositor',
+ Producer => 'Productor',
+ Playlist => 'Lista de reproducción',
+ Comments => 'Comentarios',
+ Label => 'Discográfica',
+ Url => 'Página web',
+
+ General => 'General',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..e4684b1
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCperiodicals.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ES::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Revista',
+ 1 => 'Revista',
+ lowercase1 => 'revista',
+ X => 'Revistas',
+ lowercaseX => 'revistas',
+ P1 => 'La Revista',
+ lowercaseP1 => 'la revista',
+ U1 => 'Una Revista',
+ lowercaseU1 => 'una revista',
+ AP1 => 'A la Revista',
+ lowercaseAP1 => 'a la revista',
+ DP1 => 'De la Revista',
+ lowercaseDP1 => 'de la revista',
+ PX => 'Las Revistas',
+ lowercasePX => 'las revistas',
+ E1 => 'Esta Revista',
+ lowercaseE1 => 'esta revista',
+ EX => 'Estas Revistas',
+ lowercaseEX => 'estas revistas'
+ },
+
+ NewItem => 'Nueva revista',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..7026e66
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ES::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..0eb009e
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ES::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ES/GCModels/GCstamps.pm
new file mode 100644
index 0000000..ffcb30d
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCstamps.pm
@@ -0,0 +1,206 @@
+{
+ package GCLang::ES::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Sello',
+ 1 => 'Sello',
+ lowercase1 => 'sello',
+ X => 'Sellos',
+ lowercaseX => 'sellos',
+ P1 => 'El Sello',
+ lowercaseP1 => 'el sello',
+ U1 => 'Un Sello',
+ lowercaseU1 => 'un sello',
+ AP1 => 'Al Sello',
+ lowercaseAP1 => 'al sello',
+ DP1 => 'Del Sello',
+ lowercaseDP1 => 'del sello',
+ PX => 'Los Sellos',
+ lowercasePX => 'los sellos',
+ E1 => 'Este Sello',
+ lowercaseE1 => 'este sello',
+ EX => 'Estos Sellos',
+ lowercaseEX => 'estos sellos'
+ },
+ NewItem => 'Nuevo sello',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCModels/GCwines.pm b/lib/gcstar/GCLang/ES/GCModels/GCwines.pm
new file mode 100644
index 0000000..faf0002
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCModels/GCwines.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::ES::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de vinos',
+ Items => {0 => 'Vino',
+ 1 => 'Vino',
+ lowercase1 => 'vino',
+ X => 'Vinos',
+ lowercaseX => 'vinos',
+ P1 => 'El Vino',
+ lowercaseP1 => 'el vino',
+ U1 => 'Un Vino',
+ lowercaseU1 => 'un vino',
+ AP1 => 'Al Vino',
+ lowercaseAP1 => 'al vino',
+ DP1 => 'Del Vino',
+ lowercaseDP1 => 'del vino',
+ PX => 'Los Vinos',
+ lowercasePX => 'los vinos',
+ E1 => 'Este Vino',
+ lowercaseE1 => 'este vino',
+ EX => 'Estos Vinos',
+ lowercaseEX => 'estos vinos'
+ },
+ NewItem => 'Nuevo vino',
+
+ Name => 'Nombre',
+ Designation => 'Designación',
+ Vintage => 'Cosecha',
+ Vineyard => 'Viñedo',
+ Type => 'Tipo',
+ Grapes => 'Uvas',
+ Soil => 'Suelo',
+ Producer => 'Productor',
+ Country => 'País',
+ Volume => 'Volumen (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medalla/Honores',
+
+ Storage => 'Almacenamiento',
+ Location => 'Localización',
+ ShelfIndex => 'Ãndice',
+ Quantity => 'Cantidad',
+ Acquisition => 'Adquisición',
+ PurchaseDate => 'Fecha de compra',
+ PurchasePrice => 'Precio de compra',
+ Gift => 'Regalo',
+ BottleLabel => 'Etiqueta de la botella',
+ Website => 'Referencias en la Web',
+
+ Tasted => 'Catado',
+ Comments => 'Comentarios',
+ Serving => 'Servir',
+ TastingField => 'Notas para cata',
+
+ General => 'General',
+ Details => 'Detalles',
+ Tasting => 'Cata',
+
+ TastedNo => 'No catado',
+ TastedYes => 'Catado',
+
+ FilterRange => 'Rango',
+ FilterTastedNo => '_No catado',
+ FilterTastedYes => 'Ya _catado',
+ FilterRatingSelect => 'Puntuación al _menos...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ES/GCstar.pm b/lib/gcstar/GCLang/ES/GCstar.pm
new file mode 100644
index 0000000..66966b4
--- /dev/null
+++ b/lib/gcstar/GCLang/ES/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::ES;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Español',
+
+ 'Separator' => ' : ',
+
+ 'Warning' => '<b>Aviso</b> :
+
+La información descargada desde Internet (gracias a
+los plugins de búsqueda) es sólo para <b>uso personal</b>
+
+Cualquier redistribución queda prohibida <b> sin la
+explícita autorización de las respectivas webs</b>.
+
+Para saber cual es la web a la que pertenece la información,
+puede usar <b>el botón situado debajo de los detalles de la película</b>.',
+
+ 'AllItemsFiltered' => 'Ninguna {lowercaseX} cumple con los criterios de filtrado', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalar en ',
+ 'InstallMandatory' => 'Componentes obligatorios',
+ 'InstallOptional' => 'Componentes opcionales',
+ 'InstallErrorMissing' => 'Error: los componentes siguientes deben instalarse: ',
+ 'InstallPrompt' => 'Directorio predeterminado para la instalación [/usr/local]: ',
+ 'InstallEnd' => 'Fin de la instalación',
+ 'InstallNoError' => 'Ningún error',
+ 'InstallLaunch' => 'Para utilizar la aplicación, ejecute ',
+ 'InstallDirectory' => 'Repertorio básico',
+ 'InstallTitle' => 'Instalación de GCstar',
+ 'InstallDependencies' => 'Dependencias',
+ 'InstallPath' => 'Ruta',
+ 'InstallOptions' => 'Opciones',
+ 'InstallSelectDirectory' => 'Elija el directorio para la instalación',
+ 'InstallWithClean' => 'Eliminar archivos del directorio de instalación.',
+ 'InstallWithMenu' => 'Añadir GCstar al menu de Aplicaciones',
+ 'InstallNoPermission' => 'Error : No tiene permisos para instalar en el directorio seleccionado!!',
+ 'InstallMissingMandatory' => 'Algunas dependencias obligatorias no están disponibles. No podrá instalar GCstar hasta que se instalen en el sistema.',
+ 'InstallMissingOptional' => 'Algunas depencias opcionales no están disponibles. Se detallan debajo. GCstar se instalará con algunas funciones deshabilitadas.',
+ 'InstallMissingNone' => 'Dependencias satisfechas. Puede continuar e instalar GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'No disponible',
+ 'InstallMissingFor' => 'No disponible por',
+ 'InstallCleanDirectory' => 'Eliminado ficheros de GCstar en el diretorio: ',
+ 'InstallCopyDirectory' => 'Copiando ficheros en el directorio: ',
+ 'InstallCopyDesktop' => 'Copiando el fichero .desktop en: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy a usar (si no usa ninguno presione Enter): ',
+ 'UpdateNoPermission' => 'Permiso de escritura denegado en este directorio: ',
+ 'UpdateNone' => 'No se ha encontrado ninguna actualización',
+ 'UpdateFileNotFound' => 'Fichero no encontrado',
+
+#Splash
+ 'SplashInit' => 'Inicialización',
+ 'SplashLoad' => 'Cargando películas',
+ 'SplashDisplay' => 'Mostrando Colección',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Listo',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Parece que antes usaba GCfilms. ¿Qué quiere importar desde GCfilms a GCstar? (No afectará a GCfilms, si todavía quiere seguir usándolo)',
+ 'GCfilmsImportOptions' => 'Preferencias',
+ 'GCfilmsImportData' => 'Listado de películas',
+
+#Menus
+ 'MenuFile' => '_Archivo',
+ 'MenuNewList' => '_Nueva lista de películas',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Ficheros abiertos recientemente',
+ 'MenuLend' => '_Ver {lowercaseX} prestadas', # Accepts model codes
+ 'MenuImport' => '_Importar',
+ 'MenuExport' => '_Exportar',
+ 'MenuAddItem' => '_Add {lowercase1}', # Accepts model codes
+
+ 'MenuEdit' => '_Editar',
+ 'MenuDuplicate' => '_Duplicar {lowercase1}', # Accepts model codes
+ 'MenuDuplicatePlural' => '_Duplicar {lowercaseX}', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _all {lowercaseX}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Eliminar {lowercase1} actual',, # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Eliminar {lowercaseX} actual', # Accepts model codes
+ 'MenuEditFields' => '_Cambiar campos de la colección',
+ 'MenuEditLockItems' => '_Bloquear la información',
+
+ 'MenuDisplay' => '_Visualización',
+ 'MenuSavedSearches' => 'Búsquedas guardadas',
+ 'MenuSavedSearchesSave' => 'Guardar búsqueda actual',
+ 'MenuSavedSearchesEdit' => 'Modificar búsquedas guardadas',
+ 'MenuAdvancedSearch' => 'Búsqueda _avanzada',
+ 'MenuViewAllItems' => '_Ver todas {lowercasePX}', # Accepts model codes
+ 'MenuNoFilter' => '_Todas las películas',
+
+ 'MenuConfiguration' => '_Configuración',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Información a mostrar',
+ 'MenuBorrowers' => 'Pres_tatarios',
+ 'MenuToolbarConfiguration' => 'Controles de la barra de _herramientas',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Conversión de _géneros',
+
+ 'MenuBookmarks' => 'Mis _Colecciones',
+ 'MenuBookmarksAdd' => '_Añadir colección actual',
+ 'MenuBookmarksEdit' => '_Editar colecciones favoritas',
+
+ 'MenuHelp' => '_?',
+ 'MenuHelpContent' => '_?',
+ 'MenuAllPlugins' => 'Ver _complementos',
+ 'MenuBugReport' => 'Comunicar un _fallo',
+ 'MenuAbout' => 'A propósito de _GCstar',
+
+ 'MenuNewWindow' => 'Mostrar {lowercase1} en una nueva ventana', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Mostrar {lowercaseX} en una nueva ventana', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandir todo',
+ 'ContextCollapseAll' => 'Contraer todo',
+ 'ContextChooseImage' => 'Elegir _Imagen',
+ 'ContextOpenWith' => 'Abrir _Con',
+ 'ContextImageEditor' => 'Editor de Imágenes',
+ 'ContextImgFront' => 'Frontal',
+ 'ContextImgBack' => 'Trasera',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Introduzca un valor por favor',
+
+ 'RemoveConfirm' => '¿Realmente quiere eliminar {lowercaseE1}?', # Accepts model codes
+ 'RemoveConfirmPlural' => '¿Realmente quiere eliminar {lowercaseEX}?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Elemento nuevo',
+ 'NewItemTooltip' => 'Añadir una nueva película',
+ 'NoItemFound' => 'Ninguna película encontrada. ¿Quiere intentar una nueva búsqueda en otro sitio?',
+ 'OpenList' => '¿Qué lista de películas abrir?',
+ 'SaveList' => '¿En qué fichero quiere guardar el listado?',
+ 'SaveListTooltip' => 'Guardar el listado actual',
+ 'SaveUnsavedChanges' => 'Hay cambios sin guardar en su colección. ¿Quiere guardarlos?',
+ 'SaveDontSave' => 'No guardar',
+ 'PreferencesTooltip' => 'Cambiar sus preferencias',
+ 'ViewTooltip' => 'Cambiar el tipo de lista',
+ 'PlayTooltip' => 'Reproducir archivo de video asociado {lowercaseAP1}', # Accepts model codes
+ 'PlayFileNotFound' => 'No se encontró el fichero a reproducir:',
+ 'PlayRetry' => 'Reintentar',
+
+ 'StatusSave' => 'Guardando...',
+ 'StatusLoad' => 'Cargando...',
+ 'StatusSearch' => 'Búsqueda en curso...',
+ 'StatusGetInfo' => 'Descargando la información...',
+ 'StatusGetImage' => 'Descarga a distancia de la imagen...',
+
+ 'SaveError' => 'Imposible guardar la lista de películas. Compruebe los permisos y el espacio disponible en el disco.',
+ 'OpenError' => 'Imposible abrir la lista de películas. Compruebe los permisos.',
+ 'OpenFormatError' => 'Imposible abrir la lista de películas.',
+ 'OpenVersionWarning' => 'La colección se creó con una versión mñas erciente de GCstar. Si la guarda, podría perder datos.',
+ 'OpenVersionQuestion' => '¿Todavía quiere continuar?',
+ 'ImageError' => 'El repertorio elegido para salvar las imágenes no es correcto.¿Quiere elegir otro?',
+ 'OptionsCreationError'=> 'Imposible crear el fichero de opciones : ',
+ 'OptionsOpenError'=> 'Imposible abrir el fichero de opciones : ',
+ 'OptionsSaveError'=> 'Imposible guardar el fichero de opciones',
+ 'ErrorModelNotFound' => 'Modelo no encontrado: ',
+ 'ErrorModelUserDir' => 'Los modelos definidos por el usuario están en: ',
+
+ 'RandomTooltip' => '¿Qué quieres ver esta noche?',
+ 'RandomError'=> 'No quedan {lowercaseX} sin ver', # Accepts model codes
+ 'RandomEnd'=> 'No hay mas {lowercaseX}', # Accepts model codes
+ 'RandomNextTip'=> 'Siguiente sugerencia',
+ 'RandomOkTip'=> 'Aceptar {lowercaseE1}',
+
+ 'AboutTitle' => 'A propósito de GCstar',
+ 'AboutDesc' => 'Gestión de Colecciones',
+ 'AboutVersion' => 'Versión',
+ 'AboutTeam' => 'Equipo',
+ 'AboutWho' => 'Christian Jodar (Tian) : Gestión del proyecto, Programación
+Nyall Dawson (Zombiepig) : Programación
+TPF : Programación
+Adolfo González Blázquez : Programación
+',
+ 'AboutLicense' => 'Distribuido según los términos de la GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traducción : Adolfo González Blázquez',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo y diseño web por le Spektre',
+
+ 'ToolbarRandom' => 'Esta noche',
+
+ 'UnsavedCollection' => 'Colección no guardada',
+ 'ModelsSelect' => 'Seleccionar un tipo de colección',
+ 'ModelsPersonal' => 'Modelos personales',
+ 'ModelsDefault' => 'Modelos predefinidos',
+ 'ModelsList' => 'Definición de la colección',
+ 'ModelSettings' => 'Preferencias de la colección',
+ 'ModelNewType' => 'Nuevo tipo de colección',
+ 'ModelName' => 'Nombre del tipo de colección:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'Nuevo campo',
+ 'ModelFieldInformation' => 'Información',
+ 'ModelFieldName' => 'Etiqueta:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Grupo:',
+ 'ModelFieldValues' => 'Valores',
+ 'ModelFieldInit' => 'Predeterminado:',
+ 'ModelFieldMin' => 'Mínimo:',
+ 'ModelFieldMax' => 'Máximo:',
+ 'ModelFieldList' => 'Lista de valores:',
+ 'ModelFieldListLegend' => '<i>Separados por comas</i>',
+ 'ModelFieldDisplayAs' => 'Mostrar como:',
+ 'ModelFieldDisplayAsText' => 'Texto',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Texto corto',
+ 'ModelFieldTypeLongText' => 'Texto largo',
+ 'ModelFieldTypeYesNo' => 'Si/No',
+ 'ModelFieldTypeNumber' => 'Número',
+ 'ModelFieldTypeDate' => 'Fecha',
+ 'ModelFieldTypeOptions' => 'Lista de valores prefedinidos',
+ 'ModelFieldTypeImage' => 'Imagen',
+ 'ModelFieldTypeSingleList' => 'Lista simple',
+ 'ModelFieldTypeFile' => 'Fichero',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parámetros',
+ 'ModelFieldHasHistory' => 'Usar historial',
+ 'ModelFieldFlat' => 'Mostrar en una línea',
+ 'ModelFieldStep' => 'Paso de incremento:',
+ 'ModelFieldFileFormat' => 'Formato de fichero:',
+ 'ModelFieldFileFile' => 'Fichero simple',
+ 'ModelFieldFileImage' => 'Imagen',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Campos a usar',
+ 'ModelOptionsFieldsAuto' => 'Automático',
+ 'ModelOptionsFieldsNone' => 'Ninguno',
+ 'ModelOptionsFieldsTitle' => 'Como título',
+ 'ModelOptionsFieldsId' => 'Como identificador',
+ 'ModelOptionsFieldsCover' => 'Como portada',
+ 'ModelOptionsFieldsPlay' => 'Como botón de Reproducir',
+ 'ModelCollectionSettings' => 'Preferencias de la colección',
+ 'ModelCollectionSettingsLending' => 'Los elementos se pueden prestar',
+ 'ModelCollectionSettingsTagging' => 'Los elementos se pueden etiquetar',
+ 'ModelFilterActivated' => 'Debe aparecer en la caja de búsqueda',
+ 'ModelFilterComparison' => 'Comparación',
+ 'ModelFilterContain' => 'Contiene',
+ 'ModelFilterDoesNotContain' => 'No contiene',
+ 'ModelFilterRegexp' => 'Expresión regular',
+ 'ModelFilterRange' => 'Rango',
+ 'ModelFilterNumeric' => 'Comparación numérica',
+ 'ModelFilterQuick' => 'Crear un filtro rápido',
+ 'ModelTooltipName' => 'Usar un nombre para reutilizar este modelo para otras colecciones. Si lo deja vacío, las preferencias se guardatán en la propia colección',
+ 'ModelTooltipLabel' => 'El nombre del campo como será mostrado',
+ 'ModelTooltipGroup' => 'Usado para agrupar los campos. Los elementos sin calor aparecerán en el grupo por defecto',
+ 'ModelTooltipHistory' => '¿Deberían almacenarse los valores introducidos anteriormente en una lista asociada al campo?',
+ 'ModelTooltipFormat' => 'El formato se usa para determinar la acción para abrir el fichero al pulsar el botón de Reproducir',
+ 'ModelTooltipLending' => 'Se añadirán algunos campos para administrar los préstamos',
+ 'ModelTooltipTagging' => 'Se añadirán algunos campos para administrar las etiquetas',
+ 'ModelTooltipNumeric' => '¿Se deberían considerar los valores como números para las comparaciones?',
+ 'ModelTooltipQuick' => 'Esto añadirá un submenu dentro del menu de Filtros',
+
+ 'ResultsTitle' => 'Elija {lowercaseU1}', # Accepts model codes
+ 'ResultsNextTip' => 'Buscar en el siguiente sitio',
+ 'ResultsPreview' => 'Previsualizar',
+ 'ResultsInfo' => 'Puedes añadir varios elementos a la colección presionando Control ó Mayúsculas y seleccionándolos', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferencias',
+ 'OptionsExpertMode' => 'Modo experto',
+ 'OptionsPrograms' => 'Especifíque que aplicaciones usar para cada tipo de medio, o déjelos en blanco para usar los predeterminados del sistema',
+ 'OptionsBrowser' => 'Navegador de Internet',
+ 'OptionsPlayer' => 'Reproductor de video',
+ 'OptionsAudio' => 'Reproductor de audio',
+ 'OptionsImageEditor' => 'Editor de imágenes',
+ 'OptionsCdDevice' => 'Dispositivo de CD',
+ 'OptionsImages' => 'Directorio de imágenes',
+ 'OptionsUseRelativePaths' => 'Usar rutas relativas para las imágenes',
+ 'OptionsLayout' => 'Disposición',
+ 'OptionsStatus' => 'Barra de estado',
+ 'OptionsUseStars' => 'Usar estrellas para mostrar las puntuaciones',
+ 'OptionsWarning' => 'Cuidado : Los cambios efectuados en este pestaña no se tendrán en cuenta hasta reiniciar la aplicación',
+ 'OptionsRemoveConfirm' => 'Pedir confirmación antes de eliminar',
+ 'OptionsAutoSave' => 'Protección automática de la lista de películas',
+ 'OptionsAutoLoad' => 'Cargar la colección anterior en el inicio',
+ 'OptionsSplash' => 'Mostrar la pantalla de arranque',
+ 'OptionsTearoffMenus' => 'Activar menus desprendibles',
+ 'OptionsSpellCheck' => 'Usar corrector de ortografía en los campos de texto largos',
+ 'OptionsProgramTitle' => 'Elija el programa que debe utilizarse',
+ 'OptionsPlugins' => 'Sitio para descargar las fichas',
+ 'OptionsAskPlugins' => 'Preguntar',
+ 'OptionsPluginsMulti' => 'Varios sitios',
+ 'OptionsPluginsMultiAsk' => 'Preguntar (Algunos sitios)',
+ 'OptionsPluginsMultiPerField' => 'Varios sitios (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Definir la lista',
+ 'OptionsAskImport' => 'Elegir los campos que deben importarse',
+ 'OptionsProxy' => 'Utilizar un proxy',
+ 'OptionsCookieJar' => 'Usar este fichero de cookie jar',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Idioma',
+ 'OptionsPaths' => 'Directorios',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opciones',
+ 'OptionsDisplay' => 'Visualización',
+ 'OptionsToolbar' => 'Barra de herramientas',
+ 'OptionsToolbars' => {0 => 'Ninguna', 1 => 'Pequeña', 2 => 'Grande', 3 => 'Predeterminado del sistema'},
+ 'OptionsToolbarPosition' => 'Posición',
+ 'OptionsToolbarPositions' => {0 => 'Arriba', 1 => 'Abajo', 2 => 'Izquierda', 3 => 'Derecha'},
+ 'OptionsExpandersMode' => 'Extensores demasiado largos',
+ 'OptionsExpandersModes' => {'asis' => 'No hacer nada', 'cut' => 'Cortar', 'wrap' => 'Dividir las lineas'},
+ 'OptionsDateFormat' => 'Formato de fecha',
+ 'OptionsDateFormatTooltip' => 'El formato usado es el mismo de strftime(3). El predeterminado es %d/%m/%Y',
+ 'OptionsView' => 'Visualización de las películas',
+ 'OptionsViews' => {0 => 'Texto', 1 => 'Imagen', 2 => 'Detallada'},
+ 'OptionsColumns' => 'Columnas',
+ 'OptionsMailer' => 'Método de envío de los correos electrónicos',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'Correo electrónico del remitente',
+ 'OptionsTransform' => 'Poner al final de los títulos los artículos',
+ 'OptionsArticles' => 'Artículos (separados por una coma)',
+ 'OptionsSearchStop' => 'El usuario puede parar las búsquedas',
+ 'OptionsBigPics' => 'Usar imágenes grandes cuando estén disponibles',
+ 'OptionsAlwaysOriginal' => 'Usar título principal como el original si no se encuentra ninguno',
+ 'OptionsRestoreAccelerators' => 'Restaurar aceleradores',
+ 'OptionsHistory' => 'Tamaño del historial',
+ 'OptionsClearHistory' => 'Limpiar el historial',
+ 'OptionsStyle' => 'Piel',
+ 'OptionsDontAsk' => 'No preguntar nunca más',
+ 'OptionsPathProgramsGroup' => 'Aplicaciones',
+ 'OptionsProgramsSystem' => 'Usar programas predefinidos del sistema',
+ 'OptionsProgramsUser' => 'Usar programas definidos por el usuario',
+ 'OptionsProgramsSet' => 'Establecer programas',
+ 'OptionsPathImagesGroup' => 'Imágenes',
+ 'OptionsInternetDataGroup' => 'Importar datos',
+ 'OptionsInternetSettingsGroup' => 'Preferencias',
+ 'OptionsDisplayInformationGroup' => 'Mostrar información',
+ 'OptionsDisplayArticlesGroup' => 'Artículos',
+ 'OptionsImagesDisplayGroup' => 'Mostrar',
+ 'OptionsImagesStyleGroup' => 'Estilo',
+ 'OptionsDetailedPreferencesGroup' => 'Preferencias',
+ 'OptionsFeaturesConveniencesGroup' => 'conveniencias',
+ 'OptionsPicturesFormat' => 'Prefijo para usar en las imágenes:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Título o nombre del elemento asociado',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% o . se reemplazará con el directorio de la colección (usar sólo al principio de la ruta)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% se reemplazará por el nombre de la colecciñón si el sufijo (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% sólo se puede usar al principio de la ruta para imágenes',
+ 'OptionsConfigureMailers' => 'Configurar programas de envío correo',
+
+ 'ImagesOptionsButton' => 'Preferencias',
+ 'ImagesOptionsTitle' => 'Preferencias para el listado de imágenes',
+ 'ImagesOptionsSelectColor' => 'Elija un color',
+ 'ImagesOptionsUseOverlays' => 'Utilizar superposición de imágenes',
+ 'ImagesOptionsBg' => 'Fondo',
+ 'ImagesOptionsBgPicture' => 'Usar una imagen de fondo',
+ 'ImagesOptionsFg'=> 'Selección',
+ 'ImagesOptionsBgTooltip' => 'Cambiar el color de fondo',
+ 'ImagesOptionsFgTooltip'=> 'Cambiar el color de la selección',
+ 'ImagesOptionsResizeImgList' => 'Cambiar automáticamente el número de columnas',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Tamaño',
+ 'ImagesOptionsSizeList' => {0 => 'Muy Pequeño', 1 => 'Pequeño', 2 => 'Mediano', 3 => 'Grande', 4 => 'Extra Grande'},
+ 'ImagesOptionsSizeTooltip' => 'Seleccione el tamaño de imagen',
+
+ 'DetailedOptionsTitle' => 'Preferencias del listado detallado',
+ 'DetailedOptionsImageSize' => 'Tamaño de la imagen',
+ 'DetailedOptionsGroupItems' => 'Agrupar elementos por',
+ 'DetailedOptionsSecondarySort' => 'Ordenar los campos por el hijo',
+ 'DetailedOptionsFields' => 'Seleccione los campos a mostrar',
+ 'DetailedOptionsGroupedFirst' => 'Mantener juntos los elementos huérfanos',
+ 'DetailedOptionsAddCount' => 'Añadir el número de elementos en las categorías',
+
+ 'ExtractButton' => 'Información',
+ 'ExtractTitle' => 'Información del Fichero de Video',
+ 'ExtractImport' => 'Usar valores',
+
+ 'FieldsListOpen' => 'Leer los campos de la lista desde un fichero',
+ 'FieldsListSave' => 'Guardar los campos de la lista a un fichero',
+ 'FieldsListError' => 'Estos campor no se pueden usar con este tipo de colección',
+ 'FieldsListIgnore' => '--- Ignorar',
+
+ 'ExportTitle' => 'Exportar el listado de películas',
+ 'ExportFilter' => 'Exportar sólo las películas mostradas',
+ 'ExportFieldsTitle' => 'Campos a exportar',
+ 'ExportFieldsTip' => 'Elija los campos a exportar',
+ 'ExportWithPictures' => 'Copiar las imágenes a un subdirectorio',
+ 'ExportSortBy' => 'Ordenar por',
+ 'ExportOrder' => 'Orden',
+
+ 'ImportListTitle' => 'Importar otro listado de películas',
+ 'ImportExportData' => 'Datos',
+ 'ImportExportFile' => 'Fichero',
+ 'ImportExportFieldsUnused' => 'Campos sin utilizar',
+ 'ImportExportFieldsUsed' => 'Campos utilizados',
+ 'ImportExportFieldsFill' => 'Todos los campos',
+ 'ImportExportFieldsClear' => 'Ningún campo',
+ 'ImportExportFieldsEmpty' => 'Debe señalar al menos un campo',
+ 'ImportExportFileEmpty' => 'Especifique un nombre para el fichero',
+ 'ImportFieldsTitle' => 'Campos a importar',
+ 'ImportFieldsTip' => 'Elija los campos a importar',
+ 'ImportNewList' => 'Crear un nuevo listado',
+ 'ImportCurrentList' => 'Añadir al listado actual',
+ 'ImportDropError' => 'Hubo un error abriendo al menos un fichero. Se recargará el listado anterior.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => '¿En qué fichero guardar?',
+ 'FileChooserDirectory' => 'Directorio',
+ 'FileChooserOpenDirectory' => 'Elija un directorio',
+ 'FileChooserOverwrite' => 'Este fichero ya existe. ¿Quiere sustituirlo?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Compacto',
+ 'PanelReadOnly' => 'Sólo Lectura',
+ 'PanelForm' => 'Pestañas',
+
+ 'PanelSearchButton' => 'Descargar',
+ 'PanelSearchTip' => 'Buscar información relativa a la película',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Pulse en la imagen para elegir otra.',
+ 'PanelImageTipView' => 'Pulse en la imagen para verla en su tamaño real...',
+ 'PanelImageTipMenu' => 'Click con el botón derecho para mas opciones.',
+ 'PanelImageTitle' => 'Seleccionar una imagen',
+ 'PanelImageNoImage' => 'Sin imagen',
+ 'PanelSelectFileTitle' => 'Seleccione un fichero',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurar predeterminado',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'De',
+ 'PanelTo' =>'Para',
+
+ 'PanelWeb' => 'Ver la ficha en Internet',
+ 'PanelWebTip' => 'Ver la ficha {lowercaseDP1} en Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Eliminar {lowercaseP1} anteriormente mencionada', # Accepts model codes
+
+ 'PanelDateSelect' => 'Cambiar la fecha',
+ 'PanelNobody' => 'Nadie',
+ 'PanelUnknown' => 'Desconocido',
+ 'PanelAdded' => 'Añadida el (fecha)',
+ 'PanelRating' => 'Nota',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Sitio',
+
+ 'PanelLending' => 'Préstamo',
+ 'PanelBorrower' => 'Prestatario',
+ 'PanelLendDate' => 'Fecha',
+ 'PanelHistory' => 'Historial',
+ 'PanelReturned' => '{1} devuelta', # Accepts model codes
+ 'PanelReturnDate' => 'Fecha de devolución',
+ 'PanelLendedYes' => 'Prestada',
+ 'PanelLendedNo' => 'Disponible',
+
+ 'PanelTags' => 'Etiquetas',
+ 'PanelFavourite' => 'Favorita',
+ 'TagsAssigned' => 'Etiquetas asignadas',
+
+ 'PanelUser' => 'Campos del usuario',
+
+ 'CheckUndef' => 'Cualquiera',
+ 'CheckYes' => 'Si',
+ 'CheckNo' => 'No',
+
+ 'ToolbarAll' => 'Ver todas',
+ 'ToolbarAllTooltip' => 'Ver todas las películas',
+ 'ToolbarGroupBy' => 'Agrupar por',
+ 'ToolbarGroupByTooltip' => 'Seleccionar el campo a usar para agrupos los elementos en la lista',
+ 'ToolbarQuickSearch' => 'Búsqueda rápida',
+ 'ToolbarQuickSearchLabel' => 'Buscar',
+ 'ToolbarQuickSearchTooltip' => 'Seleccione el campo en el que buscar. Introduzca los términos de búsqueda y pulse Enter',
+ 'ToolbarSeparator' => ' Separador',
+
+ 'PluginsTitle' => 'Buscar una película',
+ 'PluginsQuery' => 'Búsqueda',
+ 'PluginsFrame' => 'Sitio donde buscar ',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nombre',
+ 'PluginsSearchFields' => 'Campos de búsqueda',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Idioma',
+ 'PluginsUseSite' => 'Usar sitio seleccionado para futuras búsquedas',
+ 'PluginsPreferredTooltip' => 'Sitio recomendado por GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configuración de los prestatarios',
+ 'BorrowersList' => 'Prestatarios',
+ 'BorrowersName' => 'Nombre',
+ 'BorrowersEmail' => 'Correo electrónico',
+ 'BorrowersAdd' => 'Añadir',
+ 'BorrowersRemove' => 'Eliminar',
+ 'BorrowersEdit' => 'Modificar',
+ 'BorrowersTemplate' => 'Modelo de correo electrónico',
+ 'BorrowersSubject' => 'Título del correo electrónico : ',
+ 'BorrowersNotice1' => '%1 se sustituirá por el nombre del prestatario',
+ 'BorrowersNotice2' => '%2 se sustituirá por el título de la película',
+ 'BorrowersNotice3' => '%3 se sustituirá por la fecha del préstamo',
+
+ 'BorrowersImportTitle' => 'Importar información de prestatarios',
+ 'BorrowersImportType' => 'Formato del fichero:',
+ 'BorrowersImportFile' => 'Fichero:',
+
+ 'BorrowedTitle' => '{X} prestadas', # Accepts model codes
+ 'BorrowedDate' => 'Desde el',
+ 'BorrowedDisplayInPanel' => 'Mostrar {lowercase1} en la ventana principal', # Accepts model codes
+
+ 'MailTitle' => 'Enviar un correo electrónico',
+ 'MailFrom' => 'De: ',
+ 'MailTo' => 'Para: ',
+ 'MailSubject' => 'Tema: ',
+ 'MailSmtpError' => 'Problema de conexión con el servidor',
+ 'MailSendmailError' => 'Problema ejecutando sendmail',
+
+ 'SearchTooltip' => 'Buscar en todas {lowercasePX}', # Accepts model codes
+ 'SearchTitle' => 'Búsqueda de {lowercasePX}', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Campo a sustituir',
+ 'QueryReplaceOld' => 'Nombre actual',
+ 'QueryReplaceNew' => 'Nuevo nombre',
+ 'QueryReplaceLaunch' => 'Sustituir',
+
+ 'ImportWindowTitle' => 'Elegir los campos que deben importarse',
+ 'ImportViewPicture' => 'Ver la imagen',
+ 'ImportSelectAll' => 'Seleccionarlo todo',
+ 'ImportSelectNone' => 'No seleccionar nada',
+
+ 'MultiSiteTitle' => 'Sitios donde buscar',
+ 'MultiSiteUnused' => 'Módulos no usados',
+ 'MultiSiteUsed' => 'Módulos a usar',
+ 'MultiSiteLang' => 'Usar todos los módulos españoles',
+ 'MultiSiteEmptyError' => 'La lista de sitios está vacía',
+ 'MultiSiteClear' => 'Vaciar la lista',
+
+ 'DisplayOptionsTitle' => 'Elementos a mostrar',
+ 'DisplayOptionsAll' => 'Seleccionarlo todo',
+ 'DisplayOptionsSearch' => 'Buscar',
+
+ 'GenresTitle' => 'Conversión de Géneros',
+ 'GenresCategoryName' => 'Género a usar',
+ 'GenresCategoryMembers' => 'Géneros a reemplazar',
+ 'GenresLoad' => 'Cargar una lista predefinida',
+ 'GenresExport' => 'Exportar listado a un fichero',
+ 'GenresModify' => 'Editar conversión',
+
+ 'PropertiesName' => 'Nombre de la colección',
+ 'PropertiesLang' => 'Código de idioma',
+ 'PropertiesOwner' => 'Dueño',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Descripción',
+ 'PropertiesFile' => 'Información del fichero',
+ 'PropertiesFilePath' => 'Ruta completa',
+ 'PropertiesItemsNumber' => 'Número de {lowercaseX}', # Accepts model codes
+ 'PropertiesFileSize' => 'Tamaño',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propiedades de la colección',
+ 'PropertiesDefaultPicture' => 'Imagen predeterminada',
+
+ 'MailProgramsTitle' => 'Programas para enviar correos',
+ 'MailProgramsName' => 'Nombre',
+ 'MailProgramsCommand' => 'Linea de comandos',
+ 'MailProgramsRestore' => 'Usar predeterminados',
+ 'MailProgramsAdd' => 'Añadir un programa',
+ 'MailProgramsInstructions' => 'En la linea de comandos se hacen algunas sustituciones:
+ %f se sustituirá por la dirección de e-mail del usuario.
+ %t se sustituirá por la dirección del destinatario.
+ %s se sustituirá por el asunto del mensaje.
+ %b se sustituirá por el cuerpo del mensaje.',
+
+ 'BookmarksBookmarks' => 'Marcadores',
+ 'BookmarksFolder' => 'Directorio',
+ 'BookmarksLabel' => 'Etiqueta',
+ 'BookmarksPath' => 'Ruta',
+ 'BookmarksNewFolder' => 'Nueva carpeta',
+
+ 'AdvancedSearchType' => 'Tipo de búsqueda',
+ 'AdvancedSearchTypeAnd' => '{X} que cumplan todos los criterios', # Accepts model codes
+ 'AdvancedSearchTypeOr' => '{X} que cunplan al menos un criterio', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Critero',
+ 'AdvancedSearchAnyField' => 'Cualquier campo',
+ 'AdvancedSearchSaveTitle' => 'Guardar búsqueda',
+ 'AdvancedSearchSaveName' => 'Nombre',
+ 'AdvancedSearchSaveOverwrite' => 'Ya esixte una búsqueda guardada con el mismo nombre. Por favor, use uno diferente.',
+ 'AdvancedSearchUseCase' => 'Sensible a mayúsculas',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignorar acentos y otros diacríticos',
+
+ 'BugReportSubject' => 'Informe de error generado por GCstar',
+ 'BugReportVersion' => 'Versión',
+ 'BugReportPlatform' => 'Sistema operativo',
+ 'BugReportMessage' => 'Mensaje de error',
+ 'BugReportInformation' => 'Información adicional',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..cc127ca
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::FR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inclure les noms des champs au début',
+ 'Separator' => 'Séparateur',
+ 'Replacement' => 'Remplacer le séparateur par',
+ 'Charset' => 'Codage',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..5047880
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::FR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Disque externe',
+ 'ZipAll' => 'Tout compresser dans un fichier (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..2a0dc7d
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::FR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ficher de modèle invalide',
+ 'UseFile' => 'Utiliser le fichier ci-dessous',
+ 'TemplateExternalFile' => 'Fichier avec le modèle',
+ 'WithJS' => 'Utiliser du Javascript',
+ 'FileTemplate' => 'Modèle',
+ 'Preview' => 'Aperçu',
+ 'NoPreview' => 'Aucun aperçu disponible',
+ 'Title' => 'Titre de la page',
+ 'InfoFile' => 'La liste se trouve dans le fichier : ',
+ 'InfoDir' => 'Les images se trouvent dans : ',
+ 'HeightImg' => 'Hauteur en pixels des images',
+ 'OpenFileInBrowser' => 'Ouvrir le fichier généré dans le navigateur web',
+ 'Note' => 'Liste générée avec <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Entrez le texte à rechercher',
+ 'SearchType1' => 'Titre seulement',
+ 'SearchType2' => 'Toutes les informations',
+ 'SearchButton' => 'Rechercher',
+ 'SearchTitle' => 'Afficher seulement les films correspondant aux critères précédents',
+ 'AllButton' => 'Tous',
+ 'AllTitle' => 'Afficher tous les films',
+ 'Expand' => 'Tout développer',
+ 'ExpandTitle' => 'Afficher les informations de tous les films',
+ 'Collapse' => 'Tout réduire',
+ 'CollapseTitle' => 'Masquer les informations de tous les films',
+ 'Borrowed' => 'Emprunté par : ',
+ 'NotBorrowed' => 'Disponible',
+ 'Top' => 'Haut',
+ 'Bottom' => 'Bas',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..3bd6b81
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::FR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Nom de la base de données',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..c8778d7
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::FR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inclure une instruction DROP',
+ 'WithCreate' => 'Inclure une instruction CREATE',
+ 'TableName' => 'Nom de la table',
+ 'InfoFile' => 'Fichier SQL : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..9ea6b9a
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::FR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'L\'archive se trouve dans le fichier : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..1bf56db
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::FR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fichier modèle',
+ 'ModelText' => 'Texte du modèle',
+ 'Models' => 'Modèle à utiliser',
+ 'UseFile' => 'Spécifié dans un fichier',
+ 'UseModel' => 'Spécifié dans la zone texte',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..41971e8
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::FR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Où rechercher :',
+ 'Default' => 'Répertoire par défaut Alexandria',
+ 'Specified' => 'Répertoire indiqué ci-dessous',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..f1d3f5d
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::FR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Codage',
+ 'Header' => 'Ignorer la première ligne',
+ 'Separator' => 'Séparateur',
+ 'Plugin' => 'Site à utiliser',
+ 'UseFirst' => 'Choisir le 1er si plusieurs résultats',
+ 'SearchField' => 'Chercher en utilisant',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..9c0ffc4
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::FR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Répertoire',
+ 'Recursive' => 'Parcourir les sous-répertoires',
+ 'Suffixes' => 'Suffixes ou extensions des fichiers',
+ 'SuffixesTooltip' => 'Une liste séparée par des virgules des suffixes ou extensions des fichiers à considérer',
+ 'Remove' => 'A supprimer des noms',
+ 'RemoveTooltip' => 'Une liste séparée par des virgules des mots à supprimer des noms de fichiers pour créer le nom à rechercher',
+ 'MultipleResult'=> 'Résultats multiples',
+ 'MultipleResultTooltip'=> 'Que faire si la recherche retourne plus d\'un résultat',
+ 'Ask'=> 'Demander',
+ 'AskEnd'=> 'Demander à la fin',
+ 'AddWithoutInfo'=> 'Ajouter sans informations',
+ 'DontAdd'=> 'Ne pas ajouter',
+ 'TakeFirst' => 'Choisir le premier',
+ 'NoResult'=> 'Pas de résultat',
+ 'NoResultTooltip'=> 'Que faire si la recherche ne retourne aucun résultat',
+ 'RemoveWholeWord' => 'Retirer seulement les mots entiers',
+ 'RemoveTooltipWholeWord' => 'Ne retire que des mots entiers du nom de fichier',
+ 'RemoveRegularExpr' => 'Expression regulière',
+ 'RemoveTooltipRegularExpr' => 'Considere \'A supprimer des noms\' comme une expression regulière perl',
+ 'SkipFileAlreadyInCollection' => 'N\'ajouter que les nouveaux fichiers',
+ 'SkipFileAlreadyInCollectionTooltip' => 'N\'ajouter que les nouveaux fichiers à collection',
+ 'SkipFileNo' => 'Non',
+ 'SkipFileFullPath' => 'd\'après le chemin complet',
+ 'SkipFileFileName' => 'd\'après le nom de fichier',
+ 'SkipFileFileNameAndUpdate' => 'd\'après le nom de fichier (et mettre à jour le chemin des présents)',
+ 'InfoFromFileNameRegExp' => 'Parser nom du fichier avec cette expression régulière',
+ 'InfoFromFileNameRegExpTooltip' => 'Recupère des informations du nom de fichier (appliqué après avoir enlevé l\'extention).\nLaisser vide si inutile.\nChamps reconnus : \n$T:Titre, $A:Titre Alphabetisé, $Y:Année de sortie, $S:Saison, $E:Episode, $N:Nom de série alphabetisé, $x:numero de partie, $y:nombre total de parties',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..6067ec8
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::FR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copier les images',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..2ecce7f
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::FR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Liste de noms',
+ 'Plugin' => 'Site à utiliser',
+ 'UseFirst' => 'Choisir le 1er si plusieurs résultats',
+ 'CommentAuto' => 'Film importé automatiquement.',
+ 'CommentSite' => 'Site web : ',
+ 'CommentTitle' => 'Titre : ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..ed0a90c
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::FR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lecteur de codes barres',
+ 'Type' => 'Type de lecteur',
+ 'Local' => 'Local (reconnu comme un clavier)',
+ 'Network' => 'Réseau (ex : GCstar Scanner sur Android)',
+ 'Port' => 'Port à écouter',
+ 'Plugin' => 'Site à utiliser',
+ 'UseFirst' => 'Choisir le 1er si plusieurs résultats',
+ 'Waiting' => 'En attente de code barre',
+ 'EAN' => 'Code barre',
+ 'ScanPrompt' => 'Scannez un article ou pressez sur Terminer',
+ 'ScanOtherPrompt' => 'Scannez un autre article ou pressez sur Terminer',
+ 'Previous' => '"%s" va être ajouté',
+ 'NothingFound' => 'Rien n\'a été trouvé pour "%s". Un élément vide va être ajouté.',
+ 'Terminate' => 'Terminer',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..d0e33bb
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::FR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Le fichier n\'est pas un type de catalogue Tellico supporté',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..353ad6d
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,60 @@
+{
+ package GCLang::FR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection d\'épisodes de séries TV',
+ Items => {0 => 'Épisode',
+ 1 => 'Épisode',
+ X => 'Épisodes',
+ I1 => 'Un épisode',
+ D1 => 'L\'épisode',
+ DX => 'Les épisodes',
+ DD1 => 'De l\'épisode',
+ M1 => 'Cet épisode',
+ C1 => ' épisode',
+ DA1 => '\'épisode',
+ DAX => '\'épisodes'},
+ NewItem => 'Nouvel épisode',
+ NewSeries => 'Nouvelle série',
+ Episode => 'Épisode',
+
+ General => 'Fiche de l\'épisode',
+ Writer => 'Scénariste',
+ Seen => 'Épisode déjà vu',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..28c37c0
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCTVseries.pm
@@ -0,0 +1,60 @@
+{
+ package GCLang::FR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de séries TV',
+ Items => {0 => 'Série',
+ 1 => 'Série',
+ X => 'Séries',
+ I1 => 'Une série',
+ D1 => 'La série',
+ DX => 'Les séries',
+ DD1 => 'De la série',
+ M1 => 'Cette série',
+ C1 => 'e série',
+ DA1 => 'e série',
+ DAX => 'e séries'},
+ NewItem => 'Nouvelle série',
+ Name => 'Nom',
+ Season => 'Saison',
+ Part => 'Partie',
+ Episodes => 'Épisodes',
+ FirstAired => 'Première diffusion',
+ Time => 'Durée épisode',
+ Producer => 'Producteur',
+ Music => 'Musique',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..63e27bc
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCboardgames.pm
@@ -0,0 +1,94 @@
+{
+ package GCLang::FR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de jeux de société',
+ Items => {0 => 'Jeu',
+ 1 => 'Jeu',
+ X => 'Jeux',
+ I1 => 'Un jeu',
+ D1 => 'Le jeu',
+ DX => 'Les jeux',
+ DD1 => 'Du jeu',
+ M1 => 'Ce jeu',
+ C1 => ' jeu',
+ DA1 => 'e jeu',
+ DAX => 'e jeux'},
+ NewItem => 'Nouveau jeu',
+
+ Id => 'Id',
+ Name => 'Nom',
+ Original => 'Nom original',
+ Box => 'Image de la boîte',
+ DesignedBy => 'Auteur(s)',
+ PublishedBy => 'Éditeur',
+ Players => 'Nombre de joueurs',
+ PlayingTime => 'Durée d\'une partie',
+ SuggestedAge => 'Age suggéré',
+ Released => 'Date de sortie',
+ Description => 'Description',
+ Category => 'Thème(s)',
+ Mechanics => 'Mécanisme(s)',
+ ExpandedBy => 'Extension(s) existante(s)',
+ ExpansionFor => 'Extension de',
+ GameFamily => 'Famille du jeu',
+ IllustratedBy => 'Illustrateur(s)',
+ Url => 'Page web',
+ TimesPlayed => 'Nombre de parties jouées',
+ CompleteContents => 'Contenu complet',
+ Copies => 'Nombre d\'exemplaire(s)',
+ Condition => 'État',
+ Photos => 'Images',
+ Photo1 => 'Première image',
+ Photo2 => 'Deuxième image',
+ Photo3 => 'Troisième image',
+ Photo4 => 'Quatrième image',
+ Comments => 'Commentaires',
+
+ Perfect => 'Parfait',
+ Good => 'Bon',
+ Average => 'Moyen',
+ Poor => 'Mauvais',
+
+ CompleteYes => 'Contenu complet',
+ CompleteNo => 'Pièces manquantes',
+
+ General => 'Général',
+ Details => 'Détails',
+ Personal => 'Personnel',
+ Information => 'Informations',
+
+ FilterRatingSelect => '_Notes au moins égales à...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/FR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..33515c7
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCbooks.pm
@@ -0,0 +1,78 @@
+{
+ package GCLang::FR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de livres',
+ Items => {0 => 'Livre',
+ 1 => 'Livre',
+ X => 'Livres',
+ I1 => 'Un livre',
+ D1 => 'Le livre',
+ DX => 'Les livres',
+ DD1 => 'Du livre',
+ M1 => 'Ce livre',
+ C1 => ' livre',
+ DA1 => 'e livre',
+ DAX => 'e livres'},
+ NewItem => 'Nouveau livre',
+
+ Isbn => 'ISBN',
+ Title => 'Titre',
+ Cover => 'Couverture',
+ Authors => 'Auteurs',
+ Publisher => 'Editeur',
+ Publication => 'Date de publication',
+ Language => 'Langue',
+ Genre => 'Genres',
+ Serie => 'Série',
+ Rank => 'Rang',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Lu',
+ Acquisition => 'Date d\'acquisition',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Commentaires',
+ Url => 'Page web',
+ Translator => 'Traducteur',
+ Artist => 'Artiste',
+ DigitalFile => 'Digital version',
+
+ General => 'Fiche',
+ Details => 'Détails',
+
+ ReadNo => 'Non lu',
+ ReadYes => 'Lu',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/FR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..836318a
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCcoins.pm
@@ -0,0 +1,112 @@
+{
+ package GCLang::FR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection numismatique',
+ Items => {0 => 'Pièce',
+ 1 => 'Pièce',
+ X => 'Pièces',
+ I1 => 'Une pièce',
+ D1 => 'La pièce',
+ DX => 'Les pièces',
+ DD1 => 'De la pièce',
+ M1 => 'Cette pièces',
+ C1 => 'e pièce',
+ DA1 => 'e pièce',
+ DAX => 'e pièces'},
+ NewItem => 'Nouvelle pièce',
+
+ Name => 'Nom de la pièce',
+ Country => 'Pays',
+ Year => 'Année',
+ Currency => 'Devise',
+ Value => 'Valeur',
+ Picture => 'Image principale',
+ Diameter => 'Diamètre (mm)',
+ Metal => 'Métal',
+ Edge => 'Tranche',
+ Edge1 => 'Tranche 1',
+ Edge2 => 'Tranche 2',
+ Edge3 => 'Tranche 3',
+ Edge4 => 'Tranche 4',
+ Head => 'Avers',
+ Tail => 'Revers',
+ Comments => 'Commentaire',
+ History => 'Historique',
+ Website => 'Site web',
+ Estimate => 'Estimation (€)',
+ References => 'Références',
+ Type => 'Type',
+ Coin => 'Pièce',
+ Banknote => 'Billet',
+
+ Main => 'Principal',
+ Description => 'Description',
+ Other => 'Infos complémentaires',
+ Pictures => 'Photos',
+
+ Condition => 'Conservation',
+ Grade1 => 'AB-1',
+ Grade2 => 'AB-2',
+ Grade3 => 'AB-3',
+ Grade4 => 'B-4',
+ Grade6 => 'B-6',
+ Grade8 => 'B-8',
+ Grade10 => 'B-10',
+ Grade12 => 'B-12',
+ Grade15 => 'B-15',
+ Grade20 => 'TB-20',
+ Grade25 => 'TB-25',
+ Grade30 => 'TB-30',
+ Grade35 => 'TB-35',
+ Grade40 => 'TTB-40',
+ Grade45 => 'TTB-45',
+ Grade50 => 'TTB-50',
+ Grade53 => 'TTB-53',
+ Grade55 => 'SUP-55',
+ Grade58 => 'SUP-58',
+ Grade60 => 'SPL-60',
+ Grade61 => 'SPL-61',
+ Grade62 => 'SPL-62',
+ Grade63 => 'SPL-63',
+ Grade64 => 'SPL-64',
+ Grade65 => 'SPL-65',
+ Grade66 => 'SPL-66',
+ Grade67 => 'SPL-67',
+ Grade68 => 'SPL-68',
+ Grade69 => 'SPL-69',
+ Grade70 => 'FDC-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/FR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..ae8d501
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCcomics.pm
@@ -0,0 +1,81 @@
+{
+ package GCLang::FR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de Bandes Dessinées',
+ Items => {0 => 'Bandes Dessinées',
+ 1 => 'Bande Dessinée',
+ X => 'Bandes Dessinées',
+ I1 => 'Une bande dessinée',
+ D1 => 'La bande dessinée',
+ DX => 'Les bandes dessinées',
+ DD1 => 'De la bande dessinée',
+ M1 => 'Cette bande dessinée',
+ C1 => 'e bande dessinée',
+ DA1 => 'e bande dessinée',
+ DAX => 'e bandes dessinées'},
+ NewItem => 'Nouvelle BD',
+
+
+ Id => 'Id',
+ Name => 'Nom',
+ Series => 'Série',
+ Volume => 'Tome',
+ Title => 'Titre',
+ Writer => 'Scénariste',
+ Illustrator => 'Dessinateur',
+ Colourist => 'Coloriste',
+ Publisher => 'Editeur',
+ Synopsis => 'Résumé',
+ Collection => 'Collection',
+ PublishDate => 'Dépot Légal',
+ PrintingDate => 'Date d\'impression',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Catégorie',
+ Format => 'Format',
+ NumberBoards => 'Nombre de planches',
+ Signing => 'Dédicace',
+ Cost => 'Cote',
+ Rating => 'Note',
+ Comment => 'Commentaires',
+ Url => 'Page Web',
+
+ FilterRatingSelect => 'Notes au _moins egales à...',
+
+ Main => 'Principaux éléments',
+ General => 'Général',
+ Details => 'Détails',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/FR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..607b48e
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCfilms.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::FR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de films',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Films',
+ I1 => 'Un film',
+ D1 => 'Le film',
+ DX => 'Les films',
+ DD1 => 'Du film',
+ M1 => 'Ce film',
+ C1 => ' film',
+ DA1 => 'e film',
+ DAX => 'e films'},
+ NewItem => 'Nouveau film',
+
+
+ Id => 'Id',
+ Title => 'Titre',
+ Date => 'Date de sortie',
+ Time => 'Durée',
+ Director => 'Réalisateur',
+ Country => 'Nationalité',
+ MinimumAge => 'Age minimum',
+ Genre => 'Genres',
+ Image => 'Image',
+ Original => 'Titre original',
+ Actors => 'Acteurs',
+ Actor => 'Acteur',
+ Role => 'Rôle',
+ Comment => 'Commentaires',
+ Synopsis => 'Synopsis',
+ Seen => 'Film déjà vu',
+ Number => 'Nombre',
+ Format => 'Format',
+ Region => 'Région',
+ Identifier => 'Identifiant',
+ Url => 'Page web',
+ Audio => 'Audio',
+ Video => 'Format vidéo',
+ Trailer => 'Fichier vidéo',
+ Serie => 'Série',
+ Rank => 'Rang',
+ Subtitles => 'Sous-titres',
+
+ SeenYes => 'Vu',
+ SeenNo => 'Non vu',
+
+ AgeUnrated => 'Inconnu',
+ AgeAll => 'Aucune restriction',
+ AgeParent => 'Accord parental',
+
+ Main => 'Principaux éléments',
+ General => 'Fiche du film',
+ Details => 'Détails',
+
+ Information => 'Informations',
+ Languages => 'Langues',
+ Encoding => 'Encodage',
+
+ FilterAudienceAge => 'Age du public',
+ FilterSeenNo => 'Films _non vus',
+ FilterSeenYes => 'Films _déjà vus',
+ FilterRatingSelect => 'Notes au moins égales à...',
+
+ ExtractSize => 'Dimensions',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCgames.pm b/lib/gcstar/GCLang/FR/GCModels/GCgames.pm
new file mode 100644
index 0000000..87358cc
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCgames.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::FR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de jeux vidéo',
+ #Items => 'Jeux',
+ Items => {0 => 'Jeu',
+ 1 => 'Jeu',
+ X => 'Jeux',
+ I1 => 'Un jeu',
+ D1 => 'Le jeu',
+ DX => 'Les jeux',
+ DD1 => 'Du jeu',
+ M1 => 'Ce jeu',
+ C1 => ' jeu',
+ DA1 => 'e jeu',
+ DAX => 'e jeux'},
+ NewItem => 'Nouveau jeu',
+
+ Id => 'Identifiant',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plate-forme',
+ Players => 'Nombre de joueurs',
+ Released => 'Date de sortie',
+ Editor => 'Editeur',
+ Developer => 'Développeur',
+ Genre => 'Genre',
+ Box => 'Boîtier',
+ BoxBack => 'Arrière',
+ Case => 'Boîte',
+ Manual => 'Notice',
+ Completion => 'Avancement (%)',
+ Executable => 'Exécutable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effet',
+ Secrets => 'Secrets',
+ Screenshots => 'Captures',
+ Screenshot1 => '1ère capture',
+ Screenshot2 => '2ème capture',
+ Comments => 'Commentaires',
+ Url => 'Page Web',
+ Unlockables => 'Déblocables',
+ Unlockable => 'Déblocable',
+ Howto => 'Comment débloquer',
+ Exclusive => 'Exclusivité',
+ Resolutions => 'Résolutions',
+ InstallationSize => 'Taille',
+ Region => 'Région',
+ SerialNumber => 'Numéro de série',
+
+ General => 'Général',
+ Details => 'Détails',
+ Tips => 'Astuces',
+ Information => 'Informations',
+
+ FilterRatingSelect => 'Notes au moins égales à...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..53a386a
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCgeneric.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::FR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Élément',
+ 1 => 'Élément',
+ X => 'Éléments',
+ I1 => 'Un élément',
+ D1 => 'L\'élément',
+ DX => 'Les éléments',
+ DD1 => 'De l\'élément',
+ M1 => 'Cet élément',
+ C1 => ' élément',
+ DA1 => '\'élément',
+ DAX => '\'éléments',
+ },
+ NewItem => 'Nouvel élément',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/FR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..120ac81
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCminicars.pm
@@ -0,0 +1,190 @@
+{
+ package GCLang::FR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de Véhicules Miniatures',
+ Items => {0 => 'Miniature',
+ 1 => 'Miniature',
+ X => 'Miniatures',
+ I1 => 'Une miniature',
+ D1 => 'La miniature',
+ DX => 'Les miniatures',
+ DD1 => 'De la miniature',
+ M1 => 'Cette miniature',
+ C1 => 'e miniature',
+ DA1 => 'e miniature',
+ DAX => 'e miniatures'},
+ NewItem => 'Nouvelle Miniature',
+ Currency => 'Devise',
+
+ Help => 'Aide sur les Champs à Remplir',
+ Help1 => 'Aide',
+
+# Traduction des Champs "Main"
+
+ Main => 'La Miniature en Bref ',
+
+ Name => 'Nom de la Miniature',
+ Exchange => 'Miniature à Échanger ou à Vendre',
+ Wanted => 'Miniature Recherchée',
+ Rating1 => 'Note Globale',
+ Picture1 => 'Image Principale',
+ Scale => 'Échelle',
+ Manufacturer => 'Fabricant',
+ Constructor => 'Constructeur',
+ Type1 => 'Type',
+ Modele => 'Modèle',
+ Version => 'Version',
+ Color => 'Couleur du Modèle',
+ Pub => 'Publicité',
+ Year => 'Année',
+ Reference => 'Référence',
+ Kit => 'Miniature en Kit',
+ Transformation => 'Transformation Personnelle',
+ Comments1 => 'Commentaire',
+
+# Traduction des Champs "Details"
+
+ Details => 'La Miniature en Détails ',
+ MiscCharacteristics => 'Caractéristiques Diverses de la Miniature',
+ Material => 'Matériaux',
+ Molding => 'Type du Moule',
+ Condition => 'État du Modèle',
+ Edition => 'Édition',
+ Collectiontype => 'Nom de la Collection',
+ Serial => 'Série',
+ Serialnumber => 'Numéro de Série',
+ Designed => 'Conçu en',
+ Madein => 'Fabriqué en',
+ Box1 => 'Type de Boîte',
+ Box2 => 'Descriptif de la Boîte',
+ Containbox => 'Contenu de la Boîte (ou Coffret)',
+ Rating2 => 'Réalisme',
+ Rating3 => 'Qualité de Finition',
+ Acquisition => 'Date d\'Acquisition',
+ Location => 'Lieu d\'Acquisition',
+ Buyprice => 'Prix d\'Acquisition (€)',
+ Estimate => 'Estimation (€)',
+ Comments2 => 'Commentaire',
+ Decorationset => 'Diorama',
+ Characters => 'Personnages',
+ CarFromFilm => 'Véhicule de film',
+ Filmcar => 'Film Associé à la Voiture',
+ Filmpart => 'Épisode du Film / Titre',
+ Parts => 'Nombre de Pièces',
+ VehiculeDetails => 'Détails du Véhicule',
+ Detailsparts => 'Pièces de Détaillages',
+ Detailsdecorations => 'Types de Décorations',
+ Decorations => 'Nombre de Décorations',
+ Lwh => 'Longueur / Largeur / Hauteur (cm)',
+ Weight => 'Poids (g)',
+ Framecar => 'Châssis',
+ Bodycar => 'Carrosserie',
+ Colormirror => 'Couleur du Modèle',
+ Interior => 'Intérieur du Modèle',
+ Wheels => 'Roues / Jantes / Essieux',
+ Registrationnumber1 => 'Plaque d\'Immatriculation Avant',
+ Registrationnumber2 => 'Plaque d\'Immatriculation Arrière',
+ RacingCar => 'Véhicules de Course (Rallye,F1,DTM..)',
+ Course => 'Course',
+ Courselocation => 'Lieu de la Course',
+ Courseyear => 'Date de la Course',
+ Team => 'Équipe (Écurie)',
+ Pilots => 'Pilote(s)',
+ Copilots => 'Co Pilote(s)',
+ Carnumber => 'Numéro de la Voiture',
+ Pub2 => 'Publicitaires',
+ Finishline => 'Place à l\'Arrivée',
+ Steeringwheel => 'Position du volant',
+
+
+# Traduction des Champs "Catalogs"
+
+ Catalogs => 'La Miniature Cataloguée ',
+
+ OfficialPicture => 'Photo Officielle de la Miniature',
+ Barcode => 'Code à Barres',
+ Referencemirror => 'Référence',
+ Year3 => 'Date de Sortie',
+ CatalogCoverPicture => 'Couverture',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Année du Catalogue / Fascicule',
+ Catalogedition => 'Édition du Catalogue',
+ Catalogpage => 'Page du Catalogue',
+ Catalogprice => 'Prix Catalogue / Librairie (€)',
+ Personalref => 'Référence Personnelle',
+ Websitem => 'Site Web Fabricant',
+ Websitec => 'Site Web Constructeur',
+ Websiteo => 'Lien Utile',
+ Comments3 => 'Commentaire',
+
+# Traduction des Champs "Pictures"
+
+ Pictures => 'La Miniature en Photos ',
+
+ OthersComments => 'Remarques Diverses',
+ OthersDetails => 'Autres Détails',
+ Top1 => 'Dessus',
+ Back1 => 'Dessous',
+ AVG => 'Avant Gauche',
+ AV => 'Face Avant',
+ AVD => 'Avant Droit',
+ G => 'Profil Gauche',
+ BOX => 'Boîte',
+ D => 'Profil Droit',
+ ARG => 'Arrière Gauche',
+ AR => 'Face Arrière',
+ ARD => 'Arrière Droit',
+
+
+ Others => 'Divers',
+
+# Traduction des Champs "PanelLending"
+
+ LendingExplanation => 'Permet de faire des échanges pour les expositions temporaires',
+ PanelLending => 'Emprunts (Pour Expositions) ',
+ Comments4 => 'Commentaire',
+
+# Traduction des Champs "Realmodel"
+
+ Realmodel => 'Le Modèle Réel ',
+
+ Difference => 'Différences avec la Miniature',
+ Front2 => 'Avant',
+ Back2 => 'Arrière',
+ Comments5 => 'Commentaire',
+
+ References => 'Références',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/FR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..3319d93
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCmusics.pm
@@ -0,0 +1,76 @@
+{
+ package GCLang::FR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection musicale',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albums',
+ I1 => 'Un album',
+ D1 => 'L\'album',
+ DX => 'Les albums',
+ DD1 => 'De l\'album',
+ M1 => 'Cet album',
+ C1 => ' album',
+ DA1 => '\'album',
+ DAX => '\'albums'},
+ NewItem => 'Nouvel album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titre',
+ Cover => 'Pochette',
+ Artist => 'Artiste',
+ Format => 'Format',
+ Running => 'Durée',
+ Release => 'Date de sortie',
+ Genre => 'Genre',
+ Origin => 'Origine',
+
+#For tracks list
+ Tracks => 'Pistes',
+ Number => 'Numéro',
+ Track => 'Titre',
+ Time => 'Durée',
+
+ Composer => 'Compositeur',
+ Producer => 'Producteur',
+ Playlist => 'Liste de lecture',
+ Comments => 'Commentaires',
+ Label => 'Label',
+ Url => 'Page web',
+
+ General => 'Géneral',
+ Details => 'Détails',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..f03001e
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCperiodicals.pm
@@ -0,0 +1,60 @@
+{
+ package GCLang::FR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de périodiques / magazines',
+ Items => {0 => 'Périodique',
+ 1 => 'Périodique',
+ X => 'Périodique',
+ I1 => 'Un périodique',
+ D1 => 'Le périodique',
+ DX => 'Les périodiques',
+ DD1 => 'Du périodique',
+ M1 => 'Ce périodique',
+ C1 => ' périodique',
+ DA1 => 'e périodique',
+ DAX => 'e périodiques'},
+ NewItem => 'Nouveau périodique',
+
+ Title => 'Titre',
+ Cover => 'Couverture',
+ Periodical => 'Périodique',
+ Number => 'Numéro',
+ Date => 'Date',
+ Subject => 'Sujet',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..7ad1cd4
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::FR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de Cartes à Puce',
+ Items => {0 => 'Carte',
+ 1 => 'Carte',
+ X => 'Cartes'},
+ NewItem => 'Nouvelle Carte à Puce',
+ Currency => 'Devise',
+
+ Help => 'Aide sur les Champs à Remplir',
+ Help1 => 'Aide',
+
+# Traduction des Champs "Main"
+
+ Main => 'La Carte à Puce en Bref ',
+
+ Cover => 'Image',
+
+ Name => 'Nom de la Carte à Puce',
+ Exchange => 'Carte à Échanger ou à Vendre',
+ Wanted => 'Carte Recherchée',
+ Rating1 => 'Qualité Globale',
+ TheSmartCard => 'La Carte à Puce Recto / Verso',
+
+ Country => 'Pays',
+ Color => 'Couleur de la Carte',
+ Type1 => 'Type de Carte',
+ Type2 => 'Type de Puce',
+ Dimension => 'Longueur / Largeur / Épaisseur (cm)',
+
+ Box => 'Emballage',
+ Chip => 'Puce',
+ Year1 => 'Date d\'Edition',
+ Year2 => 'Date de Validité',
+ Condition => 'Carte Neuve',
+ Charge => 'Carte Rechargeable',
+ Variety => 'Variété',
+
+ Edition => 'Tirage (Exemplaires)',
+ Serial => 'Numéro de Série',
+ Theme => 'Thème',
+
+ Acquisition => 'Carte Acquise le',
+
+ Catalog0 => 'Catalogue',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Référence',
+ Reference1 => 'Référence Phonecote / Infopuce (YT)',
+ Reference2 => 'Référence La Cote en Poche',
+ Reference3 => 'Référence Autre',
+
+ Quotationnew00 => 'Cotation Carte Neuve (en €)',
+ Quotationnew10 => 'Cotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Cotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Cotation Carte Utilisée (en €)',
+ Quotationold10 => 'Cotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Cotation La Cote en Poche',
+ Quotationold30 => 'Cotation Autre',
+
+ Title1 => 'Titre',
+
+ Unit => 'Nombre d\'Unités / Minutes',
+
+ Pressed => 'Type d\'Impression',
+ Location => 'Lieu d\'Impression',
+
+ Comments1 => 'Observations',
+
+ Others => 'Divers',
+ Weight => 'Poids',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..c1e2568
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::FR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de logiciels',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'Nouvelle application',
+
+ Id => 'Identifian',
+ Ean => 'EAN',
+ Name => 'Nom',
+ Platform => 'Plate-forme',
+ Released => 'Date de sortie',
+ Homepage => 'Site web',
+ Editor => 'Editeur',
+ Developer => 'Développeur',
+ Category => 'Catégorie',
+ NumberOfCopies => 'Copies',
+ Price => 'Prix',
+ Box => 'Photo de la boîte',
+ Case => 'Boîtier',
+ Manual => 'Notice',
+ Executable => 'Exécutable',
+ Description => 'Description',
+ License => 'Licence',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (en usage non-commercial)',
+ OtherOpenSource => 'Autre licence Open Source',
+ PublicDomain => 'Domaine public',
+ OtherLicense => 'Autre',
+ Registration => 'Enregistrement',
+ RegistrationInfo => 'Informations d\'enregistrement',
+ RegInfo => 'Informations',
+ RegistrationName => 'Nom d\'utilisateur',
+ RegistrationNumber => 'Numéro d\'enregistrement',
+ PanelRegistration => 'Informations d\'enregistrement',
+ RegistrationComments => 'Informations supplémentaires',
+ Screenshots => 'Captures d\'écran',
+ Screenshot1 => '1ère capture',
+ Screenshot2 => '2ème capture',
+ Comments => 'Commentaires',
+ Url => 'Page web',
+ General => 'Général',
+ Details => 'Détails',
+ Information => 'Informations',
+
+ FilterRatingSelect => 'Notes au moins égales à...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/FR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..0ddc193
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCstamps.pm
@@ -0,0 +1,198 @@
+{
+ package GCLang::FR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de timbres',
+ Items => {0 => 'Timbres',
+ 1 => 'Timbre',
+ X => 'Timbres',
+ I1 => 'Un timbre',
+ D1 => 'Le timbre',
+ DX => 'Les timbres',
+ DD1 => 'Du timbre',
+ M1 => 'Ce timbre',
+ C1 => ' timbre',
+ DA1 => 'e timbre',
+ DAX => 'e timbres'},
+ NewItem => 'Nouveau timbre',
+
+ General => 'Général',
+ Detail => 'Détail',
+ Value => 'Valeur',
+ Notes => 'Notes',
+ Views => 'Vues',
+
+ Name => 'Nom',
+ Country => 'Pays',
+ Year => 'Année',
+ DateIssue => 'Date d\'émission',
+ Catalog => 'Catalogue',
+ Number => 'Numéro',
+ Topic => 'Thématique',
+ Serie => 'Série',
+ Designer => 'Dessinateur',
+ Engraver => 'Graveur',
+ Type => 'Genre',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Couleur',
+ Gum => 'Gomme',
+ Paper => 'Papier',
+ Perforation => 'Dentelure',
+ PerforationSize => 'Taille de la dentelure',
+ CancellationType => 'Type d\'oblitération',
+ Comments => 'Commentaires',
+ PrintingVariety => 'Type d\'impression',
+ IssueDate => 'Date d\'émission',
+ EndOfIssue => 'Fin d\'émission',
+ Issue => 'Quantité émise',
+ Grade => 'Qualité',
+ Status => 'Statut',
+ Adjusted => 'Centrage',
+ Cancellation => 'Oblitération',
+ CancellationCondition => 'Condition d\'oblitération',
+ GumCondition => 'Etat de la gomme',
+ PerforationCondition => 'Etat de la dentelure',
+ ConditionNotes => 'Notes sur la condition',
+ Error => 'Erreur',
+ ErrorNotes => 'Notes d\'erreur',
+ FaceValue => 'Valeur faciale',
+ MintValue => 'Valeur neuve',
+ UsedValue => 'Valeur oblitérée',
+ PurchasedDate => 'Date d\'achat',
+ Quantity => 'Quantité',
+ History => 'Historique',
+ Picture1 => 'Image 1',
+ Picture2 => 'Image 2',
+ Picture3 => 'Image 3',
+
+ AirMail => 'Poste aérienne',
+ MilitaryStamp => 'Timbre de franchise militaire',
+ Official => 'Timbre de service',
+ PostageDue => 'Timbre taxe',
+ Regular => 'Timbre ordinaire',
+ Revenue => 'Timbre fiscal',
+ SpecialDelivery => 'Exprès',
+ StrikeStamp => 'Timbre de grève',
+ TelegraphStamp => 'Timbre télégraphe',
+ WarStamp => 'Timbre de guerre',
+ WarTaxStamp => 'Timbre d\'impôt de guerre',
+
+ Booklet => 'Carnet',
+ BookletPane => 'Bande de carnet',
+ Card => 'Carte',
+ Coil => 'Timbre de roulette',
+ Envelope => 'Enveloppe',
+ FirstDayCover => 'Lettre premier jour',
+ Sheet => 'Bloc feuillet',
+ Single => 'Timbre seul',
+
+ OriginalGum => 'Gomme d\'origine',
+ Ungummed => 'Non gommé',
+ Regummed => 'Regommé',
+
+ Chalky => 'Papier couché',
+ ChinaPaper => 'Papier de Chine',
+ Coarsed => 'Papier rugueux',
+ Glossy => 'Papier glacé',
+ Granite => 'Papier granite',
+ Laid => 'Papier vergé',
+ Manila => 'Papier bulle',
+ Native => 'Papier d\'origine',
+ Pelure => 'Papier pelure',
+ Quadrille => 'Papier quadrillé',
+ Ribbed => 'Papier côtelé',
+ Rice => 'Papier de riz',
+ Silk => 'Papier de soie',
+ Smoothed => 'Papier souple',
+ Thick => 'Papier épais',
+ Thin => 'Papier mince',
+ Wove => 'Papier vélin',
+
+ Heliogravure => 'Héliogravure',
+ Lithography => 'Lithographie',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Taille douce',
+ Typography => 'Typographie',
+
+ CoarsedPerforation => 'Dentelure grossière',
+ CombPerforation => 'Dentelure en peigne',
+ CompoundPerforation => 'Dentelure mixte',
+ DamagedPerforation => 'Dentelure endommagée',
+ DoublePerforation => 'Dentelure double',
+ HarrowPerforation => 'Dentelure à la herse',
+ LinePerforation => 'Dentelure linéaire',
+ NoPerforation => 'Aucune dentelure',
+
+ CancellationToOrder => 'Oblitération de complaisance',
+ FancyCancellation => 'Oblitération fantaisie',
+ FirstDayCancellation => 'Oblitération premier jour',
+ NumeralCancellation => 'Oblitération numérique',
+ PenMarked => 'Oblitération à la plume',
+ RailroadCancellation => 'Oblitération ferroviaire',
+ SpecialCancellation => 'Oblitération spéciale',
+
+ Superb => 'Superbe',
+ ExtraFine => 'Premier choix',
+ VeryFine => 'Très beau',
+ FineVeryFine => 'Beau/Très beau',
+ Fine => 'Beau',
+ Average => 'Moyen',
+ Poor => 'Mauvais',
+
+ Owned => 'Possédé',
+ Ordered => 'Commandé',
+ Sold => 'Vendu',
+ ToSell => 'A vendre',
+ Wanted => 'Souhaité',
+
+ LightCancellation => 'Légère oblitération',
+ HeavyCancellation => 'Forte oblitération',
+ ModerateCancellation => 'Oblitération modérée',
+
+ MintNeverHinged => 'Intacte',
+ MintLightHinged => 'Légère trace de charnière',
+ HingedRemnant => 'Marque de charnière',
+ HeavilyHinged => 'Grande trace de charnière',
+ LargePartOriginalGum => 'Gomme originale sur grande surface',
+ SmallPartOriginalGum => 'Gomme originale sur petite surface',
+ NoGum => 'Dégommé',
+
+ Perfect => 'Parfaite',
+ VeryNice => 'Très belle',
+ Nice => 'Belle',
+ Incomplete => 'Incomplète',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCModels/GCwines.pm b/lib/gcstar/GCLang/FR/GCModels/GCwines.pm
new file mode 100644
index 0000000..1b2305e
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCModels/GCwines.pm
@@ -0,0 +1,72 @@
+{
+ package GCLang::FR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collection de vins',
+ Items => {0 => 'Vin',
+ 1 => 'Vin',
+ X => 'Vins',
+ I1 => 'Un vin',
+ D1 => 'Le vin',
+ DX => 'Les vins',
+ DD1 => 'Du vin',
+ M1 => 'Ce vin',
+ C1 => ' vin',
+ DA1 => 'e vin',
+ DAX => 'e vins'},
+ NewItem => 'Nouvelle bouteille',
+
+ Name => 'Nom',
+ Designation => 'Appellation',
+ Vintage => 'Millésime',
+ Vineyard => 'Nom du cru',
+ Type => 'Catégorie',
+ Grapes => 'Cépages',
+ Soil => 'Terroir',
+ Producer => 'Producteur',
+ Country => 'Pays',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcool (%)',
+ Medal => 'Distinction',
+
+ Storage => 'Entreposage',
+ Location => 'Lieu',
+ ShelfIndex => 'Position',
+ Quantity => 'Quantité',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Date d\'acquisition',
+ PurchasePrice => 'Prix d\'achat',
+ Gift => 'Offert',
+ BottleLabel => 'Etiquette de la bouteille',
+ Website => 'Référence sur internet',
+
+ Tasted => 'Testé',
+ Comments => 'Appréciation',
+ Serving => 'Service',
+ TastingField => 'Caractère',
+
+ General => 'Fiche',
+ Details => 'Détails',
+ Tasting => 'Dégustation',
+
+ TastedNo => 'Non testé',
+ TastedYes => 'Testé',
+
+ FilterRange => 'Intervalle',
+ FilterTastedNo => '_Non testés',
+ FilterTastedYes => '_Déjà testés',
+ FilterRatingSelect => 'Notes au _moins égales à...'
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/FR/GCstar.pm b/lib/gcstar/GCLang/FR/GCstar.pm
new file mode 100644
index 0000000..3c30226
--- /dev/null
+++ b/lib/gcstar/GCLang/FR/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::FR;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Français',
+
+ 'Separator' => ' : ',
+
+ 'Warning' => '<b>Attention</b> :
+
+Les informations récupérées depuis des sites Internet
+(grâce aux modules de recherche) ne peuvent servir que
+pour une <b>utilisation personnelle</b> dans un cadre privé.
+
+Vous ne pouvez en aucune manière les redistribuer sans
+l\'<b>accord préalable</b> des sites concernés.
+
+Vous pourrez à tout instant connaître le site d\'où
+proviennent les informations d\'un élément en cliquant sur
+le <b>bouton situé en dessous de sa fiche</b>.',
+
+ 'AllItemsFiltered' => 'Aucun{lowercaseC1} ne correspond aux critères de filtrage', # Accepts model codes
+
+ 'InstallDirInfo' => 'Installation dans ',
+ 'InstallMandatory' => 'Composants obligatoires',
+ 'InstallOptional' => 'Composants optionnels',
+ 'InstallErrorMissing' => 'Erreur : Les composants Perl suivants doivent être installés : ',
+ 'InstallPrompt' => 'Répertoire de base pour l\'installation [/usr/local] : ',
+ 'InstallEnd' => 'Fin de l\'installation',
+ 'InstallNoError' => 'Aucune erreur',
+ 'InstallLaunch' => 'Pour utiliser l\'application, lancez ',
+ 'InstallDirectory' => 'Répertoire de base',
+ 'InstallTitle' => 'Installation de GCstar',
+ 'InstallDependencies' => 'Dépendances',
+ 'InstallPath' => 'Chemin',
+ 'InstallOptions' => 'Options',
+ 'InstallSelectDirectory' => 'Choisissez le répertoire de base pour l\'installation',
+ 'InstallWithClean' => 'Effacer précédents fichiers situés au même emplacement',
+ 'InstallWithMenu' => 'Ajouter GCstar au menu des applications',
+ 'InstallNoPermission' => 'Erreur: Vous n\'avez pas la permission d\'écrire dans le répertoire sélectionné',
+ 'InstallMissingMandatory' => 'Des dépendances obligatoires sont manquantes. Vous ne pourrez pas installer GCstar tant qu\'elles ne seront pas installées.',
+ 'InstallMissingOptional' => 'Quelques dépendances facultatives sont manquantes. Elles sont listées ci-dessous. GCstar peut être installé mais certaines fonctionnalités ne seront pas présentes.',
+ 'InstallMissingNone' => 'Aucune dépendance n\'est manquante. Vous pouvez poursuivre l\'installation de GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Manquant',
+ 'InstallMissingFor' => 'Manquant pour',
+ 'InstallCleanDirectory' => 'Suppression des fichiers GCstar dans le répertoire : ',
+ 'InstallCopyDirectory' => 'Copie des fichiers dans le répertoire : ',
+ 'InstallCopyDesktop' => 'Copie du fichier de lancement (.desktop) dans le répertoire : ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy à utiliser (appuyer simplement sur Entrée s\'il n\'y en a pas): ',
+ 'UpdateNoPermission' => 'Pas de permissions d\'écriture dans ce répertoire : ',
+ 'UpdateNone' => 'Aucune mise à jour trouvée',
+ 'UpdateFileNotFound' => 'Fichier non trouvé',
+
+#Splash
+ 'SplashInit' => 'Initialisation',
+ 'SplashLoad' => 'Chargement de la collection',
+ 'SplashDisplay' => 'Affichage de la collection',
+ 'SplashSort' => 'Tri de la collection',
+ 'SplashDone' => 'Prêt',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Il semblerait que vous utilisiez GCfilms. Que voulez vous importer de GCfilms vers GCstar (Cela n\'affectera pas GCfilms si vous continuez de l\'utiliser)?',
+ 'GCfilmsImportOptions' => 'Préférences',
+ 'GCfilmsImportData' => 'Liste de films',
+
+#Menus
+ 'MenuFile' => '_Fichier',
+ 'MenuNewList' => '_Nouvelle collection',
+ 'MenuStats' => 'Statistiques',
+ 'MenuHistory' => 'Fichiers récemment ouverts',
+ 'MenuLend' => 'Voir les {lowercaseX} empruntés', # Accepts model codes
+ 'MenuImport' => '_Importer',
+ 'MenuExport' => '_Exporter',
+ 'MenuAddItem' => '_Ajouter {lowercaseI1}', # Accepts model codes
+
+ 'MenuEdit' => '_Édition',
+ 'MenuDuplicate' => '_Dupliquer {lowercaseD1}', # Accepts model codes
+ 'MenuDuplicatePlural' => '_Dupliquer {lowercaseDX}', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Selectionner tous {lowercaseDX}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Su_pprimer {lowercaseD1} courant', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => 'Su_pprimer {lowercaseDX}', # Accepts model codes
+ 'MenuEditFields' => '_Changer les champs de la collection',
+ 'MenuEditLockItems' => 'Verroui_ller les informations',
+
+ 'MenuDisplay' => 'Fil_tres',
+ 'MenuSavedSearches' => 'Recherches sauvegardées',
+ 'MenuSavedSearchesSave' => 'Sauvegarder la recherche courante',
+ 'MenuSavedSearchesEdit' => 'Modifier les recherches sauvegardées',
+ 'MenuAdvancedSearch' => 'Recherche _Avancée',
+ 'MenuViewAllItems' => 'Voir _tous {lowercaseDX}', # Accepts model codes
+ 'MenuNoFilter' => '_Tous',
+
+ 'MenuConfiguration' => '_Configuration',
+ 'MenuDisplayMenu' => '_Affichage',
+ 'MenuDisplayFullScreen' => '_Plein écran',
+ 'MenuDisplayMenuBar' => '_Menus',
+ 'MenuDisplayToolBar' => 'Barre d\'_outils',
+ 'MenuDisplayStatusBar' => 'Barre d\'é_tat',
+ 'MenuDisplayOptions' => '_Informations à afficher',
+ 'MenuBorrowers' => '_Emprunteurs',
+ 'MenuToolbarConfiguration' => '_Boutons de la barre d\'outils',
+ 'MenuDefaultValues' => 'Valeurs par défaut lors de l\'ajout d{lowercaseDAX}', # Accepts model codes
+ 'MenuGenresConversion' => 'Conversions de _genres',
+
+ 'MenuBookmarks' => 'Mes _collections',
+ 'MenuBookmarksAdd' => '_Ajouter la collection courante',
+ 'MenuBookmarksEdit' => '_Éditer les collections sauvegardées',
+
+ 'MenuHelp' => '_Aide',
+ 'MenuHelpContent' => '_Contenu',
+ 'MenuAllPlugins' => 'Voir les _modules',
+ 'MenuBugReport' => 'Signaler un _dysfonctionnement',
+ 'MenuAbout' => 'À _propos de GCstar',
+
+ 'MenuNewWindow' => 'Afficher {lowercaseD1} dans une nouvelle fenêtre', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Afficher {lowercaseDX} dans une nouvelle fenêtre', # Accepts model codes
+
+ 'ContextExpandAll' => 'Tout développer',
+ 'ContextCollapseAll' => 'Tout réduire',
+ 'ContextChooseImage' => 'Changer l\'_image',
+ 'ContextOpenWith' => '_Envoyer à',
+ 'ContextImageEditor' => 'Éditeur d\'images',
+ 'ContextImgFront' => 'Recto',
+ 'ContextImgBack' => 'Verso',
+ 'ContextChooseFile' => 'Sélectionner un fichier',
+ 'ContextChooseFolder' => 'Sélectionner un répertoire',
+
+ 'DialogEnterNumber' => 'Veuillez entrer une valeur',
+
+ 'RemoveConfirm' => 'Voulez-vous vraiment supprimer {lowercaseM1} ?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Voulez-vous vraiment supprimer ces {lowercaseX} ?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Nouvel élément', # Accepts model codes
+ 'NewItemTooltip' => 'Ajouter {lowercaseI1}', # Accepts model codes
+ 'NoItemFound' => 'Aucun{lowercaseC1} ne correspond. Voulez-vous tenter une recherche sur un autre site ?', # Accepts model codes
+ 'OpenList' => 'Quelle collection ouvrir ?',
+ 'SaveList' => 'Dans quel fichier enregistrer ?',
+ 'SaveListTooltip' => 'Enregistrer la liste courante',
+ 'SaveUnsavedChanges' => 'Vous avez des changements non sauvegardés dans votre collection. Voulez-vous les sauvegarder ?',
+ 'SaveDontSave' => 'Ne pas enregistrer',
+ 'PreferencesTooltip' => 'Changer vos préférences',
+ 'ViewTooltip' => 'Changer le type de liste',
+ 'PlayTooltip' => 'Lancer le fichier associé', # Accepts model codes
+ 'PlayFileNotFound' => 'Le fichier à lancer n\'a pas été trouvé dans cet emplacement :',
+ 'PlayRetry' => 'Réessayer',
+
+ 'StatusSave' => 'Sauvegarde...',
+ 'StatusLoad' => 'Chargement...',
+ 'StatusSearch' => 'Recherche en cours...',
+ 'StatusGetInfo' => 'Récupération des informations...',
+ 'StatusGetImage' => 'Téléchargement de l\'image...',
+
+ 'SaveError' => 'Impossible de sauver la collection. Vérifiez les permissions et la place disponible sur le disque.',
+ 'OpenError' => 'Impossible d\'ouvrir la collection. Vérifiez les permissions.',
+ 'OpenFormatError' => 'Impossible d\'ouvrir la collection. Le format semble ne pas être bon.',
+ 'OpenVersionWarning' => 'La collection a été créée avec une version plus récente de GCstar. Si vous la sauvegardez, vous pourriez perdre des données.',
+ 'OpenVersionQuestion' => 'Voulez-vous tout de même continuer ?',
+ 'ImageError' => 'Le répertoire choisi pour stocker les images n\'est pas correct. Veuillez en choisir un autre.',
+ 'OptionsCreationError'=> 'Impossible de créer le fichier d\'options : ',
+ 'OptionsOpenError'=> 'Impossible d\'ouvrir le fichier d\'options : ',
+ 'OptionsSaveError'=> 'Impossible d\'enregistrer le fichier d\'options : ',
+ 'ErrorModelNotFound' => 'Modèle non trouvé : ',
+ 'ErrorModelUserDir' => 'Les modèles créés par l\'utilisateur sont dans : ',
+
+ 'RandomTooltip' => 'Que vais-je regarder ce soir ?',
+ 'RandomError'=> 'Vous n\'avez pas d{lowercaseDA1} pouvant être sélectionné', # Accepts model codes
+ 'RandomEnd'=> 'Il n\'y a plus d\'autre {lowercase1}', # Accepts model codes
+ 'RandomNextTip'=> 'Proposition suivante',
+ 'RandomOkTip'=> 'Accepter cet élément',
+
+ 'AboutTitle' => 'À propos de GCstar',
+ 'AboutDesc' => 'Gestionnaire de collections personnelles',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Équipe',
+ 'AboutWho' => 'Christian Jodar (Tian) : Gestionnaire du projet, Programmeur
+Nyall Dawson (Zombiepig) : Programmeur
+TPF : Programmeur
+Adolfo González : Programmeur
+',
+ 'AboutLicense' => 'Distribué selon les termes de la GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traduction française par Christian Jodar',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo et webdesign par le Spektre',
+
+ 'UnsavedCollection' => 'Collection non sauvegardée',
+ 'ModelsSelect' => 'Choisissez un type de collection',
+ 'ModelsPersonal' => 'Types personnels',
+ 'ModelsDefault' => 'Types par défaut',
+ 'ModelsList' => 'Définition de la collection',
+ 'ModelSettings' => 'Réglages de la collection',
+ 'ModelNewType' => 'Nouveau type de collection',
+ 'ModelName' => 'Description du type de collection:',
+ 'ModelFields' => 'Champs',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filtres',
+ 'ModelNewField' => 'Nouveau champ',
+ 'ModelFieldInformation' => 'Informations',
+ 'ModelFieldName' => 'Nom :',
+ 'ModelFieldType' => 'Type de champ :',
+ 'ModelFieldGroup' => 'Groupe :',
+ 'ModelFieldValues' => 'Valeurs',
+ 'ModelFieldInit' => 'Défaut :',
+ 'ModelFieldMin' => 'Minimum :',
+ 'ModelFieldMax' => 'Maximum :',
+ 'ModelFieldList' => 'Liste des valeurs :',
+ 'ModelFieldListLegend' => '<i>Séparées par des virgules</i>',
+ 'ModelFieldDisplayAs' => 'Afficher comme :',
+ 'ModelFieldDisplayAsText' => 'Texte',
+ 'ModelFieldDisplayAsGraphical' => 'Notation',
+ 'ModelFieldTypeShortText' => 'Texte court',
+ 'ModelFieldTypeLongText' => 'Texte long',
+ 'ModelFieldTypeYesNo' => 'Oui/Non',
+ 'ModelFieldTypeNumber' => 'Nombre',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Liste de valeurs prédéfinies',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Liste simple',
+ 'ModelFieldTypeFile' => 'Fichier',
+ 'ModelFieldTypeFormatted' => 'Dépendant d\'autres champs',
+ 'ModelFieldParameters' => 'Paramètres',
+ 'ModelFieldHasHistory' => 'Garder un historique',
+ 'ModelFieldFlat' => 'Afficher sur une seule ligne',
+ 'ModelFieldStep' => 'Valeur d\'incrément :',
+ 'ModelFieldFileFormat' => 'Format du fichier :',
+ 'ModelFieldFileFile' => 'Simple fichier',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Vidéo',
+ 'ModelFieldFileAudio' => 'Son',
+ 'ModelFieldFileProgram' => 'Programme',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Champs à utiliser',
+ 'ModelOptionsFieldsAuto' => 'Automatique',
+ 'ModelOptionsFieldsNone' => 'Aucun',
+ 'ModelOptionsFieldsTitle' => 'En tant que titre',
+ 'ModelOptionsFieldsId' => 'En tant qu\'identifiant',
+ 'ModelOptionsFieldsCover' => 'En tant que couverture',
+ 'ModelOptionsFieldsPlay' => 'Pour le bouton Lecture',
+ 'ModelCollectionSettings' => 'Réglages de la collection',
+ 'ModelCollectionSettingsLending' => 'Les éléments peuvent être empruntés',
+ 'ModelCollectionSettingsTagging' => 'Les éléments peuvent être marqués',
+ 'ModelFilterActivated' => 'Présent dans la fenêtre de recherche',
+ 'ModelFilterComparison' => 'Comparaison',
+ 'ModelFilterContain' => 'Contient',
+ 'ModelFilterDoesNotContain' => 'Ne contient pas',
+ 'ModelFilterRegexp' => 'Expression régulière',
+ 'ModelFilterRange' => 'Intervalle',
+ 'ModelFilterNumeric' => 'La comparaison est numérique',
+ 'ModelFilterQuick' => 'Créer un filtre rapide',
+ 'ModelTooltipName' => 'Utiliser un nom pour ré-utiliser ce modèle pour plusieurs collections. S\'il est vide, les réglages seront stockées dans la collection elle-même.',
+ 'ModelTooltipLabel' => 'Le nom du champ tel qu\'il sera affiché.',
+ 'ModelTooltipGroup' => 'Utilisé pour grouper les champs. Les champs sans groupe seront mis dans un groupe par défaut.',
+ 'ModelTooltipHistory' => 'Est-ce qu\'un historique des valeurs entrées doit être conservé dans une liste.',
+ 'ModelTooltipFormat' => 'Ce format sert à déterminer l\'action à effectuer lors de l\'appui sur le bouton de lecture.',
+ 'ModelTooltipLending' => 'Cela va ajouter des champs pour gérer les emprunts.',
+ 'ModelTooltipTagging' => 'Cela va ajouter des champs pour gérer les marques et mots-clés',
+ 'ModelTooltipNumeric' => 'Indique que les valeurs doivent être considérées comme des nombres pour les comparaisons.',
+ 'ModelTooltipQuick' => 'Ajoutera un sous-menu dans le menu Filtres',
+
+ 'ResultsTitle' => 'Choisissez {lowercaseI1}', # Accepts model codes
+ 'ResultsNextTip' => 'Rechercher sur le site suivant',
+ 'ResultsPreview' => 'Aperçu',
+ 'ResultsInfo' => 'Vous pouvez ajouter plusieurs {lowercaseX} à la collection en maintenant la touche Shift ou Ctrl et en les sélectionnant', # Accepts model codes
+
+ 'OptionsTitle' => 'Préférences',
+ 'OptionsExpertMode' => 'Mode expert',
+ 'OptionsPrograms' => 'Indiquez les applications à utiliser, ou laissez vide pour utiliser celles par défaut',
+ 'OptionsBrowser' => 'Navigateur web',
+ 'OptionsPlayer' => 'Lecteur de vidéos',
+ 'OptionsAudio' => 'Lecteur audio',
+ 'OptionsImageEditor' => 'Éditeur d\'images',
+ 'OptionsCdDevice' => 'Périphérique CD',
+ 'OptionsImages' => 'Répertoire images',
+ 'OptionsUseRelativePaths' => 'Utiliser des chemins relatifs pour les images',
+ 'OptionsLayout' => 'Disposition',
+ 'OptionsStatus' => 'Afficher la barre d\'état en bas de la fenêtre',
+ 'OptionsUseStars' => 'Afficher les notes avec des étoiles',
+ 'OptionsWarning' => 'Attention : Les changements effectués dans cet onglet ne seront pris en compte qu\'après un redémarrage de l\'application',
+ 'OptionsRemoveConfirm' => 'Demander confirmation avant la suppression',
+ 'OptionsAutoSave' => 'Sauvegarde automatique de la collection',
+ 'OptionsAutoLoad' => 'Ouvrir la collection précédente au démarrage',
+ 'OptionsSplash' => 'Afficher l\'écran de démarrage',
+ 'OptionsTearoffMenus' => 'Activer les menus détachables',
+ 'OptionsSpellCheck' => 'Utiliser le vérificateur orthographique pour les champs texte longs',
+ 'OptionsProgramTitle' => 'Choisissez le programme à utiliser',
+ 'OptionsPlugins' => 'Site où récupérer les fiches',
+ 'OptionsAskPlugins' => 'Demander (Tous les sites)',
+ 'OptionsPluginsMulti' => 'Plusieurs sites',
+ 'OptionsPluginsMultiAsk' => 'Demander (Certains sites)',
+ 'OptionsPluginsMultiPerField' => 'Plusieurs sites (par champs)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Choix de l\'ordre pour plusieurs sites par champs',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Pour chaque champs sélectionné, on remplira avec la première information non vide trouvée, en partant de gauche.',
+ 'OptionsPluginsMultiPerFieldFirst' => 'En premier',
+ 'OptionsPluginsMultiPerFieldLast' => 'En dernier',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Supprimer',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Vider les listes sélectionnées',
+ 'OptionsPluginsList' => 'Définir la liste',
+ 'OptionsAskImport' => 'Choisir les champs à importer',
+ 'OptionsProxy' => 'Utiliser un proxy',
+ 'OptionsCookieJar' => 'Utiliser ce fichier de cookies',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Langue',
+ 'OptionsPaths' => 'Chemins',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Options',
+ 'OptionsDisplay' => 'Affichage',
+ 'OptionsToolbar' => 'Barre d\'outils',
+ 'OptionsToolbars' => {0 => 'Aucune', 1 => 'Petite', 2 => 'Grande', 3 => 'Réglage système'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {0 => 'Haut', 1 => 'Bas', 2 => 'Gauche', 3 => 'Droite'},
+ 'OptionsExpandersMode' => 'Texte replié trop long',
+ 'OptionsExpandersModes' => {'asis' => 'Ne rien faire', 'cut' => 'Couper', 'wrap' => 'Aller à la ligne'},
+ 'OptionsDateFormat' => 'Format des dates',
+ 'OptionsDateFormatTooltip' => 'Le format est celui utilisé par strftime(3). La valeur par défaut est %d/%m/%Y',
+ 'OptionsView' => 'Type de liste',
+ 'OptionsViews' => {0 => 'Texte', 1 => 'Image', 2 => 'Détaillée'},
+ 'OptionsColumns' => 'Colonnes',
+ 'OptionsMailer' => 'Méthode d\'envoi d\'e-mails',
+ 'OptionsSMTP' => 'Serveur',
+ 'OptionsFrom' => 'E-mail expéditeur',
+ 'OptionsTransform' => 'Mettre à la fin des titres les articles',
+ 'OptionsArticles' => 'Articles (Séparés par des virgules)',
+ 'OptionsSearchStop' => 'Une recherche peut être arrêtée',
+ 'OptionsBigPics' => 'Utiliser les grandes images quand disponibles',
+ 'OptionsAlwaysOriginal' => 'Utiliser le titre principal comme titre original si non présent',
+ 'OptionsRestoreAccelerators' => 'Rétablir raccourcis',
+ 'OptionsHistory' => 'Taille de l\'historique',
+ 'OptionsClearHistory' => 'Purger l\'historique',
+ 'OptionsStyle' => 'Thème',
+ 'OptionsDontAsk' => 'Ne plus demander',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Utiliser les programmes définis par le système',
+ 'OptionsProgramsUser' => 'Utiliser les programmes spécifiés',
+ 'OptionsProgramsSet' => 'Régler les programmes',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Récupération des données',
+ 'OptionsInternetSettingsGroup' => 'Réglages',
+ 'OptionsDisplayInformationGroup' => 'Affichage des informations',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Affichage',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Préférences',
+ 'OptionsFeaturesConveniencesGroup' => 'Commodités',
+ 'OptionsPicturesFormat' => 'Préfixe à utiliser pour les images :',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Le titre ou le nom de l\'élément associé',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ou . sera remplacé par le répertoire de la collection (seulement utilisable en début)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% sera remplacé par le fichier contenant la collection sans son suffixe (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% peut seulement être utilisé au début du chemin pour les images',
+ 'OptionsConfigureMailers' => 'Configurer les clients mail',
+
+ 'ImagesOptionsButton' => 'Réglages',
+ 'ImagesOptionsTitle' => 'Réglages pour la liste d\'images',
+ 'ImagesOptionsSelectColor' => 'Choisissez une couleur',
+ 'ImagesOptionsUseOverlays' => 'Effet brillant',
+ 'ImagesOptionsBg' => 'Fond',
+ 'ImagesOptionsBgPicture' => 'Utiliser une image de fond',
+ 'ImagesOptionsFg'=> 'Sélection',
+ 'ImagesOptionsBgTooltip' => 'Changer la couleur de fond',
+ 'ImagesOptionsFgTooltip'=> 'Changer la couleur de la sélection',
+ 'ImagesOptionsResizeImgList' => 'Changer dynamiquement le nombre de colonnes',
+ 'ImagesOptionsAnimateImgList' => 'Utiliser des animations',
+ 'ImagesOptionsSizeLabel' => 'Taille',
+ 'ImagesOptionsSizeList' => {0 => 'Minuscule', 1 => 'Petit', 2 => 'Moyen', 3 => 'Grand', 4 => 'Énorme'},
+ 'ImagesOptionsSizeTooltip' => 'Sélectionnez la taille pour les images',
+
+ 'DetailedOptionsTitle' => 'Réglages pour la liste détaillée',
+ 'DetailedOptionsImageSize' => 'Taille des images',
+ 'DetailedOptionsGroupItems' => 'Grouper les éléments par',
+ 'DetailedOptionsSecondarySort' => 'Trier les enfants par',
+ 'DetailedOptionsFields' => 'Choisir les champs à afficher',
+ 'DetailedOptionsGroupedFirst' => 'Garder ensemble les éléments orphelins',
+ 'DetailedOptionsAddCount' => 'Ajouter le nombre d\'éléments sur les catégories',
+
+ 'ExtractButton' => 'Informations',
+ 'ExtractTitle' => 'Informations du fichier vidéo',
+ 'ExtractImport' => 'Utiliser les valeurs',
+
+ 'FieldsListOpen' => 'Charger une liste de champs depuis un fichier',
+ 'FieldsListSave' => 'Sauvegarder la liste des champs dans un fichier',
+ 'FieldsListError' => 'Cette liste de champs ne peut pas être utilisée avec ce type de collection',
+ 'FieldsListIgnore' => '--- Ignorer',
+
+ 'ExportTitle' => 'Exporter la collection',
+ 'ExportFilter' => 'Exporter seulement les éléments affichés',
+ 'ExportFieldsTitle' => 'Champs à exporter',
+ 'ExportFieldsTip' => 'Choisir les champs devant être exportés',
+ 'ExportWithPictures' => 'Copier les images dans un sous-répertoire',
+ 'ExportSortBy' => 'Trier selon',
+ 'ExportOrder' => 'Ordre',
+
+ 'ImportListTitle' => 'Importer une autre collection',
+ 'ImportExportData' => 'Données',
+ 'ImportExportFile' => 'Fichier',
+ 'ImportExportFieldsUnused' => 'Champs inutilisés',
+ 'ImportExportFieldsUsed' => 'Champs utilisés',
+ 'ImportExportFieldsFill' => 'Tous les champs',
+ 'ImportExportFieldsClear' => 'Aucun champ',
+ 'ImportExportFieldsEmpty' => 'Au moins un champ doit être spécifié',
+ 'ImportExportFileEmpty' => 'Un nom de fichier doit être spécifié',
+ 'ImportFieldsTitle' => 'Champs à importer',
+ 'ImportFieldsTip' => 'Choisir les champs devant être importés',
+ 'ImportNewList' => 'Créer une nouvelle liste',
+ 'ImportCurrentList' => 'Ajouter à la liste courante',
+ 'ImportDropError' => 'Il y a eu une erreur dans l\'ouverture d\'au moins un fichier. La liste précédente va être rechargée.',
+ 'ImportGenerateId' => 'Générer l\'identifiant de chaque élément',
+
+ 'FileChooserOpenFile' => 'Choisissez le fichier à utiliser',
+ 'FileChooserDirectory' => 'Répertoire',
+ 'FileChooserOpenDirectory' => 'Choisissez un répertoire',
+ 'FileChooserOverwrite' => 'Ce fichier existe. Voulez vous le remplacer ?',
+ 'FileAllFiles' => 'Tous les fichiers',
+ 'FileVideoFiles' => 'Fichier vidéos',
+ 'FileEbookFiles' => 'Fichiers ebook (livres électroniques)',
+ 'FileAudioFiles' => 'Fichiers sons',
+ 'FileGCstarFiles' => 'Collections GCstar',
+
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Lecture seule',
+ 'PanelForm' => 'Onglets',
+
+ 'PanelSearchButton' => 'Télécharger',
+ 'PanelSearchTip' => 'Rechercher les informations concernant l\'élément dont le nom a été saisi',
+ 'PanelSearchContextChooseOne' => 'Choisir un site ...',
+ 'PanelSearchContextMultiSite' => 'Utiliser "plusieurs sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Utiliser "plusieurs sites par champs"',
+ 'PanelSearchContextOptions' => 'Changer les options ...',
+ 'PanelImageTipOpen' => 'Cliquez sur l\'image pour en choisir une autre.',
+ 'PanelImageTipView' => 'Cliquez sur l\'image pour la voir en taille réelle.',
+ 'PanelImageTipMenu' => ' Clic droit pour plus d\'options.',
+ 'PanelImageTitle' => 'Sélectionnez une image',
+ 'PanelImageNoImage' => 'Pas d\'image',
+ 'PanelSelectFileTitle' => 'Sélectionnez un fichier',
+ 'PanelLaunch' => 'Démarrer',
+ 'PanelRestoreDefault' => 'Rétablir défaut',
+ 'PanelRefresh' => 'Rafraîchir',
+ 'PanelRefreshTip' => 'Mettre à jour les informations depuis Internet',
+
+ 'PanelFrom' =>'Entre',
+ 'PanelTo' =>'et',
+
+ 'PanelWeb' => 'Voir la fiche Internet',
+ 'PanelWebTip' => 'Voir la fiche {lowercaseDD1} sur Internet', # Accepts model codes
+ 'PanelRemoveTip' => 'Supprimer {lowercaseD1} affiché ci-dessus', # Accepts model codes
+
+ 'PanelDateSelect' => 'Changer',
+ 'PanelNobody' => 'Personne',
+ 'PanelUnknown' => 'Inconnu',
+ 'PanelAdded' => 'Date d\'ajout',
+ 'PanelRating' => 'Note',
+ 'PanelPressRating' => 'Note Presse',
+ 'PanelLocation' => 'Emplacement',
+
+ 'PanelLending' => 'Emprunts',
+ 'PanelBorrower' => 'Emprunteur',
+ 'PanelLendDate' => 'Date d\'emprunt',
+ 'PanelHistory' => 'Historique des emprunts',
+ 'PanelReturned' => '{1} _Rendu', # Accepts model codes
+ 'PanelReturnDate' => 'Date de retour',
+ 'PanelLendedYes' => 'Prêté',
+ 'PanelLendedNo' => 'Disponible',
+
+ 'PanelTags' => 'Étiquettes',
+ 'PanelFavourite' => 'Favori',
+ 'TagsAssigned' => 'Mots-clés associés',
+
+ 'PanelUser' => 'Champs utilisateur',
+
+ 'CheckUndef' => 'Sans importance',
+ 'CheckYes' => 'Oui',
+ 'CheckNo' => 'Non',
+
+ 'ToolbarRandom' => 'Ce soir',
+ 'ToolbarAll' => 'Voir tous',
+ 'ToolbarAllTooltip' => 'Afficher toute la collection',
+ 'ToolbarGroupBy' => 'Grouper par',
+ 'ToolbarGroupByTooltip' => 'Choisir le champ à utiliser pour regrouper les éléments dans la liste',
+ 'ToolbarQuickSearch' => 'Recherche rapide',
+ 'ToolbarQuickSearchLabel' => 'Rechercher',
+ 'ToolbarQuickSearchTooltip' => 'Choisissez le champ dans lequel rechercher, entrez le texte de la recherche et pressez Entréé',
+ 'ToolbarSeparator' => ' Séparateur',
+
+ 'PluginsTitle' => 'Chercher un élément',
+ 'PluginsQuery' => 'Recherche',
+ 'PluginsFrame' => 'Site où rechercher',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nom',
+ 'PluginsSearchFields' => 'Champs de recherche',
+ 'PluginsAuthor' => 'Auteur',
+ 'PluginsLang' => 'Langue',
+ 'PluginsUseSite' => 'Utiliser le site sélectionné pour les futures recherches',
+ 'PluginsPreferredTooltip' => 'Site recommandé par GCstar',
+ 'PluginDisabled' => 'Désactivé',
+
+ 'BorrowersTitle' => 'Configuration des emprunteurs',
+ 'BorrowersList' => 'Emprunteurs',
+ 'BorrowersName' => 'Nom',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Ajouter',
+ 'BorrowersRemove' => '_Supprimer',
+ 'BorrowersEdit' => '_Modifier',
+ 'BorrowersTemplate' => 'Modèle d\'e-mail',
+ 'BorrowersSubject' => 'Titre du mail : ',
+ 'BorrowersNotice1' => '%1 sera remplacé par le nom de l\'emprunteur',
+ 'BorrowersNotice2' => '%2 sera remplacé par le nom de l\'élément',
+ 'BorrowersNotice3' => '%3 sera remplacé par la date de l\'emprunt',
+
+ 'BorrowersImportTitle' => 'Importer les informations d\'emprunteurs',
+ 'BorrowersImportType' => 'Format du fichier :',
+ 'BorrowersImportFile' => 'Fichier :',
+
+ 'BorrowedTitle' => '{X} empruntés', # Accepts model codes
+ 'BorrowedDate' => 'Depuis le',
+ 'BorrowedDisplayInPanel' => 'Voir {lowercaseD1} dans la fenêtre principale', # Accepts model codes
+
+ 'MailTitle' => '_Envoyer un e-mail',
+ 'MailFrom' => 'De : ',
+ 'MailTo' => 'A : ',
+ 'MailSubject' => 'Objet : ',
+ 'MailSmtpError' => 'Problème de connexion au serveur SMTP',
+ 'MailSendmailError' => 'Problème au lancement de sendmail',
+
+ 'SearchTooltip' => 'Rechercher dans tous {lowercaseDX}', # Accepts model codes
+ 'SearchTitle' => 'Recherche d{lowercaseDAX}', # Accepts model codes
+ 'SearchNoField' => 'Aucun champ n\'a été sélectionné pour la fenêtre de recherche.
+Ils peuvent être ajoutés dans l\'onglet Filtres des réglages de la collection.',
+
+ 'QueryReplaceField' => 'Champs à modifier',
+ 'QueryReplaceOld' => 'Valeur actuelle',
+ 'QueryReplaceNew' => 'Nouvelle valeur',
+ 'QueryReplaceLaunch' => 'Remplacer',
+
+ 'ImportWindowTitle' => 'Choisir les champs à importer',
+ 'ImportViewPicture' => 'Voir l\'image',
+ 'ImportSelectAll' => 'Tout sélectionner',
+ 'ImportSelectNone' => 'Ne rien sélectionner',
+
+ 'MultiSiteTitle' => 'Sites où rechercher',
+ 'MultiSiteUnused' => 'Modules non utilisés',
+ 'MultiSiteUsed' => 'Modules à utiliser',
+ 'MultiSiteLang' => 'Remplir la liste avec les modules français',
+ 'MultiSiteEmptyError' => 'Vous avez une liste de sites vide',
+ 'MultiSiteClear' => 'Vider la liste',
+
+ 'DisplayOptionsTitle' => 'Éléments à afficher',
+ 'DisplayOptionsAll' => 'Tout sélectionner',
+ 'DisplayOptionsSearch' => 'Bouton recherche',
+
+ 'GenresTitle' => 'Conversions de genres',
+ 'GenresCategoryName' => 'Genre à utiliser',
+ 'GenresCategoryMembers' => 'Genres à remplacer',
+ 'GenresLoad' => 'Charger une liste prédéfinie',
+ 'GenresExport' => 'Exporter la liste dans un fichier',
+ 'GenresModify' => 'Changer la conversion',
+
+ 'PropertiesName' => 'Nom de la collection',
+ 'PropertiesLang' => 'Code langue',
+ 'PropertiesOwner' => 'Propriétaire',
+ 'PropertiesEmail' => 'Adresse e-mail',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'Informations sur le fichier',
+ 'PropertiesFilePath' => 'Chemin complet',
+ 'PropertiesItemsNumber' => 'Nombre d{lowercaseDAX}', # Accepts model codes
+ 'PropertiesFileSize' => 'Taille',
+ 'PropertiesFileSizeSymbols' => ['octets', 'Ko', 'Mo', 'Go', 'To', 'Po', 'Eo', 'Zo', 'Yo'],
+ 'PropertiesCollection' => 'Propriétés de la collection',
+ 'PropertiesDefaultPicture' => 'Image par défaut',
+
+ 'MailProgramsTitle' => 'Programmes pour envoyer des emails',
+ 'MailProgramsName' => 'Nom',
+ 'MailProgramsCommand' => 'Ligne de commande',
+ 'MailProgramsRestore' => 'Programmes par défaut',
+ 'MailProgramsAdd' => 'Ajouter un programme',
+ 'MailProgramsInstructions' => 'Dans la ligne de commande des substitutions seront effectuées :
+ %f sera remplacé par l\'adresse email de l\'utilisateur.
+ %t sera remplacé par le destinataire.
+ %s sera remplacé par le sujet du message.
+ %b sera remplacé par le contenu du message.',
+
+ 'BookmarksBookmarks' => 'Collections',
+ 'BookmarksFolder' => 'Répertoire',
+ 'BookmarksLabel' => 'Nom',
+ 'BookmarksPath' => 'Chemin',
+ 'BookmarksNewFolder' => 'Nouveau répertoire',
+
+ 'AdvancedSearchType' => 'Type de recherche',
+ 'AdvancedSearchTypeAnd' => '{X} correspondants à tous les critères', # Accepts model codes
+ 'AdvancedSearchTypeOr' => '{X} correspondants à au moins un critère', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Critères',
+ 'AdvancedSearchAnyField' => 'N\'importe quel champ',
+ 'AdvancedSearchSaveTitle' => 'Sauvegarder la recherche',
+ 'AdvancedSearchSaveName' => 'Nom',
+ 'AdvancedSearchSaveOverwrite' => 'Il y a déjà une recherche sauvegardée avec ce nom. Veuillez en choisir un autre.',
+ 'AdvancedSearchUseCase' => 'Différencier majuscules et minuscules',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignorer les accents et autres diacritiques',
+
+ 'BugReportSubject' => 'Rapport d\'erreur généré depuis GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Système d\'exploitation',
+ 'BugReportMessage' => 'Message d\'erreur',
+ 'BugReportInformation' => 'Informations complémentaires',
+
+#Statistics
+ 'StatsFieldToUse' => 'Champ à utiliser',
+ 'StatsSortByNumber' => 'Trier par nombre de {lowercaseX}',
+ 'StatsGenerate' => 'Générer',
+ 'StatsKindOfGraph' => 'Type de représentation',
+ 'StatsBars' => 'Barres',
+ 'StatsPie' => 'Camembert',
+ 'Stats3DPie' => 'Camembert 3D',
+ 'StatsArea' => 'Zones',
+ 'StatsHistory' => 'Historique',
+ 'StatsWidth' => 'Largeur',
+ 'StatsHeight' => 'Hauteur',
+ 'StatsFontSize' => 'Taille de la police',
+ 'StatsDisplayNumber' => 'Montrer les valeurs',
+ 'StatsSave' => 'Sauvegarder les statistiques dans un fichier',
+ 'StatsAccumulate' => 'Accumuler les valeurs',
+ 'StatsShowAllDates' => 'Montrer toutes les dates',
+
+ 'DefaultValuesTip' => 'Les valeurs définies dans cette fenêtre seront utilisées lors de l\'ajout d\'{lowercaseI1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/GCLangUtils.pm b/lib/gcstar/GCLang/GCLangUtils.pm
new file mode 100644
index 0000000..3094b27
--- /dev/null
+++ b/lib/gcstar/GCLang/GCLangUtils.pm
@@ -0,0 +1,56 @@
+{
+ package GCLang::GCLangUtils;
+
+
+###################################################
+#
+# Copyright 2005-2008 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+use strict;
+use Exporter;
+use base 'Exporter';
+our @EXPORT = qw(importTranslation);
+
+sub importTranslation
+{
+ my ($replace) = @_;
+ my ($pack) = caller(0);
+ my (undef, undef, undef, $subroutine) = caller(2);
+ # Avoid recursion as it could lead to some problems
+ return if $subroutine =~ /importTranslation/;
+ #Create the new package name. It supposes the module are in the same subfolders
+ (my $newPack = $pack) =~ s/(GC(Import|Export)?)(\w*)$/$1$replace/;
+ (my $newModule = $newPack) =~ s|::|/|g;
+ require "$newModule.pm";
+ my %tmpLang;
+ eval "%tmpLang = %".$newPack."::lang";
+ foreach my $translation(keys %tmpLang)
+ {
+ # Add it only if it was not defined previously
+ eval '$'.$pack.'::lang{'.$translation."} = \$tmpLang{$translation} if ! exists \$".$pack.'::lang{'.$translation.'}';
+ }
+
+}
+
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..71e9b3f
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::GL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Incluír os campos dos nomes na parte de arriba',
+ 'Separator' => 'Separador',
+ 'Replacement' => 'Reemprazar o separador con',
+ 'Charset' => 'Conxunto de caracteres',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..93066e2
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::GL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..5e99774
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::GL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'O ficheiro de modelo non é válido',
+ 'UseFile' => 'Usar o ficheiro seguinte',
+ 'WithJS' => 'Usar Javascript',
+ 'FileTemplate' => 'Modelo',
+ 'Preview' => 'Previsualización',
+ 'NoPreview' => 'Non hai unha previsualización dispoñible',
+ 'TemplateExternalFile' => 'Ficheiro de modelo',
+ 'Title' => 'Título da páxina',
+ 'InfoFile' => 'A listaxe de Filmes está neste ficheiro: ',
+ 'InfoDir' => 'As imaxes están en: ',
+ 'HeightImg' => 'Altura (en pixels) da imaxe a exportar',
+ 'OpenFileInBrowser' => 'Abrir o ficheiro xerado no navegador',
+ 'Note' => 'Listaxe xerada por <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduza o texto da busca',
+ 'SearchType1' => 'Só o título',
+ 'SearchType2' => 'Información completa',
+ 'SearchButton' => 'Procura',
+ 'SearchTitle' => 'Amosar só os filmes que cumpren os criterior previos',
+ 'AllButton' => 'Todos',
+ 'AllTitle' => 'Amosar todos os filmes',
+ 'Expand' => 'Expandir todo',
+ 'ExpandTitle' => 'Amosar información de todos os filmes',
+ 'Collapse' => 'Contraer todo',
+ 'CollapseTitle' => 'Contraer a información de todas os filmes',
+ 'Borrowed' => 'Prestado por: ',
+ 'NotBorrowed' => 'Dispoñible',
+ 'Top' => 'Arriba',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..97770d5
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::GL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..1bffe98
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::GL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Incluír instrucción DROP',
+ 'WithCreate' => 'Incluír instrucción CREATE',
+ 'TableName' => 'Nome da táboa',
+ 'InfoFile' => 'Ficheiro SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..4613d9e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::GL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'O archivo está no ficheiro: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..5381c5e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::GL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Ficheiro do modelo',
+ 'ModelText' => 'Texto do modelo',
+ 'Models' => 'Modelo a utilizar',
+ 'UseFile' => 'Usar ficheiro',
+ 'UseModel' => 'Usar area de texto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..4faa4f8
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::GL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Onde debería buscarse',
+ 'Default' => 'Directorio predeterminado de Alexandria',
+ 'Specified' => 'Directorio especificado a continuación',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d0adab7
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::GL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Conxunto de caracteres',
+ 'Header' => 'Ignorar a primeira liña',
+ 'Separator' => 'Separador',
+ 'Plugin' => 'Utilizar o sitio web',
+ 'UseFirst' => 'Seleccionar o primeiro dos resultados',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..6578395
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::GL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..1a2c163
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::GL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiar imaxes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..912879e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::GL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Listaxe de nomes',
+ 'Plugin' => 'Utilizar o sitio web',
+ 'UseFirst' => 'Seleccionar o primeiro dos resultados',
+ 'CommentAuto' => 'Elemento importado automáticamente.',
+ 'CommentSite' => 'Sitio web: ',
+ 'CommentTitle' => 'Título: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..20c3eef
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::GL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..dc625c9
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::GL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'O ficheiro non é unha colección Tellico soportada',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..a6f7316
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::GL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..16a0ccb
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::GL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..c061c0c
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::GL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de Xogos de Mesa',
+ Items => {0 => 'Xogo',
+ 1 => 'Xogo',
+ X => 'Xogos'},
+ NewItem => 'Novo xogo',
+
+ Id => 'Id',
+ Name => 'Nome',
+ Original => 'Nome Orixinal',
+ Box => 'Imaxe da caixa',
+ DesignedBy => 'Deseñado por',
+ PublishedBy => 'Publicado por',
+ Players => 'Número de xogadores',
+ PlayingTime => 'Tempo de xogo',
+ SuggestedAge => 'Idade suxerida',
+ Released => 'Publicado',
+ Description => 'Descripción',
+ Category => 'Categoría',
+ Mechanics => 'Mecanismos',
+ ExpandedBy => 'Expandido por',
+ ExpansionFor => 'Expandido para',
+ GameFamily => 'Familia do xogo',
+ IllustratedBy => 'Ilustrado por',
+ Url => 'Páxina web',
+ TimesPlayed => 'Veces xogado',
+ CompleteContents => 'Contidos completos',
+ Copies => 'Nº de copias',
+ Condition => 'Condición',
+ Photos => 'Fotos',
+ Photo1 => 'Primeira imaxe',
+ Photo2 => 'Segunda imaxe',
+ Photo3 => 'Terceira imaxe',
+ Photo4 => 'Cuarta imaxe',
+ Comments => 'Comentarios',
+
+ Perfect => 'Perfecto',
+ Good => 'Bo',
+ Average => 'Avanzado',
+ Poor => 'Pobre',
+
+ CompleteYes => 'Contidos completos',
+ CompleteNo => 'Pezas perdidas',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ Personal => 'Persoal',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuado polo menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/GL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..78f9e28
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::GL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de libros',
+ Items => {0 => 'Libro',
+ 1 => 'Libro',
+ X => 'Libros'},
+ NewItem => 'Novo libro',
+
+ Isbn => 'ISBN',
+ Title => 'Título',
+ Cover => 'Cuberta',
+ Authors => 'Autores',
+ Publisher => 'Editorial',
+ Publication => 'Data de publicación',
+ Language => 'Lingua',
+ Genre => 'Xénero',
+ Serie => 'Serie',
+ Rank => 'Puntuación',
+ Bookdescription => 'Descripción',
+ Pages => 'Páxinas',
+ Read => 'Lido',
+ Acquisition => 'Data de adquisición',
+ Edition => 'Edición',
+ Format => 'Formato',
+ Comments => 'Comentarios',
+ Url => 'Páxina web',
+ Translator => 'Traductor/a',
+ Artist => 'Artista',
+ DigitalFile => 'Digital version',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+
+ ReadNo => 'Non lido',
+ ReadYes => 'Lido',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/GL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..66f5d4a
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::GL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección numismática',
+ Items => {0 => 'Moeda',
+ 1 => 'Moeda',
+ X => 'Moedas'},
+ NewItem => 'Nova moeda',
+
+ Name => 'Nome',
+ Country => 'País',
+ Year => 'Ano',
+ Currency => 'Divisa',
+ Value => 'Valor',
+ Picture => 'Imaxe principal',
+ Diameter => 'Diametro',
+ Metal => 'Metal',
+ Edge => 'Borde',
+ Edge1 => 'Borde 1',
+ Edge2 => 'Borde 2',
+ Edge3 => 'Borde 3',
+ Edge4 => 'Borde 4',
+ Head => 'Cara',
+ Tail => 'Cruz',
+ Comments => 'Comentarios',
+ History => 'Historia',
+ Website => 'Sitio web',
+ Estimate => 'Estimación',
+ References => 'Referencias',
+ Type => 'Tipo',
+ Coin => 'Moeda',
+ Banknote => 'Billete',
+
+ Main => 'Principal',
+ Description => 'Descripción',
+ Other => 'Outra información',
+ Pictures => 'Imaxes',
+
+ Condition => 'Condición (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/GL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..757df7a
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::GL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de Comics',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'Novo comic',
+
+
+ Id => 'Id',
+ Name => 'Nome',
+ Series => 'Serie',
+ Volume => 'Volume',
+ Title => 'Título',
+ Writer => 'Guión',
+ Illustrator => 'Ilustracións',
+ Colourist => 'Cor',
+ Publisher => 'Editorial',
+ Synopsis => 'Resumo',
+ Collection => 'Colección',
+ PublishDate => 'Data de publicación',
+ PrintingDate => 'Data de impresión',
+ ISBN => 'ISBN',
+ Type => 'Tipo',
+ Category => 'Category',
+ Format => 'Formato',
+ NumberBoards => 'Número de planchas',
+ Signing => 'Signing',
+ Cost => 'Prezo',
+ Rating => 'Puntuación',
+ Comment => 'Comentarios',
+ Url => 'Sitio web',
+
+ FilterRatingSelect => 'Puntuado polo menos...',
+
+ Main => 'Elementos principais',
+ General => 'Xeral',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/GL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..7c40ab0
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::GL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de filmes',
+ Items => {0 => 'Filme',
+ 1 => 'Filme',
+ X => 'Filmes'},
+ NewItem => 'Novo filme',
+
+
+ Id => 'Id',
+ Title => 'Título',
+ Date => 'Data',
+ Time => 'Duración',
+ Director => 'Dirección',
+ Country => 'País',
+ MinimumAge => 'Idade mínima',
+ Genre => 'Xénero',
+ Image => 'Imaxe',
+ Original => 'Título orixinal',
+ Actors => 'Reparto',
+ Actor => 'Actor/Actriz',
+ Role => 'Papel',
+ Comment => 'Comentarios',
+ Synopsis => 'Resumo',
+ Seen => 'Vista',
+ Number => '# de media',
+ Format => 'Medio',
+ Region => 'Region',
+ Identifier => 'Identificador',
+ Url => 'Páxina web',
+ Audio => 'Audio',
+ Video => 'Formato de Video',
+ Trailer => 'Ficheiro de video',
+ Serie => 'Serie',
+ Rank => 'Puntuación',
+ Subtitles => 'Subtítulos',
+
+ SeenYes => 'Visto',
+ SeenNo => 'Non visto',
+
+ AgeUnrated => 'Sen puntuación',
+ AgeAll => 'Para todas as idades',
+ AgeParent => 'Guía adulta',
+
+ Main => 'Elementos principais',
+ General => 'Xeral',
+ Details => 'Detalles',
+
+ Information => 'Información',
+ Languages => 'Linguas',
+ Encoding => 'Codificación',
+
+ FilterAudienceAge => 'Idade da audiencia',
+ FilterSeenNo => '_Non vista polo momento',
+ FilterSeenYes => 'X_a vista',
+ FilterRatingSelect => 'Puntuada polo menos...',
+
+ ExtractSize => 'Tamaño',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCgames.pm b/lib/gcstar/GCLang/GL/GCModels/GCgames.pm
new file mode 100644
index 0000000..b5a84ca
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::GL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de Videoxogos',
+ Items => {0 => 'Xogo',
+ 1 => 'Xogo',
+ X => 'Xogos'},
+ NewItem => 'Novo Xogo',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nome',
+ Platform => 'Plataforma',
+ Players => 'Numero de xogadores',
+ Released => 'Data de lanzamento',
+ Editor => 'Editora',
+ Developer => 'Desenvolvemento',
+ Genre => 'Xénero',
+ Box => 'Imaxe da caixa',
+ Case => 'Caso',
+ Manual => 'Manual de instruccións',
+ Completion => 'Completo (%)',
+ Executable => 'Executable',
+ Description => 'Descrición',
+ Codes => 'Códigos',
+ Code => 'Código',
+ Effect => 'Efecto',
+ Secrets => 'Segredos',
+ Screenshots => 'Capturas de pantalla',
+ Screenshot1 => 'Primeira captura',
+ Screenshot2 => 'Segunda captura',
+ Comments => 'Comentarios',
+ Url => 'Páxina web',
+ Unlockables => 'Non bloqueables',
+ Unlockable => 'Non bloqueable',
+ Howto => 'Como desbloquear',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ Tips => 'Consello',
+ Information => 'Información',
+
+ FilterRatingSelect => 'Puntuado polo menos...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..4ea1535
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::GL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/GL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..0f7c128
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::GL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/GL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f8d1ce8
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::GL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de música',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albumes'},
+ NewItem => 'Novo album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Título',
+ Cover => 'Cuberta',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Duración',
+ Release => 'Data de lanzamento',
+ Genre => 'Xénero',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Lista de pistas',
+ Number => 'Número',
+ Track => 'Título',
+ Time => 'Tempo',
+
+ Composer => 'Composición',
+ Producer => 'Producción',
+ Playlist => 'Lista de reproducción',
+ Comments => 'Comentarios',
+ Label => 'Etiqueta',
+ Url => 'Páxina web',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..f3bd3df
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::GL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..2e8f73b
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::GL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..4be564e
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::GL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/GL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..b492568
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::GL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCModels/GCwines.pm b/lib/gcstar/GCLang/GL/GCModels/GCwines.pm
new file mode 100644
index 0000000..03a36f7
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::GL::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colección de viños',
+ Items => {0 => 'Viño',
+ 1 => 'Viño',
+ X => 'Viños'},
+ NewItem => 'Novo Viño',
+
+ Name => 'Nome',
+ Designation => 'Denominación',
+ Vintage => 'Colleita',
+ Vineyard => 'Viñedo',
+ Type => 'Tipo',
+ Grapes => 'Uva',
+ Soil => 'Terra',
+ Producer => 'Producción',
+ Country => 'País',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcol (%)',
+ Medal => 'Medalla',
+
+ Storage => 'Almacenamento',
+ Location => 'Localización',
+ ShelfIndex => 'Ãndice',
+ Quantity => 'Cantidade',
+ Acquisition => 'Adquisición',
+ PurchaseDate => 'Data de compra',
+ PurchasePrice => 'Prezo de compra',
+ Gift => 'Regalo',
+ BottleLabel => 'Etiqueta da botella',
+ Website => 'Referencias na web',
+
+ Tasted => 'Catado',
+ Comments => 'Comentarios',
+ Serving => 'Dose',
+ TastingField => 'Notas da cata',
+
+ General => 'Xeral',
+ Details => 'Detalles',
+ Tasting => 'Cata',
+
+ TastedNo => 'Sen catar',
+ TastedYes => 'Catado',
+
+ FilterRange => 'Rango',
+ FilterTastedNo => '_Non foi catado',
+ FilterTastedYes => 'Xa foi catado',
+ FilterRatingSelect => 'Puntuado polo menos...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/GL/GCstar.pm b/lib/gcstar/GCLang/GL/GCstar.pm
new file mode 100644
index 0000000..8f76d22
--- /dev/null
+++ b/lib/gcstar/GCLang/GL/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::GL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Galego',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Aviso</b>:
+
+A información descargada de sitios web (a través dos
+complementos de procura) é só para <b>uso persoal</b>.
+
+Calquera redistribución está prohibida sen a
+<b>autorización explícita</b> do sitio.
+
+Para determinar a que web pertence a información, debe
+utilizar <b>o botón situado debaixo dos detalles do elemento</b>.',
+
+ 'AllItemsFiltered' => 'Non hai elementos cumpran os criterios de filtrado', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalar en ',
+ 'InstallMandatory' => 'Compoñentes obrigatorios',
+ 'InstallOptional' => 'Compoñentes opcionais',
+ 'InstallErrorMissing' => 'Erro : ten que instalar os seguintes compoñentes Perl: ',
+ 'InstallPrompt' => 'Directorio base para a instalación [/usr/local]: ',
+ 'InstallEnd' => 'Fin da instalación',
+ 'InstallNoError' => 'Ningún erro',
+ 'InstallLaunch' => 'Para usar a aplicación, execútea ',
+ 'InstallDirectory' => 'Directorio Base',
+ 'InstallTitle' => 'Instalación de GCstar',
+ 'InstallDependencies' => 'Dependencias',
+ 'InstallPath' => 'Ruta',
+ 'InstallOptions' => 'Opcións',
+ 'InstallSelectDirectory' => 'Seleccionar o directorio base para a instalación',
+ 'InstallWithClean' => 'Eliminar ficheiros que se atopen no directorio de instalación',
+ 'InstallWithMenu' => 'Engadir GCstar ao menú de Aplicacións',
+ 'InstallNoPermission' => 'Erro: Non ten permiso para escribir no directorio seleccionado',
+ 'InstallMissingMandatory' => 'Non se cumpren algunhas dependencias obrigatorias-. Non pode instalar GCstar até que se cumpran as dependencias.',
+ 'InstallMissingOptional' => 'Algunhas dependencias opcionais non se cumpren. Pode ver unha listaxe máis abaixo. GCstar pode instalarse pero algunhas características non estarán dispoñibles.',
+ 'InstallMissingNone' => 'Cúmprense todas as dependencias. Pode continuar a instalación de GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Non dispoñible',
+ 'InstallMissingFor' => 'Non dispoñible por',
+ 'InstallCleanDirectory' => 'Eliminando ficheiros de GCstar no directorio: ',
+ 'InstallCopyDirectory' => 'A copiar ficheiros no directorio: ',
+ 'InstallCopyDesktop' => 'A copiar o ficheiro de escritorio en: ',
+
+#Update
+ 'UpdateUseProxy' => 'Usar Proxy (premer enter se non se usa ningún): ',
+ 'UpdateNoPermission' => 'Denegouse o permiso de escritura neste directorio: ',
+ 'UpdateNone' => 'Non se atoparon actualizacións',
+ 'UpdateFileNotFound' => 'Non se atopou o ficheiro',
+
+#Splash
+ 'SplashInit' => 'Inicialización',
+ 'SplashLoad' => 'A cargar a colección',
+ 'SplashDisplay' => 'A mostrar a colección',
+ 'SplashSort' => 'A ordear a colección',
+ 'SplashDone' => 'Listo',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Semella que estivo a utilizar GCfilms con anterioridade. Que quere importar desde GCfilms para GCstar (isto non afectará aos ficheiros de GCfilms se quere seguilos usando)?',
+ 'GCfilmsImportOptions' => 'Preferencias',
+ 'GCfilmsImportData' => 'Listaxe de Filmes',
+
+#Menus
+ 'MenuFile' => '_Ficheiro',
+ 'MenuNewList' => '_Nova Colección',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Coleccións _Recentes',
+ 'MenuLend' => 'Amosar Elementos _Prestados', # Accepts model codes
+ 'MenuImport' => '_Importar',
+ 'MenuExport' => '_Exportar',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Editar',
+ 'MenuDuplicate' => 'Du_plicar elemento', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Elimina_r Elemento', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Cambiar campos da colección',
+ 'MenuEditLockItems' => '_Bloquear Colección',
+
+ 'MenuDisplay' => 'F_iltros',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'Procura A_vanzada ',
+ 'MenuViewAllItems' => '_Amosar todos os elementos', # Accepts model codes
+ 'MenuNoFilter' => '_Calquera',
+
+ 'MenuConfiguration' => '_Configuración',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Información amosada',
+ 'MenuBorrowers' => '_Prestatarios',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversión de Xéneros',
+
+ 'MenuBookmarks' => 'As miñas _Coleccións',
+ 'MenuBookmarksAdd' => 'Engadir colección _actual',
+ 'MenuBookmarksEdit' => '_Editar coleccións favoritas',
+
+ 'MenuHelp' => '_Axuda',
+ 'MenuHelpContent' => '_Contido',
+ 'MenuAllPlugins' => 'Ver com_plementos',
+ 'MenuBugReport' => 'Comunicar un problema',
+ 'MenuAbout' => '_Acerca de GCstar',
+
+ 'MenuNewWindow' => 'Amosar elemento nunha _Nova Xanela', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandir todo',
+ 'ContextCollapseAll' => 'Contraer todo',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Introduza un valor',
+
+ 'RemoveConfirm' => 'Está seguro de que quere eliminar este elemento?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+
+ 'DefaultNewItem' => 'Novo elemento', # Accepts model codes
+ 'NewItemTooltip' => 'Engadir un novo elemento', # Accepts model codes
+ 'NoItemFound' => 'Non se atopou nada. Gustaríalle buscar en outra páxina web?',
+ 'OpenList' => 'Seleccine unha colección',
+ 'SaveList' => 'Escolla onde gardar a colección',
+ 'SaveListTooltip' => 'Gardar a colección actual',
+ 'SaveUnsavedChanges' => 'Hai cambios na colección que non se gardaron todavía. Quere gardalos?',
+ 'SaveDontSave' => 'Non gardar',
+ 'PreferencesTooltip' => 'Aplicar as súas configuracións',
+ 'ViewTooltip' => 'Cambiar o tipo de visualización',
+ 'PlayTooltip' => 'Reproducir un video asociado ao elemento', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Gardando...',
+ 'StatusLoad' => 'Cargando...',
+ 'StatusSearch' => 'Procurando...',
+ 'StatusGetInfo' => 'Obtendo información...',
+ 'StatusGetImage' => 'Obtendo a imaxe...',
+
+ 'SaveError' => 'Non se pode gardar a listaxe. Comprobe os permisos de acceso e se hai suficiente espazo libre en disco..',
+ 'OpenError' => 'Non se pode abrir a listaxe. Comprobe os permisos de acceso.',
+ 'OpenFormatError' => 'Non se pode abrir a listaxe. Pode que o formato sexa incorrecto.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'O directorio seleccionado para gardar as imaxes non é correcto. Seleccione outro..',
+ 'OptionsCreationError'=> 'Non se pode crear o ficheiro de opcións: ',
+ 'OptionsOpenError'=> 'Non se pode abrir o ficheiro de opcións: ',
+ 'OptionsSaveError'=> 'Non se pode gardar o ficheiro de opcións: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Que pode ver esta noite ?',
+ 'RandomError'=> 'Non pode seleccionar ningún elemento', # Accepts model codes
+ 'RandomEnd'=> 'Non hai máis elementos', # Accepts model codes
+ 'RandomNextTip'=> 'Seguinte suxerencia',
+ 'RandomOkTip'=> 'Aceptar este elemento',
+
+ 'AboutTitle' => 'Acerca de GCstar',
+ 'AboutDesc' => 'Xestor Persoal de coleccións',
+ 'AboutVersion' => 'Versión',
+ 'AboutTeam' => 'Equipo',
+ 'AboutWho' => 'Christian Jodar (Tian): Gestión do proxecto, Programador
+Nyall Dawson (Zombiepig): Programador
+TPF: Programador
+Adolfo González: Programador
+',
+ 'AboutLicense' => 'Distribuido baixo os termos de GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Traducción ao Galego por Daniel Espiñeira',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo e deseño web por le Spektre',
+
+ 'ToolbarRandom' => 'Esta noite',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Seleccionar un tipo de colección',
+ 'ModelsPersonal' => 'Modelos persoais',
+ 'ModelsDefault' => 'Modelos predeterminados',
+ 'ModelsList' => 'Definición da colección',
+ 'ModelSettings' => 'Preferencias da colección',
+ 'ModelNewType' => 'Novo tipo de colección',
+ 'ModelName' => 'Nome do tipo de colección:',
+ 'ModelFields' => 'Campos',
+ 'ModelOptions' => 'Opcións',
+ 'ModelFilters' => 'Filtros',
+ 'ModelNewField' => 'Novo campo',
+ 'ModelFieldInformation' => 'Información',
+ 'ModelFieldName' => 'Etiqueta:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Grupo:',
+ 'ModelFieldValues' => 'Valores',
+ 'ModelFieldInit' => 'Predeterminado:',
+ 'ModelFieldMin' => 'Mínimo:',
+ 'ModelFieldMax' => 'Máximo:',
+ 'ModelFieldList' => 'Listaxe de valores:',
+ 'ModelFieldListLegend' => '<i>Separado por comas</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Texto curto',
+ 'ModelFieldTypeLongText' => 'Texto longo',
+ 'ModelFieldTypeYesNo' => 'Si/Non',
+ 'ModelFieldTypeNumber' => 'Número',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Listaxe de valores predefinidos',
+ 'ModelFieldTypeImage' => 'Imaxe',
+ 'ModelFieldTypeSingleList' => 'Listaxe simple',
+ 'ModelFieldTypeFile' => 'Campo',
+ 'ModelFieldTypeFormatted' => 'Dependente doutros campos',
+ 'ModelFieldParameters' => 'Parámetros',
+ 'ModelFieldHasHistory' => 'Usar un historial',
+ 'ModelFieldFlat' => 'Amosar nunha sóa liña',
+ 'ModelFieldStep' => 'Paso incremental:',
+ 'ModelFieldFileFormat' => 'Formato do ficheiro:',
+ 'ModelFieldFileFile' => 'Ficheiro simple',
+ 'ModelFieldFileImage' => 'Imaxe',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Usar campos',
+ 'ModelOptionsFieldsAuto' => 'Automático',
+ 'ModelOptionsFieldsNone' => 'Ningún',
+ 'ModelOptionsFieldsTitle' => 'Como título',
+ 'ModelOptionsFieldsId' => 'Como identificador',
+ 'ModelOptionsFieldsCover' => 'Como cuberta',
+ 'ModelOptionsFieldsPlay' => 'Para botón Play',
+ 'ModelCollectionSettings' => 'Preferencias da colección',
+ 'ModelCollectionSettingsLending' => 'Os elementos pódense prestar',
+ 'ModelCollectionSettingsTagging' => 'Os elementos pódense etiquetar',
+ 'ModelFilterActivated' => 'Debería ser nunha caixa de procura',
+ 'ModelFilterComparison' => 'Comparación',
+ 'ModelFilterContain' => 'Contén',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Rango',
+ 'ModelFilterNumeric' => 'Comparación numérica',
+ 'ModelFilterQuick' => 'Crear un filtro rápido',
+ 'ModelTooltipName' => 'Utilice un nome para reutilizar este modelo para outras coleccións. Se o deixa baleiro, as preferencias gardaranse directamente na propia colección.',
+ 'ModelTooltipLabel' => 'O nome do campo tal e como será amosado',
+ 'ModelTooltipGroup' => 'Usado para agrupar campos. Os elementos sen valor aquí estarán en un grupo predeterminado',
+ 'ModelTooltipHistory' => 'Deben gardarse os valores introducidos nunha lista asociada ao campo?',
+ 'ModelTooltipFormat' => 'Este formato úsase para determinar a acción que ten o botón Play ao abrir o ficheiro',
+ 'ModelTooltipLending' => 'Isto engadirá algúns campos para manexar os préstamos',
+ 'ModelTooltipTagging' => 'Isto engadirá algúns campos para manexar as etiquetas',
+ 'ModelTooltipNumeric' => 'Deben considerarse os valores como número na comparación?',
+ 'ModelTooltipQuick' => 'Isto engadirá un submenú no menú de Filtros',
+
+ 'ResultsTitle' => 'Seleccionar un elemento', # Accepts model codes
+ 'ResultsNextTip' => 'Procurarr na seguinte Web',
+ 'ResultsPreview' => 'Previsualizar',
+ 'ResultsInfo' => 'Pode engadir varios elementos á colección seleccionandoos mentres preme Ctrl ou Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferencias',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Navegador Web',
+ 'OptionsPlayer' => 'Reprodutor de Video',
+ 'OptionsAudio' => 'Reprodutor de Audio',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Directorio de Imaxes',
+ 'OptionsUseRelativePaths' => 'Utilizar rutas relativas para as imaxes',
+ 'OptionsLayout' => 'Disposición',
+ 'OptionsStatus' => 'Amosar barra de estado',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Atención: Os cambios nesta pestana non terán efecto até que reinicie a aplicación.',
+ 'OptionsRemoveConfirm' => 'Pedir confirmación antes de eliminar un elemento',
+ 'OptionsAutoSave' => 'Gardar automáticamente a colección',
+ 'OptionsAutoLoad' => 'Cargar a colección anterior ao inicio',
+ 'OptionsSplash' => 'Amosar pantalla de inicio',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Utilizar corrector ortográfico para os campos de texto longos',
+ 'OptionsProgramTitle' => 'Seleccione que programa se utilizará',
+ 'OptionsPlugins' => 'Sitio web do que recuperar os datos',
+ 'OptionsAskPlugins' => 'Preguntar (Todos os sitios web)',
+ 'OptionsPluginsMulti' => 'Algúns sitios',
+ 'OptionsPluginsMultiAsk' => 'Preguntar (Algúns sitios web)',
+ 'OptionsPluginsMultiPerField' => 'Algúns sitios (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Definir a listaxe',
+ 'OptionsAskImport' => 'Seleccione os campos para importar',
+ 'OptionsProxy' => 'Usar un proxy',
+ 'OptionsCookieJar' => 'Utilizar este ficheiro cookie jar',
+ 'OptionsLang' => 'Linguaxe',
+ 'OptionsMain' => 'Principal',
+ 'OptionsPaths' => 'Rutas',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Características',
+ 'OptionsDisplay' => 'Visualización',
+ 'OptionsToolbar' => 'Barra de ferramentas',
+ 'OptionsToolbars' => {0 => 'Ningún', 1 => 'Pequeno', 2 => 'Grande', 3 => 'Predeterminado do Sistema'},
+ 'OptionsToolbarPosition' => 'Posición',
+ 'OptionsToolbarPositions' => {0 => 'Arriba', 1 => 'Abaixo', 2 => 'Esquerda', 3 => 'Derecha'},
+ 'OptionsExpandersMode' => 'Extensores demasiado longos',
+ 'OptionsExpandersModes' => {'asis' => 'Non facer nada', 'cut' => 'Cortar', 'wrap' => 'Axuste de liña'},
+ 'OptionsDateFormat' => 'Formato da data',
+ 'OptionsDateFormatTooltip' => 'O formato é o utilizado por strftime(3). Por defecto é %d/%m/%Y',
+ 'OptionsView' => 'Listaxe de elementos',
+ 'OptionsViews' => {0 => 'Texto', 1 => 'Imaxe', 2 => 'Detallado'},
+ 'OptionsColumns' => 'Columnas',
+ 'OptionsMailer' => 'Método de envío',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'O seu enderezo de correo electrónico',
+ 'OptionsTransform' => 'Poñer os artigos ao final dos títulos',
+ 'OptionsArticles' => 'Artigos (Separados por comas)',
+ 'OptionsSearchStop' => 'Permitir cancelar a procura',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Utilizar título principal se non está o título orixinal',
+ 'OptionsRestoreAccelerators' => 'Restaurar aceleradores',
+ 'OptionsHistory' => 'Tamaño do historial',
+ 'OptionsClearHistory' => 'Limpar historial',
+ 'OptionsStyle' => 'Pel',
+ 'OptionsDontAsk' => 'Non preguntar de novo',
+ 'OptionsPathProgramsGroup' => 'Aplicacións',
+ 'OptionsProgramsSystem' => 'Utilizar programas definidos polo sistema',
+ 'OptionsProgramsUser' => 'Utilizar programas especificados',
+ 'OptionsProgramsSet' => 'Definir programas',
+ 'OptionsPathImagesGroup' => 'Imaxes',
+ 'OptionsInternetDataGroup' => 'Importar datos',
+ 'OptionsInternetSettingsGroup' => 'Preferencias',
+ 'OptionsDisplayInformationGroup' => 'Amosar información',
+ 'OptionsDisplayArticlesGroup' => 'Artigos',
+ 'OptionsImagesDisplayGroup' => 'Visualización',
+ 'OptionsImagesStyleGroup' => 'Estilo',
+ 'OptionsDetailedPreferencesGroup' => 'Preferencias',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniencias',
+ 'OptionsPicturesFormat' => 'Prefixo para utilizar coas imaxes:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Título ou nome do elemento asociado',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ou . reemprazarase có directorio da colección (utilizar só ao comezo da ruta)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% reemprazarase polo nome do ficheiro da colección sen o sufixo (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% debería ser utilizado só ao inicio da ruta para as imaxes',
+ 'OptionsConfigureMailers' => 'Configurar programas de correo',
+
+ 'ImagesOptionsButton' => 'Preferencias',
+ 'ImagesOptionsTitle' => 'Preferencias para a listaxe de imaxes',
+ 'ImagesOptionsSelectColor' => 'Seleccionar unha cor',
+ 'ImagesOptionsUseOverlays' => 'Usar superposición de imaxes',
+ 'ImagesOptionsBg' => 'Fondo',
+ 'ImagesOptionsBgPicture' => 'Utilizar unha imaxe de fondo',
+ 'ImagesOptionsFg'=> 'Selección',
+ 'ImagesOptionsBgTooltip' => 'Cambiar a cor de fondo',
+ 'ImagesOptionsFgTooltip'=> 'Cambiar a selección de cor',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Tamaño',
+ 'ImagesOptionsSizeList' => {0 => 'Moi pequeno', 1 => 'Pequeno', 2 => 'Medio', 3 => 'Grande', 4 => 'Moi grande'},
+ 'ImagesOptionsSizeTooltip' => 'Seleccionar o tamaño da imaxe',
+
+ 'DetailedOptionsTitle' => 'Preferencias para a listaxe detallada',
+ 'DetailedOptionsImageSize' => 'Tamaño das imaxes',
+ 'DetailedOptionsGroupItems' => 'Agrupar elementos por',
+ 'DetailedOptionsSecondarySort' => 'Ordenar campos segundo descendencia',
+ 'DetailedOptionsFields' => 'Seleccionar campos a amosar',
+ 'DetailedOptionsGroupedFirst' => 'Manter xuntos elementos orfos',
+ 'DetailedOptionsAddCount' => 'Engadir número de elementos ás categorías',
+
+ 'ExtractButton' => 'Información',
+ 'ExtractTitle' => 'Información do ficheiro',
+ 'ExtractImport' => 'Utilizar valores',
+
+ 'FieldsListOpen' => 'Cargar unha listaxe de ficheiros desde un ficheiro',
+ 'FieldsListSave' => 'Gardar listaxe de cmapos a un ficheiro',
+ 'FieldsListError' => 'Esta listaxe de ficheiros non pode utilizase con este tipo de colección',
+ 'FieldsListIgnore' => '--- Ignorar',
+
+ 'ExportTitle' => 'Exportar listaxe de elementos',
+ 'ExportFilter' => 'Exportar só os elementos amosados',
+ 'ExportFieldsTitle' => 'Ficheiros a exportar',
+ 'ExportFieldsTip' => 'Seleccione os ficheiros que quere exportar',
+ 'ExportWithPictures' => 'Copiar imaxes nun sub-directorio',
+ 'ExportSortBy' => 'Ordear por',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Importar outra listaxe de elementos',
+ 'ImportExportData' => 'Datos',
+ 'ImportExportFile' => 'Ficheiro',
+ 'ImportExportFieldsUnused' => 'Campos sen utilizar',
+ 'ImportExportFieldsUsed' => 'Campos utilizados',
+ 'ImportExportFieldsFill' => 'Engadir todo',
+ 'ImportExportFieldsClear' => 'Eliminar todos',
+ 'ImportExportFieldsEmpty' => 'Ten que escolles polo menos un campo',
+ 'ImportExportFileEmpty' => 'Ten que especificar un nome de campo',
+ 'ImportFieldsTitle' => 'Campos a importar',
+ 'ImportFieldsTip' => 'Seleccione os campos que quere importar',
+ 'ImportNewList' => 'Crear unha nova colección',
+ 'ImportCurrentList' => 'Engadir á colección actual',
+ 'ImportDropError' => 'Houbo un erro abrindo algúns dos ficheiros. Cargarase a listaxe anterior.',
+ 'ImportGenerateId' => 'Xerar identificador para cada elemento',
+
+ 'FileChooserOpenFile' => 'Selecione o ficheiro',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Seleccione un directorio',
+ 'FileChooserOverwrite' => 'Este ficheiro xa existe. Quere sobreescribilo?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compacto',
+ 'PanelReadOnly' => 'Só Lectura',
+ 'PanelForm' => 'Pestanas',
+
+ 'PanelSearchButton' => 'Buscar información',
+ 'PanelSearchTip' => 'Buscar na web información sobre este nome',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Preme na imaxe para seleccionar unha diferente.',
+ 'PanelImageTipView' => 'Preme na imaxe para vela no seu tamaño real.',
+ 'PanelImageTipMenu' => ' Botón dereito para máis opcións.',
+ 'PanelImageTitle' => 'Seleccione una imaxe',
+ 'PanelImageNoImage' => 'Sen imaxe',
+ 'PanelSelectFileTitle' => 'Seleccione un ficheiro',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurar predeterminado',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Desde',
+ 'PanelTo' =>'A',
+
+ 'PanelWeb' => 'Ver información',
+ 'PanelWebTip' => 'Ver información na web acerca deste elemento', # Accepts model codes
+ 'PanelRemoveTip' => 'Eliminar elemento actual', # Accepts model codes
+
+ 'PanelDateSelect' => 'Seleccionar',
+ 'PanelNobody' => 'Ninguén',
+ 'PanelUnknown' => 'Descoñecido',
+ 'PanelAdded' => 'Engadir data',
+ 'PanelRating' => 'Puntuación',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Localidade',
+
+ 'PanelLending' => 'Prestamo',
+ 'PanelBorrower' => 'Prestatario',
+ 'PanelLendDate' => 'Fora desde',
+ 'PanelHistory' => 'Historial de préstamo',
+ 'PanelReturned' => 'Elemento devolto', # Accepts model codes
+ 'PanelReturnDate' => 'Data de devolución',
+ 'PanelLendedYes' => 'Prestado',
+ 'PanelLendedNo' => 'Dispoñible',
+
+ 'PanelTags' => 'Etiquetas',
+ 'PanelFavourite' => 'Favorito',
+ 'TagsAssigned' => 'Etiquetas asignadas',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Calquera',
+ 'CheckYes' => 'Si',
+ 'CheckNo' => 'Non',
+
+ 'ToolbarAll' => 'Ver todo',
+ 'ToolbarAllTooltip' => 'Ver todos os elementos',
+ 'ToolbarGroupBy' => 'Agrupar por',
+ 'ToolbarGroupByTooltip' => 'Seleccionar o campo para agrupar os elementos da lista',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Procurar un elemento',
+ 'PluginsQuery' => 'Procura',
+ 'PluginsFrame' => 'Sitio Web de búsqueda',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nome',
+ 'PluginsSearchFields' => 'Campos de búsqueda',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Linguaxe',
+ 'PluginsUseSite' => 'Utilizar sitio web seleccionado para outras procuras no futuro',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configuración do prestatario',
+ 'BorrowersList' => 'Prestatarios',
+ 'BorrowersName' => 'Nome',
+ 'BorrowersEmail' => 'e-mail',
+ 'BorrowersAdd' => 'Engadir',
+ 'BorrowersRemove' => 'Eliminar',
+ 'BorrowersEdit' => 'Editar',
+ 'BorrowersTemplate' => 'Plantilla de correo',
+ 'BorrowersSubject' => 'Asunto do correo',
+ 'BorrowersNotice1' => '%1 reemprazarase có nome do prestatario/a',
+ 'BorrowersNotice2' => '%2 reemprazarase có título do elemento',
+ 'BorrowersNotice3' => '%3 reemprazarase coa data do préstamo',
+
+ 'BorrowersImportTitle' => 'Importar información dos prestatarios',
+ 'BorrowersImportType' => 'Formato do ficheiro:',
+ 'BorrowersImportFile' => 'Ficheiro:',
+
+ 'BorrowedTitle' => 'Elementos prestados', # Accepts model codes
+ 'BorrowedDate' => 'Desde',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Enviar un correo electrónico',
+ 'MailFrom' => 'Desde: ',
+ 'MailTo' => 'A: ',
+ 'MailSubject' => 'Asunto: ',
+ 'MailSmtpError' => 'Houbo un problema conectando có servidor SMTP',
+ 'MailSendmailError' => 'Houbo un problema ao lanzar sendmail',
+
+ 'SearchTooltip' => 'Procurar todos os elementos', # Accepts model codes
+ 'SearchTitle' => 'Procura de elementos', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Campo a reemprazar',
+ 'QueryReplaceOld' => 'Valor actual',
+ 'QueryReplaceNew' => 'Novo valor',
+ 'QueryReplaceLaunch' => 'Reemprazar',
+
+ 'ImportWindowTitle' => 'Seleccione os campos para importar',
+ 'ImportViewPicture' => 'Ver imaxe',
+ 'ImportSelectAll' => 'Seleccionar todo',
+ 'ImportSelectNone' => 'Non seleccionar ningún',
+
+ 'MultiSiteTitle' => 'Sitios web para as procuras',
+ 'MultiSiteUnused' => 'Complementos sen usar',
+ 'MultiSiteUsed' => 'Complementos para usar',
+ 'MultiSiteLang' => 'Encher a listaxe con plugins en galego',
+ 'MultiSiteEmptyError' => 'Ten una listaxe de sitios baleira',
+ 'MultiSiteClear' => 'Limpar listaxe',
+
+ 'DisplayOptionsTitle' => 'Elementos para amosar',
+ 'DisplayOptionsAll' => 'Seleccionar todos',
+ 'DisplayOptionsSearch' => 'Botón de procura',
+
+ 'GenresTitle' => 'Conversión de xénero',
+ 'GenresCategoryName' => 'Xénero a utilizar',
+ 'GenresCategoryMembers' => 'Xérnero para reemprazar',
+ 'GenresLoad' => 'Cargar unha listaxe',
+ 'GenresExport' => 'Gardar listaxe a un ficheiro',
+ 'GenresModify' => 'Editar conversión',
+
+ 'PropertiesName' => 'Nome da colección',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Propietario/a',
+ 'PropertiesEmail' => 'Correo electrónico',
+ 'PropertiesDescription' => 'Descripción',
+ 'PropertiesFile' => 'Información de ficheiro',
+ 'PropertiesFilePath' => 'Ruta completa',
+ 'PropertiesItemsNumber' => 'Número de elementos', # Accepts model codes
+ 'PropertiesFileSize' => 'Tamaño',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propiedades da colección',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programas de envío de correo',
+ 'MailProgramsName' => 'Nome',
+ 'MailProgramsCommand' => 'Liña de comandos',
+ 'MailProgramsRestore' => 'Restaurar valores predeterminados',
+ 'MailProgramsAdd' => 'Engadir un programa',
+ 'MailProgramsInstructions' => 'Na liña de comandos, fanse algunhas substitucións:
+ %f reemprázase có enderezo de correo electrónico do/a usuario/a.
+ %t reemprázase có enderezo do destinatario/a.
+ %s reemprázase có asunto da mensaxe.
+ %b reemprázase có corpo da mensaxe.',
+
+ 'BookmarksBookmarks' => 'Favoritos',
+ 'BookmarksFolder' => 'Cartafois',
+ 'BookmarksLabel' => 'Etiqueta',
+ 'BookmarksPath' => 'Ruta',
+ 'BookmarksNewFolder' => 'Novo cartafol',
+
+ 'AdvancedSearchType' => 'Tipo de procura',
+ 'AdvancedSearchTypeAnd' => 'Elementos que cumpren todos os criterios de procura', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elementos que cumpren polo menos un criterio', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criterios',
+ 'AdvancedSearchAnyField' => 'Calquer campo',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Reporte de erro xerado por GCstar',
+ 'BugReportVersion' => 'Versión',
+ 'BugReportPlatform' => 'Sistema Operativo',
+ 'BugReportMessage' => 'Mensaxe de erro',
+ 'BugReportInformation' => 'Información adicional',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..0e08963
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::HU::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Mezőnevek beszúrása a fejlécbe',
+ 'Separator' => 'Elválasztó',
+ 'Replacement' => 'Az elválasztó cseréje erre',
+ 'Charset' => 'Karakterkódolás',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..89afafe
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::HU::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..7cc28be
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::HU::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Érvénytelen sablonfájl',
+ 'UseFile' => 'Alább megadott fájl használata',
+ 'WithJS' => 'Javascript használata',
+ 'FileTemplate' => 'Sablon',
+ 'Preview' => 'Előnézet',
+ 'NoPreview' => 'Előnézet nem elérhető',
+ 'TemplateExternalFile' => 'Sablonfájl',
+ 'Title' => 'Oldal címe',
+ 'InfoFile' => 'Filmlista ebben a fájlban: ',
+ 'InfoDir' => 'Képek itt: ',
+ 'HeightImg' => 'Az exportálandó képek magassága (pixelekben)',
+ 'OpenFileInBrowser' => 'A létrehozott fájl megnyitása webböngészőben',
+ 'Note' => 'A lista létrehozva a következővel <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Szöveg keresése',
+ 'SearchType1' => 'Csak cím',
+ 'SearchType2' => 'Teljes információ',
+ 'SearchButton' => 'Keresés',
+ 'SearchTitle' => 'Csak a kritériumoknak megfelelő filmek mutatása',
+ 'AllButton' => 'Mind',
+ 'AllTitle' => 'Minden film mutatása',
+ 'Expand' => 'Több',
+ 'ExpandTitle' => 'Bővített filminformációk mutatása',
+ 'Collapse' => 'Kevesebb',
+ 'CollapseTitle' => 'Összevont filminformációk mutatása',
+ 'Borrowed' => 'Kölcsönvéve: ',
+ 'NotBorrowed' => 'Elérhető',
+ 'Top' => 'Fennt',
+ 'Bottom' => 'Lennt',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..84003b2
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::HU::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..8f60cb8
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::HU::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'DROP utasítás beszúrása',
+ 'WithCreate' => 'CREATE utasítás beszúrása',
+ 'TableName' => 'Tábla név',
+ 'InfoFile' => 'SQL fájl: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..0000c41
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::HU::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archivum a fájban: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..44007b3
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::HU::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Sablon fájl',
+ 'ModelText' => 'Sablon szöveg',
+ 'Models' => 'Használandó sablon',
+ 'UseFile' => 'Fájl használata',
+ 'UseModel' => 'Szöveges terület használata',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9a54275
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::HU::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Hol keressen',
+ 'Default' => 'Alapértelmezett Alexandria könyvtár',
+ 'Specified' => 'Alábbi meghatározott könyvtár',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..6394977
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::HU::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Karakterkódolás',
+ 'Header' => 'Az első sor mellőzése',
+ 'Separator' => 'Elválasztó',
+ 'Plugin' => 'Használandó oldal',
+ 'UseFirst' => 'Az első kijelölése több talál esetén',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..b89ca00
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::HU::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Mappa',
+ 'Recursive' => 'Almappák böngészése',
+ 'Suffixes' => 'A fájlok toldalékai, vagy kiterjesztései',
+ 'SuffixesTooltip' => 'A fájlok toldalékainak, vagy kiterjesztéseinek vesszővel elválasztott listájának megtekintése',
+ 'Remove' => 'Eltávolítva a nevekből',
+ 'RemoveTooltip' => 'A vesszővel elválasztott szavak listája, amiket el kellett távolítani a fájlnevekből a rövidített nevekhez',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..a5e43f3
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::HU::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Képek másolása',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportList.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportList.pm
new file mode 100644
index 0000000..31786de
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::HU::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Nevek listája',
+ 'Plugin' => 'Használandó oldal',
+ 'UseFirst' => 'Az első kijelölése több talál esetén',
+ 'CommentAuto' => 'Elem automatikus importálása.',
+ 'CommentSite' => 'Weboldal: ',
+ 'CommentTitle' => 'Cím: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..1b070eb
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::HU::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..a985c9f
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::HU::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'A fájl nem Tellico gyűjtemény',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..d3af82a
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::HU::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Show-k (epizódok) gyűjteménye',
+ Items => 'Epizódok',
+ NewItem => 'Új epizód',
+ NewSeries => 'Új sorozatok',
+ Episode => 'Epizód',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..99f3e2c
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::HU::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Show-k (sorozatok) gyűjteménye',
+ Items => 'Sorozatok',
+ NewItem => 'Új sorozatok',
+ Name => 'Név',
+ Season => 'Évad',
+ Part => 'Rész',
+ Episodes => 'Epizódok',
+ FirstAired => 'First Aired',
+ Time => 'Ep. hossza',
+ Producer => 'Producer',
+ Music => 'Zene',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..464ee91
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::HU::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Táblajáték gyűjtemény',
+ Items => {0 => 'Játék',
+ 1 => 'Játék',
+ X => 'Játékok'},
+ NewItem => 'Új játék',
+
+ Id => 'Azonosító',
+ Name => 'Név',
+ Original => 'Eredeti név',
+ Box => 'Borító kép',
+ DesignedBy => 'Tervezte',
+ PublishedBy => 'Kiadta',
+ Players => 'Játékosok száma',
+ PlayingTime => 'Játékidő',
+ SuggestedAge => 'Ajánlott kor',
+ Released => 'Kiadás',
+ Description => 'Leírás',
+ Category => 'Kategória',
+ Mechanics => 'Mechanizmusok',
+ ExpandedBy => 'Fejlesztő',
+ ExpansionFor => 'Fejlesztés',
+ GameFamily => 'Játékcsalád',
+ IllustratedBy => 'Illusztráló',
+ Url => 'Weboldal',
+ TimesPlayed => 'Játékok száma',
+ CompleteContents => 'Teljes részek',
+ Copies => 'Másolatok száma',
+ Condition => 'Ãllapot',
+ Photos => 'Fényképek',
+ Photo1 => 'Első kép',
+ Photo2 => 'Második kép',
+ Photo3 => 'Harmadik kép',
+ Photo4 => 'Negyedik kép',
+ Comments => 'Megjegyzések',
+
+ Perfect => 'Kiváló',
+ Good => 'Jó',
+ Average => 'Ãtlagos',
+ Poor => 'Szegényes',
+
+ CompleteYes => 'Teljes részek',
+ CompleteNo => 'Hiányzó részek',
+
+ General => 'Ãltalános',
+ Details => 'Részletek',
+ Personal => 'Személyes',
+ Information => 'Információ',
+
+ FilterRatingSelect => 'Értékelés _legalább...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCbooks.pm b/lib/gcstar/GCLang/HU/GCModels/GCbooks.pm
new file mode 100644
index 0000000..1225acb
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::HU::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Könyvgyűjtemény',
+ Items => {0 => 'Könyv',
+ 1 => 'Könyv',
+ X => 'Könyvek'},
+ NewItem => 'Új könyv',
+
+ Isbn => 'ISBN',
+ Title => 'Cím',
+ Cover => 'Borító',
+ Authors => 'Szerzők',
+ Publisher => 'Kiadó',
+ Publication => 'Kiadás dátuma',
+ Language => 'Nyelv',
+ Genre => 'Jellemzők',
+ Serie => 'Sorozatok',
+ Rank => 'Értékelés',
+ Bookdescription => 'Leírás',
+ Pages => 'Oldalak',
+ Read => 'Olvasva',
+ Acquisition => 'Bekerülés dátuma',
+ Edition => 'Kiadás',
+ Format => 'Formátum',
+ Comments => 'Megjegyzések',
+ Url => 'Weboldal',
+ Translator => 'Fordító',
+ Artist => 'Illusztrátor',
+ DigitalFile => 'Digital version',
+
+ General => 'Ãltalános',
+ Details => 'Részletek',
+
+ ReadNo => 'Nem olvasott',
+ ReadYes => 'Olvasott',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCcoins.pm b/lib/gcstar/GCLang/HU/GCModels/GCcoins.pm
new file mode 100644
index 0000000..094fa5a
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::HU::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Érmegyűjtemény',
+ Items => {0 => 'Érme',
+ 1 => 'Érme',
+ X => 'Érmék'},
+ NewItem => 'Új érme',
+
+ Name => 'Név',
+ Country => 'Ország',
+ Year => 'Év',
+ Currency => 'Pénznem',
+ Value => 'Érték',
+ Picture => 'Kép',
+ Diameter => 'ÃtmérÅ‘',
+ Metal => 'Fém',
+ Edge => 'Szegély',
+ Edge1 => 'Szegély 1',
+ Edge2 => 'Szegély 2',
+ Edge3 => 'Szegély 3',
+ Edge4 => 'Szegély 4',
+ Head => 'Fej',
+ Tail => 'Ãrás',
+ Comments => 'Megjegyzések',
+ History => 'Történelem',
+ Website => 'Weboldal',
+ Estimate => 'Becslés',
+ References => 'Referenciák',
+ Type => 'Típus',
+ Coin => 'Érme',
+ Banknote => 'Bankjegy',
+
+ Main => 'Ãltalános',
+ Description => 'Leírás',
+ Other => 'Egyéb információk',
+ Pictures => 'Képek',
+
+ Condition => 'Minőség (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCcomics.pm b/lib/gcstar/GCLang/HU/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d64f233
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::HU::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Képregénygyűjtemény',
+ Items => {0 => 'Képregények',
+ 1 => 'Képregény',
+ X => 'Képregények'},
+ NewItem => 'Új képregény',
+
+
+ Id => 'Id',
+ Name => 'Név',
+ Series => 'Sorozatok',
+ Volume => 'Kötet',
+ Title => 'Cím',
+ Writer => 'Ãró',
+ Illustrator => 'Illusztátor',
+ Colourist => 'Szinező',
+ Publisher => 'Kiadó',
+ Synopsis => 'Összegzés',
+ Collection => 'Gyűjtemény',
+ PublishDate => 'Kiadás dátuma',
+ PrintingDate => 'Nyomtatás dátuma',
+ ISBN => 'ISBN',
+ Type => 'Típus',
+ Category => 'Kategória',
+ Format => 'Formátum',
+ NumberBoards => 'Táblák száma',
+ Signing => 'Jelölés',
+ Cost => 'Ãr',
+ Rating => 'Értékelés',
+ Comment => 'Megjegyzések',
+ Url => 'Weboldal',
+
+ FilterRatingSelect => 'Értékelés _legalább...',
+
+ Main => 'FÅ‘ elemek',
+ General => 'Ãltalános',
+ Details => 'Részletek',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCfilms.pm b/lib/gcstar/GCLang/HU/GCModels/GCfilms.pm
new file mode 100644
index 0000000..674e1a0
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::HU::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmgyűjtemény',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Filmek'},
+ NewItem => 'Új film',
+
+
+ Id => 'Azonosító',
+ Title => 'Cím',
+ Date => 'Dátum',
+ Time => 'Hossz',
+ Director => 'Rendező',
+ Country => 'Ország',
+ MinimumAge => 'Ajánlott kor',
+ Genre => 'Jellemzők',
+ Image => 'Kép',
+ Original => 'Eredeti cím',
+ Actors => 'Szereposztás',
+ Actor => 'Színész',
+ Role => 'Szerep',
+ Comment => 'Megjegyzések',
+ Synopsis => 'Összegzés',
+ Seen => 'Megnézve',
+ Number => '# Média',
+ Format => 'Média',
+ Region => 'Régió',
+ Identifier => 'Azonosító',
+ Url => 'Weboldal',
+ Audio => 'Hang',
+ Video => 'Videó formátum',
+ Trailer => 'Videó fájl',
+ Serie => 'Sorozatok',
+ Rank => 'Értékelés',
+ Subtitles => 'Alcímek',
+
+ SeenYes => 'Megnézve',
+ SeenNo => 'Nincs megnézve',
+
+ AgeUnrated => 'Nem értékelt',
+ AgeAll => 'Korhatár nélkül',
+ AgeParent => 'Szülői felügyelettel',
+
+ Main => 'FÅ‘ elemek',
+ General => 'Ãltalános',
+ Details => 'Részletek',
+
+ Information => 'Információ',
+ Languages => 'Nyelvek',
+ Encoding => 'Kódolás',
+
+ FilterAudienceAge => 'Néző életkora',
+ FilterSeenNo => '_Még nem látott',
+ FilterSeenYes => '_Már látott',
+ FilterRatingSelect => 'Értékelés _legalább...',
+
+ ExtractSize => 'Méret',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCgames.pm b/lib/gcstar/GCLang/HU/GCModels/GCgames.pm
new file mode 100644
index 0000000..99138ed
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::HU::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Videójáték gyűjtemény',
+ Items => {0 => 'Játék',
+ 1 => 'Játék',
+ X => 'Játékok'},
+ NewItem => 'Új játék',
+
+ Id => 'Azonosító',
+ Ean => 'EAN',
+ Name => 'Név',
+ Platform => 'Platform',
+ Players => 'Játékosok száma',
+ Released => 'Kiadás dátuma',
+ Editor => 'Kiadó',
+ Developer => 'Fejlesztő',
+ Genre => 'Jellemzők',
+ Box => 'Doboz képe',
+ Case => 'Eredeti tok',
+ Manual => 'Kézikönyv',
+ Completion => 'Befejezés (%)',
+ Executable => 'Játszhatóság',
+ Description => 'Leírás',
+ Codes => 'Kódok',
+ Code => 'Kód',
+ Effect => 'Efektek',
+ Secrets => 'Titkok',
+ Screenshots => 'Képernyőképek',
+ Screenshot1 => 'Első képernyőkép',
+ Screenshot2 => 'Második képernyőkép',
+ Comments => 'Megjegyzések',
+ Url => 'Weboldal',
+ Unlockables => 'Megoldások',
+ Unlockable => 'Cél',
+ Howto => 'Megoldás módja',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Ãltalános',
+ Details => 'Összetevők',
+ Tips => 'Tippek',
+ Information => 'Információ',
+
+ FilterRatingSelect => 'Értékelés _Legalább...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..f2ebc83
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::HU::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCminicars.pm b/lib/gcstar/GCLang/HU/GCModels/GCminicars.pm
new file mode 100644
index 0000000..971e64c
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::HU::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCmusics.pm b/lib/gcstar/GCLang/HU/GCModels/GCmusics.pm
new file mode 100644
index 0000000..abf9999
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::HU::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zenegyűjtemény',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albumok'},
+ NewItem => 'Új album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Cím',
+ Cover => 'Borító',
+ Artist => 'Előadók',
+ Format => 'Formátum',
+ Running => 'Hossz',
+ Release => 'Kiadás dátuma',
+ Genre => 'Jellemzők',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Track lista',
+ Number => 'Szám',
+ Track => 'Cím',
+ Time => 'Idő',
+
+ Composer => 'Zeneszerző',
+ Producer => 'Gyártásvezető',
+ Playlist => 'Lejátszólista',
+ Comments => 'Megjegyzések',
+ Label => 'Cimke',
+ Url => 'Weboldal',
+
+ General => 'Ãltalános',
+ Details => 'Összetevők',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..aba734d
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::HU::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..b3864cf
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::HU::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..ab59a34
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::HU::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCstamps.pm b/lib/gcstar/GCLang/HU/GCModels/GCstamps.pm
new file mode 100644
index 0000000..eb0a9bd
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::HU::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCModels/GCwines.pm b/lib/gcstar/GCLang/HU/GCModels/GCwines.pm
new file mode 100644
index 0000000..2c1cc56
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::HU::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Borgyűjtemény',
+ Items => {0 => 'Bor',
+ 1 => 'Bor',
+ X => 'Borok'},
+ NewItem => 'Új bor',
+
+ Name => 'Név',
+ Designation => 'Megnevezés',
+ Vintage => 'Évjárat',
+ Vineyard => 'Pincészet',
+ Type => 'Típus',
+ Grapes => 'Szőlők',
+ Soil => 'Talaj',
+ Producer => 'Termelő',
+ Country => 'Ország',
+ Volume => 'Å°rtartalom (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Díjak és elismerések',
+
+ Storage => 'Tárolás',
+ Location => 'Hely',
+ ShelfIndex => 'Mutató',
+ Quantity => 'Mennyiség',
+ Acquisition => 'Beszerzés',
+ PurchaseDate => 'Beszerzés dátuma',
+ PurchasePrice => 'Beszerzési ár',
+ Gift => 'Ajándék',
+ BottleLabel => 'Palack címke',
+ Website => 'Referenciák a weben',
+
+ Tasted => 'Megízlelve',
+ Comments => 'Megjegyzések',
+ Serving => 'Kínálás',
+ TastingField => 'Bírálati megjegyzések',
+
+ General => 'Ãltalános',
+ Details => 'Összetevők',
+ Tasting => 'Ãzlelés',
+
+ TastedNo => 'Nincs megízlelve',
+ TastedYes => 'Megízlelve',
+
+ FilterRange => 'Érték',
+ FilterTastedNo => '_Még nem ízlelt',
+ FilterTastedYes => 'Már _ízlelt',
+ FilterRatingSelect => 'Értékelés _legalább...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/HU/GCstar.pm b/lib/gcstar/GCLang/HU/GCstar.pm
new file mode 100644
index 0000000..51b0c3e
--- /dev/null
+++ b/lib/gcstar/GCLang/HU/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::HU;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Magyar',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Figyelmeztetés</b>:
+
+A weboldalakról letöltött információk (a bővítményeken keresztül)
+<b>csak személyes használatra engedélyezettek</b>.
+
+Bármilyen újraközlés az oldal
+<b>külön engedélye</b> nélkül tilos.
+
+<b>Az elemek alatti gomb</b> megnyomásával nyomonkövethetjük,
+hogy melyik oldalról valók az információk.',
+
+ 'AllItemsFiltered' => 'Nincs megfelelő elem a keresési feltételeidhez', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Telepítés ide',
+ 'InstallMandatory' => 'Szükséges összetevők',
+ 'InstallOptional' => 'Választható összetevők',
+ 'InstallErrorMissing' => 'Hiba : A következő Perl összetevőket telepíteni kell: ',
+ 'InstallPrompt' => 'A telepítés alapkönyvtára [/usr/local]: ',
+ 'InstallEnd' => 'A telepítés befejeződött',
+ 'InstallNoError' => 'Nincs hiba',
+ 'InstallLaunch' => 'Az alkalmazás használatához indítsd ',
+ 'InstallDirectory' => 'Alapkönyvtár',
+ 'InstallTitle' => 'GCstar telepítése',
+ 'InstallDependencies' => 'Függőségek',
+ 'InstallPath' => 'Elérési út',
+ 'InstallOptions' => 'Beállítások',
+ 'InstallSelectDirectory' => 'Válassz ki egy alapkönyvtárat a telepítéshez',
+ 'InstallWithClean' => 'A telepítőkönyvtár fájlainak törlése',
+ 'InstallWithMenu' => 'A GCstar hozzáadása az Alkalmazások menühöz',
+ 'InstallNoPermission' => 'Hiba: Nincs írásjogod a kiválasztott könyvtárra',
+ 'InstallMissingMandatory' => 'Szükséges összetevők hiányoznak. Amíg nem telepíted őket, a GCstar nem telepíthető.',
+ 'InstallMissingOptional' => 'Néhány, alul listázott választható összetevő hiányzik. A GCstar telepíthető, de néhány funkció nem lesz elérhető.',
+ 'InstallMissingNone' => 'Nincs hiányzó függőség. Folytathatod a GCstar telepítését.',
+ 'InstallOK' => 'Rendben',
+ 'InstallMissing' => 'Hiányzik',
+ 'InstallMissingFor' => 'Hiányzó',
+ 'InstallCleanDirectory' => 'Eltávolítható GCstar-fájlok ebben a könyvtárban: ',
+ 'InstallCopyDirectory' => 'Fájlok másolása: ',
+ 'InstallCopyDesktop' => 'A desktopfájlok másolása ide: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy használata (üss Entert, ha mégsem): ',
+ 'UpdateNoPermission' => 'Ãrási engedély megtagadva a könyvtárban: ',
+ 'UpdateNone' => 'Nem található frissítés',
+ 'UpdateFileNotFound' => 'A fájl nem található',
+
+#Splash
+ 'SplashInit' => 'Inicializáció',
+ 'SplashLoad' => 'Gyűjtemény betöltése',
+ 'SplashDisplay' => 'Gyűjtemény megjelenítése',
+ 'SplashSort' => 'Gyűjtemény rendezése',
+ 'SplashDone' => 'Kész',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Úgy tűnik, hogy korábban használtad a GCfilms-t. Mit szeretnél a GCfilms-ből a GCstar-ba importálni (ez nem befolyásolja a GCfilms-t, ha használni akarod)?',
+ 'GCfilmsImportOptions' => 'Beállítások',
+ 'GCfilmsImportData' => 'Filmlisták',
+
+#Menus
+ 'MenuFile' => '_Fájl',
+ 'MenuNewList' => '_Új gyűjtemény',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'K_orábbi gyűjtemények',
+ 'MenuLend' => 'Kölcsönadott _elemek megjelenítése', # Accepts model codes
+ 'MenuImport' => '_Importálás',
+ 'MenuExport' => 'E_xportálás',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Szerkesztés',
+ 'MenuDuplicate' => 'Elem _kettőzése', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Elem eltávolítása', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Gyűjtemény mezőinek megváltoztatása',
+ 'MenuEditLockItems' => 'Gyűjtemény _zárolása',
+
+ 'MenuDisplay' => 'S_zűrő',
+ 'MenuSavedSearches' => 'Elmentett keresések',
+ 'MenuSavedSearchesSave' => 'A jelenlegi keresés elmentése',
+ 'MenuSavedSearchesEdit' => 'Elmentett keresések módosítása',
+ 'MenuAdvancedSearch' => 'Haladó keresés',
+ 'MenuViewAllItems' => '_Elemek mutatása', # Accepts model codes
+ 'MenuNoFilter' => '_Minden',
+
+ 'MenuConfiguration' => '_Beállítások',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Megjelenítendő elemek',
+ 'MenuBorrowers' => '_Kölcsönvevők',
+ 'MenuToolbarConfiguration' => '_Eszköztár beállítása',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Jellemzők konvertálása',
+
+ 'MenuBookmarks' => 'S_aját gyűjtemények',
+ 'MenuBookmarksAdd' => '_Jelenlegi gyűjtemény hozzáadása',
+ 'MenuBookmarksEdit' => 'Gyűjtemények _szerkesztése',
+
+ 'MenuHelp' => 'S_úgó',
+ 'MenuHelpContent' => '_Tartalom',
+ 'MenuAllPlugins' => 'Bővítmények _megtekintése',
+ 'MenuBugReport' => 'Hibajelentés _küldése',
+ 'MenuAbout' => '_A GCstar-ról',
+
+ 'MenuNewWindow' => 'Megjelenítés új _ablakban', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Szálak kibontása',
+ 'ContextCollapseAll' => 'Szálak összecsukása',
+ 'ContextChooseImage' => 'Válassz _Képet',
+ 'ContextOpenWith' => 'Megnyitás ezze_l',
+ 'ContextImageEditor' => 'Képszerkesztő',
+ 'ContextImgFront' => 'Borító',
+ 'ContextImgBack' => 'Hátlap',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Addj meg egy értéket',
+
+ 'RemoveConfirm' => 'Valóban el akarod távolítani az elemet?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Új elem', # Accepts model codes
+ 'NewItemTooltip' => 'Új elem hozzáadása', # Accepts model codes
+ 'NoItemFound' => 'Nincs találat. Akarsz egy másik oldalon keresni?',
+ 'OpenList' => 'Jelölj ki egy gyűjteményt',
+ 'SaveList' => 'Válaszd ki, hogy hova legyen mentve a gyűjtemény!',
+ 'SaveListTooltip' => 'Jelenlegi gyűjtemény mentése',
+ 'SaveUnsavedChanges' => 'Nem mentett változások vannak a gyűjteményedben. Akarod őket menteni?',
+ 'SaveDontSave' => 'Ne mentse',
+ 'PreferencesTooltip' => 'Beállítások',
+ 'ViewTooltip' => 'A gyűjtemény megjelenítésének változtatása',
+ 'PlayTooltip' => 'Az elemhez kapcsolódó videó lejátszása', # Accepts model codes
+ 'PlayFileNotFound' => 'Ezen a helyen nem található az indítandó fájl:',
+ 'PlayRetry' => 'Újra',
+
+ 'StatusSave' => 'Mentés...',
+ 'StatusLoad' => 'Betöltés...',
+ 'StatusSearch' => 'Haladó keresés...',
+ 'StatusGetInfo' => 'Információk betöltése...',
+ 'StatusGetImage' => 'Képek betöltése...',
+
+ 'SaveError' => 'Nem lehet menteni a listát. Ellenőrízd a jogokat és a szabad tárhelyet.',
+ 'OpenError' => 'Nem lehet megnyitni a listát. Ellenőrízd a jogokat.',
+ 'OpenFormatError' => 'Nem lehet megnyitni a listát. Hibás formátum.',
+ 'OpenVersionWarning' => 'A gyűjtemény egy újabb verziójú GCstar-ral készült. Ha elmented, elveszthetsz néhány adatot.',
+ 'OpenVersionQuestion' => 'Biztosan folytatni akarod?',
+ 'ImageError' => 'A képek mentéséhez kiválasztott könyvtár helytelen. Válassz egy másikat.',
+ 'OptionsCreationError'=> 'Nem lehet létrehozni a beállítás-fájlt: ',
+ 'OptionsOpenError'=> 'Nem lehet megnyitni a beállítás-fájlt: ',
+ 'OptionsSaveError'=> 'Nem lehet menteni a beállítás-fájlt: ',
+ 'ErrorModelNotFound' => 'Sablon nem található: ',
+ 'ErrorModelUserDir' => 'A felhasználó által meghatározott sablonok: ',
+
+ 'RandomTooltip' => 'Mit nézünk ma este ?',
+ 'RandomError'=> 'Nincs kijelölhető elem', # Accepts model codes
+ 'RandomEnd'=> 'Nincs több elem', # Accepts model codes
+ 'RandomNextTip'=> 'Következő javaslat',
+ 'RandomOkTip'=> 'Elem elfogadása',
+
+ 'AboutTitle' => 'A GCstar-ról',
+ 'AboutDesc' => 'Személyes gyűjteménykezelő',
+ 'AboutVersion' => 'Verzió',
+ 'AboutTeam' => 'Csapat',
+ 'AboutWho' => 'Christian Jodar (Tian): Project menedzser, Programozó
+Nyall Dawson (Zombiepig): Programozó
+TPF: Programozó
+Adolfo González: Programozó
+',
+ 'AboutLicense' => 'Készült a GNU GPL licensz alapján
+Logók Copyright le Spektre',
+ 'AboutTranslation' => 'Magyar fordítás: Takács László Krisztián tlk at t-online dot hu',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logó és webdizájn: le Spektre',
+
+ 'ToolbarRandom' => 'Ma este',
+
+ 'UnsavedCollection' => 'Nem mentett Gyűjtemény',
+ 'ModelsSelect' => 'A gyűjtemény típusának kiválasztása',
+ 'ModelsPersonal' => 'Személyes sablonok',
+ 'ModelsDefault' => 'Alapértelmezett sablonok',
+ 'ModelsList' => 'Gyűjteménysablon',
+ 'ModelSettings' => 'Gyűjtemény beállítások',
+ 'ModelNewType' => 'Új gyűjteménytípus',
+ 'ModelName' => 'A gyűjteménytípus neve:',
+ 'ModelFields' => 'Mezők',
+ 'ModelOptions' => 'Beállítások',
+ 'ModelFilters' => 'Szűrők',
+ 'ModelNewField' => 'Új mező',
+ 'ModelFieldInformation' => 'Információ',
+ 'ModelFieldName' => 'Címke:',
+ 'ModelFieldType' => 'Típus:',
+ 'ModelFieldGroup' => 'Csoport:',
+ 'ModelFieldValues' => 'Értékek',
+ 'ModelFieldInit' => 'Alapértelmezett:',
+ 'ModelFieldMin' => 'Minimális:',
+ 'ModelFieldMax' => 'Maximális:',
+ 'ModelFieldList' => 'Értékek listája:',
+ 'ModelFieldListLegend' => '<i>Vesszővel elválasztva</i>',
+ 'ModelFieldDisplayAs' => 'Megjelenik mint:',
+ 'ModelFieldDisplayAsText' => 'Szöveg',
+ 'ModelFieldDisplayAsGraphical' => 'Kategória Beállítás',
+ 'ModelFieldTypeShortText' => 'Rövid szöveg',
+ 'ModelFieldTypeLongText' => 'Hosszú szöveg',
+ 'ModelFieldTypeYesNo' => 'Igen/Nem',
+ 'ModelFieldTypeNumber' => 'Szám',
+ 'ModelFieldTypeDate' => 'Dátum',
+ 'ModelFieldTypeOptions' => 'Előredefiniált lista',
+ 'ModelFieldTypeImage' => 'Kép',
+ 'ModelFieldTypeSingleList' => 'Egyszerű lista',
+ 'ModelFieldTypeFile' => 'Fájl',
+ 'ModelFieldTypeFormatted' => 'Más mezőknek alárendelve',
+ 'ModelFieldParameters' => 'Parametéterek',
+ 'ModelFieldHasHistory' => 'Előzmények használata',
+ 'ModelFieldFlat' => 'Kijelzés egy sorban',
+ 'ModelFieldStep' => 'Növekvő lépés:',
+ 'ModelFieldFileFormat' => 'Fájl formátum:',
+ 'ModelFieldFileFile' => 'Egyszerű fájl',
+ 'ModelFieldFileImage' => 'Kép',
+ 'ModelFieldFileVideo' => 'Videó',
+ 'ModelFieldFileAudio' => 'Hang',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Mezők használata',
+ 'ModelOptionsFieldsAuto' => 'Automatikus',
+ 'ModelOptionsFieldsNone' => 'Semmi',
+ 'ModelOptionsFieldsTitle' => 'Címként',
+ 'ModelOptionsFieldsId' => 'Azonosítóként',
+ 'ModelOptionsFieldsCover' => 'Borítóként',
+ 'ModelOptionsFieldsPlay' => 'Lejátszógomb',
+ 'ModelCollectionSettings' => 'Gyűjtemény beállítások',
+ 'ModelCollectionSettingsLending' => 'Kölcsönadható elemek',
+ 'ModelCollectionSettingsTagging' => 'Cimkézhető elemek',
+ 'ModelFilterActivated' => 'A keresősávban kell legyen',
+ 'ModelFilterComparison' => 'Összehasonlítás',
+ 'ModelFilterContain' => 'Tartalmazza',
+ 'ModelFilterDoesNotContain' => 'Nem tartalmazza',
+ 'ModelFilterRegexp' => 'Pontos kifejezés',
+ 'ModelFilterRange' => 'Sorozat',
+ 'ModelFilterNumeric' => 'Számalapú összehasonlítás',
+ 'ModelFilterQuick' => 'Gyorsszűrő létrehozása',
+ 'ModelTooltipName' => 'Név a modell használatához a további gyűjteményekben. Ha üresen marad, akkor a beállítások közvetlenül a gyűjteményen belül tárolódnak',
+ 'ModelTooltipLabel' => 'A mező neve, ahogy az meg fog jelenni',
+ 'ModelTooltipGroup' => 'Mezők csoportosítása. Az érték nélküli elemek az alapértelmezett csoportba kerülnek',
+ 'ModelTooltipHistory' => 'Az itt megadott értékek a mezőhöz kapcsolt listába kerülnek elmentésre',
+ 'ModelTooltipFormat' => 'Ez a formátum használatos a megnyitógomb által elindított eseményhez',
+ 'ModelTooltipLending' => 'Mezők hozzáadása a kölcsönzés-kezelőhöz',
+ 'ModelTooltipTagging' => 'Mezők hozzáadása a cimke-kezelőhöz',
+ 'ModelTooltipNumeric' => 'Az értékek az összehasonlításban számként lesznek jelölve',
+ 'ModelTooltipQuick' => 'Almenü hozzáadása a szűrőkhöz',
+
+ 'ResultsTitle' => 'Elem kijelölése', # Accepts model codes
+ 'ResultsNextTip' => 'Keresés a következő oldalon',
+ 'ResultsPreview' => 'Előnézet',
+ 'ResultsInfo' => 'Több elem hozzáadása lehetséges a gyűjteményhez. Nyomd le a Crtl vagy a Shift gombot, és válassz', # Accepts model codes
+
+ 'OptionsTitle' => 'Beállítások',
+ 'OptionsExpertMode' => 'Haladó mód',
+ 'OptionsPrograms' => 'Bizonyos alkalmazások használata különböző médiákhoz, hagyd üresen az alapbeállítások használatához',
+ 'OptionsBrowser' => 'Böngésző',
+ 'OptionsPlayer' => 'Videólejátszó',
+ 'OptionsAudio' => 'Hanglejátszó',
+ 'OptionsImageEditor' => 'Képszerkesztő',
+ 'OptionsCdDevice' => 'CD-eszköz',
+ 'OptionsImages' => 'Képek',
+ 'OptionsUseRelativePaths' => 'Relatív elérési utak használata a képekhez',
+ 'OptionsLayout' => 'Elrendezés',
+ 'OptionsStatus' => 'ÃllapotjelzÅ‘ mutatása',
+ 'OptionsUseStars' => 'Csillagok használata az értékelések kijelzéséhez',
+ 'OptionsWarning' => 'Figyelem: A beállítások csak a program újraindítása után lépnek életbe.',
+ 'OptionsRemoveConfirm' => 'Kérjen megerősítést az elem törlése előtt',
+ 'OptionsAutoSave' => 'Gyűjtemény automatikus mentése',
+ 'OptionsAutoLoad' => 'Előző gyűjtemény betöltése induláskor',
+ 'OptionsSplash' => 'Bejelentkező képernyő mutatása',
+ 'OptionsTearoffMenus' => 'Előjegyzési menük engedélyezése',
+ 'OptionsSpellCheck' => 'Helyesírásellenőrző használata a hosszú, szöveges mezőkhöz',
+ 'OptionsProgramTitle' => 'Használandó program kiválasztása',
+ 'OptionsPlugins' => 'Oldal, ahol adatot keres',
+ 'OptionsAskPlugins' => 'Keres (Minden oldalon)',
+ 'OptionsPluginsMulti' => 'Több oldalon',
+ 'OptionsPluginsMultiAsk' => 'Keres (Több oldalon)',
+ 'OptionsPluginsMultiPerField' => 'Több oldalon (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Lista beállítása',
+ 'OptionsAskImport' => 'Importálandó mezők kiválasztása',
+ 'OptionsProxy' => 'Proxy használata',
+ 'OptionsCookieJar' => 'Használja ezt a jar-fájlt a cookie-khoz',
+ 'OptionsLang' => 'Nyelv',
+ 'OptionsMain' => 'Ãltalános',
+ 'OptionsPaths' => 'Útvonalak',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Tulajdonságok',
+ 'OptionsDisplay' => 'Megjelenítés',
+ 'OptionsToolbar' => 'Eszköztár',
+ 'OptionsToolbars' => {0 => 'Semmi', 1 => 'Kicsi', 2 => 'Nagy', 3 => 'Rendszer beállítás'},
+ 'OptionsToolbarPosition' => 'Pozíció',
+ 'OptionsToolbarPositions' => {0 => 'Fennt', 1 => 'Lennt', 2 => 'Balra', 3 => 'Jobbra'},
+ 'OptionsExpandersMode' => 'Túl hosszú kiterjesztések',
+ 'OptionsExpandersModes' => {'asis' => 'Úgy hagy', 'cut' => 'Kivág', 'wrap' => 'Tördel'},
+ 'OptionsDateFormat' => 'Dátum formátuma',
+ 'OptionsDateFormatTooltip' => 'A strftime(3) által használt dátum. Alapértelmezett %d/%m/%Y',
+ 'OptionsView' => 'Elemek listája',
+ 'OptionsViews' => {0 => 'Szöveg', 1 => 'Kép', 2 => 'Részletes'},
+ 'OptionsColumns' => 'Oszlopok',
+ 'OptionsMailer' => 'E-mail kliens',
+ 'OptionsSMTP' => 'Szerver',
+ 'OptionsFrom' => 'E-mail cím',
+ 'OptionsTransform' => 'Névelők helye a címek végén',
+ 'OptionsArticles' => 'Névelők (vesszővel elválasztva)',
+ 'OptionsSearchStop' => 'A keresés leállítható',
+ 'OptionsBigPics' => 'Nagy képek használata, ha lehetséges',
+ 'OptionsAlwaysOriginal' => 'A fő cím használata eredeti címként, ha az nem elérhető',
+ 'OptionsRestoreAccelerators' => 'Gyorsítók visszaállítása',
+ 'OptionsHistory' => 'Előzmények mérete',
+ 'OptionsClearHistory' => 'Előzmények törlése',
+ 'OptionsStyle' => 'Felület',
+ 'OptionsDontAsk' => 'Ne kérdezzen rá többet',
+ 'OptionsPathProgramsGroup' => 'Alkalmazások',
+ 'OptionsProgramsSystem' => 'Rendszer által kínált programok használata',
+ 'OptionsProgramsUser' => 'Egyéni programok használata',
+ 'OptionsProgramsSet' => 'Programok beállítása',
+ 'OptionsPathImagesGroup' => 'Képek',
+ 'OptionsInternetDataGroup' => 'Adat importálás',
+ 'OptionsInternetSettingsGroup' => 'Beállítások',
+ 'OptionsDisplayInformationGroup' => 'Információ megjelenítése',
+ 'OptionsDisplayArticlesGroup' => 'Névelők',
+ 'OptionsImagesDisplayGroup' => 'Kijelző',
+ 'OptionsImagesStyleGroup' => 'Stílus',
+ 'OptionsDetailedPreferencesGroup' => 'Beállítások',
+ 'OptionsFeaturesConveniencesGroup' => 'Kényelem',
+ 'OptionsPicturesFormat' => 'Előtag használata képekhez:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Az összekapcsolt elemek címe vagy neve',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% vagy . lecserélődik a gyűjtemény könyvtárára (csak az elérési út megadásánál használandó)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% lecserélődik a gyűjtemény nevére kiterjesztés nélkül (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% csak a képek elérési útjának megadásánál használható',
+ 'OptionsConfigureMailers' => 'Levelezőprogramok beállítása',
+
+ 'ImagesOptionsButton' => 'Beállítások',
+ 'ImagesOptionsTitle' => 'Képek listájának beállításai',
+ 'ImagesOptionsSelectColor' => 'Szín kijelölése',
+ 'ImagesOptionsUseOverlays' => 'Képrátétek használata',
+ 'ImagesOptionsBg' => 'Háttér',
+ 'ImagesOptionsBgPicture' => 'Háttérkép használata',
+ 'ImagesOptionsFg'=> 'Kiválasztás',
+ 'ImagesOptionsBgTooltip' => 'Háttérszín változtatása',
+ 'ImagesOptionsFgTooltip'=> 'Kijelölés színének változtatása',
+ 'ImagesOptionsResizeImgList' => 'Az oszlopok számának automatikus változtatása',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Méret',
+ 'ImagesOptionsSizeList' => {0 => 'Nagyon kicsi', 1 => 'Kicsi', 2 => 'Közepes', 3 => 'Nagy', 4 => 'Nagyon nagy'},
+ 'ImagesOptionsSizeTooltip' => 'Képméret kiválasztása',
+
+ 'DetailedOptionsTitle' => 'A részletes lista beállításai',
+ 'DetailedOptionsImageSize' => 'Képek mérete',
+ 'DetailedOptionsGroupItems' => 'Elemek csoportosítása',
+ 'DetailedOptionsSecondarySort' => 'Mezők csoportosítása gyerekeknek',
+ 'DetailedOptionsFields' => 'A megjelenítendő mezők kiválasztása',
+ 'DetailedOptionsGroupedFirst' => 'Ãrva sorok együttartása',
+ 'DetailedOptionsAddCount' => 'Elemek számának hozzáadása a kategóriákhoz',
+
+ 'ExtractButton' => 'Információ',
+ 'ExtractTitle' => 'Fájl információ',
+ 'ExtractImport' => 'Értékek használata',
+
+ 'FieldsListOpen' => 'Mezők listájának betöltése fájlból',
+ 'FieldsListSave' => 'Mezők listájának mentése fájlba',
+ 'FieldsListError' => 'A gyűjtemény ezen típusához ez a mezőlista nem használható',
+ 'FieldsListIgnore' => '--- Mellőz',
+
+ 'ExportTitle' => 'Elemlista exportálása',
+ 'ExportFilter' => 'Csak a kijelzett elemek exportálása',
+ 'ExportFieldsTitle' => 'Mezők exportálva',
+ 'ExportFieldsTip' => 'Válaszd ki az exportálandó elemeket',
+ 'ExportWithPictures' => 'Képek másolása az alkönyvtárba',
+ 'ExportSortBy' => 'Rendezés',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Egyéb elemlista importálása',
+ 'ImportExportData' => 'Adat',
+ 'ImportExportFile' => 'Fájl',
+ 'ImportExportFieldsUnused' => 'Nem használt mezők',
+ 'ImportExportFieldsUsed' => 'Használt mezők',
+ 'ImportExportFieldsFill' => 'Mindet hozzáad',
+ 'ImportExportFieldsClear' => 'Mindet eltávolít',
+ 'ImportExportFieldsEmpty' => 'Legalább egy mezőt kell választanod',
+ 'ImportExportFileEmpty' => 'Legalább egy fájlnevet meg kell adnod',
+ 'ImportFieldsTitle' => 'Mezők importálva',
+ 'ImportFieldsTip' => 'Jelöld ki az importálandó mezőket',
+ 'ImportNewList' => 'Új gyűjtemény létrehozása',
+ 'ImportCurrentList' => 'Hozzáadás a jelenlegi gyűjteményhez',
+ 'ImportDropError' => 'A fájl betöltésekor hiba történt. Az előző lista vissza lesz töltve.',
+ 'ImportGenerateId' => 'Azonosító létrehozása minden elemhez',
+
+ 'FileChooserOpenFile' => 'Válaszd ki a használandó fájlt!',
+ 'FileChooserDirectory' => 'Könyvtár',
+ 'FileChooserOpenDirectory' => 'Könyvtár kiválasztása',
+ 'FileChooserOverwrite' => 'A fájl már létezik. Felül akarod írni?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Egyszerű',
+ 'PanelReadOnly' => 'Csak olvasható',
+ 'PanelForm' => 'Cimkék',
+
+ 'PanelSearchButton' => 'Internetes keresés',
+ 'PanelSearchTip' => 'Keresés az interneten erre a névre',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Kattins a képre a változtatáshoz.',
+ 'PanelImageTipView' => 'Eredeti mérethez kattints a képre.',
+ 'PanelImageTipMenu' => ' Jobb klikk a további beállításokhoz.',
+ 'PanelImageTitle' => 'Kép kiválasztása',
+ 'PanelImageNoImage' => 'Nincs kép',
+ 'PanelSelectFileTitle' => 'Fájl kiválasztása',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Visszaállítás',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Feladó',
+ 'PanelTo' =>'Címzett',
+
+ 'PanelWeb' => 'Információk megtekintése',
+ 'PanelWebTip' => 'Információ megtekintése az interneten erről az elemről', # Accepts model codes
+ 'PanelRemoveTip' => 'Jelenlegi elem eltávolítása', # Accepts model codes
+
+ 'PanelDateSelect' => 'Kijelöl',
+ 'PanelNobody' => 'Senki',
+ 'PanelUnknown' => 'Ismeretlen',
+ 'PanelAdded' => 'Dátum hozzáadása',
+ 'PanelRating' => 'Értékelés',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Hely',
+
+ 'PanelLending' => 'Kölcsönzés',
+ 'PanelBorrower' => 'Kölcsönvevő',
+ 'PanelLendDate' => 'Kölcsönadás ideje',
+ 'PanelHistory' => 'Kölcsönzési előzmények',
+ 'PanelReturned' => 'Visszaadva', # Accepts model codes
+ 'PanelReturnDate' => 'Visszaadás dátuma',
+ 'PanelLendedYes' => 'Kölcsönadva',
+ 'PanelLendedNo' => 'Elérhető',
+
+ 'PanelTags' => 'Cimkék',
+ 'PanelFavourite' => 'Kedvencek',
+ 'TagsAssigned' => 'Kijelölt cimkék',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Bármelyik',
+ 'CheckYes' => 'Igen',
+ 'CheckNo' => 'Nem',
+
+ 'ToolbarAll' => 'Mindent megtekint',
+ 'ToolbarAllTooltip' => 'Elemek mutatása',
+ 'ToolbarGroupBy' => 'Csoportosítás',
+ 'ToolbarGroupByTooltip' => 'Jelöld ki a lista elemeinek csoportosításához használni kívánt mezőt',
+ 'ToolbarQuickSearch' => 'Gyorskeresés',
+ 'ToolbarQuickSearchLabel' => 'Keresés',
+ 'ToolbarQuickSearchTooltip' => 'Válaszd ki azt a mezőt, amiben keresnél. Üsd be a kifejezéseket és nyomj Entert',
+ 'ToolbarSeparator' => ' Elválasztó',
+
+ 'PluginsTitle' => 'Elem keresése',
+ 'PluginsQuery' => 'Kérdés',
+ 'PluginsFrame' => 'Oldal keresése',
+ 'PluginsLogo' => 'Logó',
+ 'PluginsName' => 'Név',
+ 'PluginsSearchFields' => 'Keresési mezők',
+ 'PluginsAuthor' => 'Szerző',
+ 'PluginsLang' => 'Nyelv',
+ 'PluginsUseSite' => 'A kiválasztott oldal használata további keresésekhez',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Kölcsönvevők beállításai',
+ 'BorrowersList' => 'Kölcsönvevők',
+ 'BorrowersName' => 'Név',
+ 'BorrowersEmail' => 'E-mail cím',
+ 'BorrowersAdd' => 'Hozzáadás',
+ 'BorrowersRemove' => 'Eltávolítás',
+ 'BorrowersEdit' => 'Szerkesztés',
+ 'BorrowersTemplate' => 'Levélsablon',
+ 'BorrowersSubject' => 'Levél tárgya',
+ 'BorrowersNotice1' => '%1 a kölcsönvevő nevére lesz cserélve',
+ 'BorrowersNotice2' => '%2 az elem címére lesz cserélve',
+ 'BorrowersNotice3' => '%3 a kölcsönzés dátumára lesz cserélve',
+
+ 'BorrowersImportTitle' => 'Információk importálása a kölcsönvevőkről',
+ 'BorrowersImportType' => 'Fájlformátum:',
+ 'BorrowersImportFile' => 'Fájl:',
+
+ 'BorrowedTitle' => 'Kölcsönadott elemek', # Accepts model codes
+ 'BorrowedDate' => 'Kölcsönadás ideje',
+ 'BorrowedDisplayInPanel' => 'Elemek megjelenítése a fő ablakban', # Accepts model codes
+
+ 'MailTitle' => 'E-mail küldése',
+ 'MailFrom' => 'Feladó: ',
+ 'MailTo' => 'Címzett: ',
+ 'MailSubject' => 'Tárgy: ',
+ 'MailSmtpError' => 'Hiba az SMTP szerverhez való kapcsolódáskor',
+ 'MailSendmailError' => 'Hiba a sendmail futtatásakor',
+
+ 'SearchTooltip' => 'Elemek keresése', # Accepts model codes
+ 'SearchTitle' => 'Elem keresése', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Mezőcsere',
+ 'QueryReplaceOld' => 'Jelenlegi érték',
+ 'QueryReplaceNew' => 'Új érték',
+ 'QueryReplaceLaunch' => 'Csere',
+
+ 'ImportWindowTitle' => 'Importálandó mezők kiválasztása',
+ 'ImportViewPicture' => 'Kép megtekintése',
+ 'ImportSelectAll' => 'Mindent kijelöl',
+ 'ImportSelectNone' => 'Kijelölés megszüntetése',
+
+ 'MultiSiteTitle' => 'A kereséshez használt oldalak',
+ 'MultiSiteUnused' => 'Nem használt bővítmények',
+ 'MultiSiteUsed' => 'Használt bővítmények',
+ 'MultiSiteLang' => 'Töltse fel a listát a magyar bővítményekkel',
+ 'MultiSiteEmptyError' => 'A lista üres',
+ 'MultiSiteClear' => 'Lista törlése',
+
+ 'DisplayOptionsTitle' => 'Megjelenítendő elemek',
+ 'DisplayOptionsAll' => 'Mindent kijelöl',
+ 'DisplayOptionsSearch' => 'Keresőgomb',
+
+ 'GenresTitle' => 'Jellemzők konvertálása',
+ 'GenresCategoryName' => 'Jellemzők használata',
+ 'GenresCategoryMembers' => 'Jellemzők cseréje',
+ 'GenresLoad' => 'Lista betöltése',
+ 'GenresExport' => 'Lista mentése fájlba',
+ 'GenresModify' => 'Változások szerkesztése',
+
+ 'PropertiesName' => 'Gyűjtemény neve',
+ 'PropertiesLang' => 'Nyelv kód',
+ 'PropertiesOwner' => 'Tulajdonos',
+ 'PropertiesEmail' => 'E-mail cím',
+ 'PropertiesDescription' => 'Leírás',
+ 'PropertiesFile' => 'Fájlinformáció',
+ 'PropertiesFilePath' => 'Elérési út',
+ 'PropertiesItemsNumber' => 'Elemek száma', # Accepts model codes
+ 'PropertiesFileSize' => 'Méret',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Gyűjtemény tulajdonságai',
+ 'PropertiesDefaultPicture' => 'Alapértelmezett kép',
+
+ 'MailProgramsTitle' => 'Levelezőprogramok',
+ 'MailProgramsName' => 'Név',
+ 'MailProgramsCommand' => 'Parancssor',
+ 'MailProgramsRestore' => 'Visszaállítás',
+ 'MailProgramsAdd' => 'Program hozzáadása',
+ 'MailProgramsInstructions' => 'A parancssorban néhány csere történt:
+ %f kicserélve a felhasználó e-mail címére.
+ %t kicserélve a címzett e-mail címére.
+ %s kicserélve az üzenet tárgyára.
+ %b kicserélve az üzenet tartalmára.',
+
+ 'BookmarksBookmarks' => 'Könyvjelzők',
+ 'BookmarksFolder' => 'Könyvtárak',
+ 'BookmarksLabel' => 'Cimke',
+ 'BookmarksPath' => 'Elérési út',
+ 'BookmarksNewFolder' => 'Új könyvtár',
+
+ 'AdvancedSearchType' => 'Keresés típusa',
+ 'AdvancedSearchTypeAnd' => 'Minden kritériumnak megfelelő elemek', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Legalább egy kritériumnak megfelelő elemek', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Kritérium',
+ 'AdvancedSearchAnyField' => 'Bármely mező',
+ 'AdvancedSearchSaveTitle' => 'Keresés elmentése',
+ 'AdvancedSearchSaveName' => 'Név',
+ 'AdvancedSearchSaveOverwrite' => 'Ezzel a névvel már létezik elmentett keresés. Válassz egy másikat.',
+ 'AdvancedSearchUseCase' => 'Ügyel a nagybetűs írásmódra',
+ 'AdvancedSearchIgnoreDiacritics' => 'Különleges karakterek mellőzése',
+
+ 'BugReportSubject' => 'Hibajelentés a GCstar-tól',
+ 'BugReportVersion' => 'Verzió',
+ 'BugReportPlatform' => 'Operációsrendszer',
+ 'BugReportMessage' => 'Hibaüzenet',
+ 'BugReportInformation' => 'További információk',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..a86dea8
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ID::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Masukkan nama field di atas',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Ganti separator dengan',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..736693c
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ID::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..3a06db5
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ID::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'File Template keliru',
+ 'UseFile' => 'Gunakan file yang seperti dibawah',
+ 'TemplateExternalFile' => 'File template',
+ 'WithJS' => 'Gunakan Javascript',
+ 'FileTemplate' => 'Template:',
+ 'Preview' => 'Pratayang',
+ 'NoPreview' => 'Tidak ada pratayang',
+ 'Title' => 'Judul halaman',
+ 'InfoFile' => 'Daftar film ada di file: ',
+ 'InfoDir' => 'Gambar ada di: ',
+ 'HeightImg' => 'Panjang (dalam pixel) dari gambar yang akan di ekspor: ',
+ 'OpenFileInBrowser' => 'Buka file di penjelajah web',
+ 'Note' => 'Daftar dibuat oleh <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Masukkan teks pencarian',
+ 'SearchType1' => 'Hanya judul',
+ 'SearchType2' => 'Informasi lengkap',
+ 'SearchButton' => 'Cari',
+ 'SearchTitle' => 'Tampilkan semua film yang cocok dengan kriteria sebelumnya',
+ 'AllButton' => 'Semua',
+ 'AllTitle' => 'Tampilkan semua film',
+ 'Expand' => 'Expand all',
+ 'ExpandTitle' => 'Tampilkan semua informasi film',
+ 'Collapse' => 'Collapse all',
+ 'CollapseTitle' => 'Collapse all movies information',
+ 'Borrowed' => 'Dipinjam oleh: ',
+ 'NotBorrowed' => 'Tersedia',
+ 'Top' => 'Kembali ke atas',
+ 'Bottom' => 'Bawah',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b3dc005
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ID::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..d39f96d
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ID::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Masukkan instruksi DROP',
+ 'WithCreate' => 'Masukkan instruksi CREATE',
+ 'TableName' => 'Nama Tabel',
+ 'InfoFile' => 'File SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..c71b12e
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ID::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archive ada di file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..eef4ed5
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ID::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Template file',
+ 'ModelText' => 'Template teks',
+ 'Models' => 'Template yang akan digunakan',
+ 'UseFile' => 'Gunakan file',
+ 'UseModel' => 'Gunakan text area',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..8ac0b6b
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ID::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Dimana sebaiknya mencari',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d489326
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ID::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Abaikan baris pertama',
+ 'Separator' => 'Pemisah',
+ 'Plugin' => 'Situs yang akan digunakan',
+ 'UseFirst' => 'Pilih yang paling pertama jika hasilnya banyak',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..cc6976f
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ID::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Jelajah sub-folders',
+ 'Suffixes' => 'Awalan atau ekstensi berkas',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'Nama yang akan dihilangkan',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..edeb112
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ID::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Salin gambar',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportList.pm
new file mode 100644
index 0000000..9dec196
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ID::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Daftar nama',
+ 'Plugin' => 'Situs yang akan digunakan',
+ 'UseFirst' => 'Pilih yang paling pertama jika hasilnya banyak',
+ 'CommentAuto' => 'Barang secara otomatis di-impor.',
+ 'CommentSite' => 'Situs: ',
+ 'CommentTitle' => 'Judul: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..ce446e8
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ID::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..92ca138
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ID::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Bukan merupakan file yang didukung oleh Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..fa2b0e4
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::ID::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..89c9a14
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ID::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..565adab
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::ID::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ID/GCModels/GCbooks.pm
new file mode 100644
index 0000000..589a6cf
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCbooks.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::ID::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi buku',
+ Items => 'Buku',
+ NewItem => 'Buku baru',
+
+ Isbn => 'ISBN',
+ Title => 'Judul',
+ Cover => 'Sampul',
+ Authors => 'Pengarang',
+ Publisher => 'Penerbit',
+ Publication => 'Tanggal diterbitkan',
+ Language => 'Bahasa',
+ Genre => 'Genre',
+ Serie => 'Seri',
+ Rank => 'Ranking',
+ Bookdescription => 'Deskripsi',
+ Pages => 'Halaman',
+ Read => 'Baca',
+ Acquisition => 'Acquisition date',
+ Location => 'Lokasi',
+ Edition => 'Edisi',
+ Format => 'Format',
+ Comments => 'Komentar',
+ Url => 'Halaman web',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detail',
+
+ ReadNo => 'Belum dibaca',
+ ReadYes => 'Sudah dibaca',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ID/GCModels/GCcoins.pm
new file mode 100644
index 0000000..c01c835
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::ID::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => {0 => 'Coin',
+ 1 => 'Coin',
+ X => 'Coins'},
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ID/GCModels/GCcomics.pm
new file mode 100644
index 0000000..f7d9d09
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::ID::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ID/GCModels/GCfilms.pm
new file mode 100644
index 0000000..b020acd
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::ID::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi film',
+ Items => 'Film',
+ NewItem => 'Film Baru',
+
+
+ Id => 'Id',
+ Title => 'Judul',
+ Date => 'Tanggal',
+ Time => 'Durasi',
+ Director => 'Sutradara',
+ Country => 'Negara',
+ MinimumAge => 'Minimum age',
+ Genre => 'Genre',
+ Image => 'Gambar',
+ Original => 'Judul asli',
+ Actors => 'Pemeran',
+ Actor => 'Aktor',
+ Role => 'Peran',
+ Comment => 'Komentar',
+ Synopsis => 'Sinopsis',
+ Seen => 'Sudah dilihat',
+ Number => '# of Media',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Halaman web',
+ Place => 'Lokasi',
+ Audio => 'Audio',
+ Video => 'Format video',
+ Trailer => 'File video',
+ Serie => 'Seri',
+ Rank => 'Ranking',
+ Subtitles => 'Subtitles',
+ Added => 'Add date',
+
+ SeenYes => 'Sudah dilihat',
+ SeenNo => 'Belum dilihat',
+
+ AgeUnrated => 'Unrated',
+ AgeAll => 'Semua Umur',
+ AgeParent => 'Bimbingan Orangtua',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Detail',
+
+ Information => 'Informasi',
+ Languages => 'Bahasa',
+ Encoding => 'Encoding',
+
+ FilterAudienceAge => 'Umur penonton',
+ FilterSeenNo => '_Not Yet Viewed',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Rating At _Least...',
+
+ ExtractSize => 'Ukuran',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCgames.pm b/lib/gcstar/GCLang/ID/GCModels/GCgames.pm
new file mode 100644
index 0000000..81209e5
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCgames.pm
@@ -0,0 +1,81 @@
+{
+ package GCLang::ID::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi Game',
+ Items => 'Game',
+ NewItem => 'Game baru',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nama',
+ Platform => 'Platform',
+ Players => 'Banyaknya pemain',
+ Released => 'Tanggal dirilis',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Deskripsi',
+ Codes => 'Kode',
+ Code => 'Kode',
+ Effect => 'Efek',
+ Secrets => 'Rahasia',
+ Location => 'Lokasi',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Komentar',
+ Url => 'Halaman web',
+ Unlockables => 'Tidak dapat di buka',
+ Unlockable => 'Tidak dapat di buka',
+ Howto => 'Bagaimana cara membuka',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Detail',
+ Tips => 'Tips',
+ Information => 'Informasi',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..b4f360b
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ID::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ID/GCModels/GCminicars.pm
new file mode 100644
index 0000000..1955da4
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::ID::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ID/GCModels/GCmusics.pm
new file mode 100644
index 0000000..4e323c4
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCmusics.pm
@@ -0,0 +1,67 @@
+{
+ package GCLang::ID::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Koleksi musik',
+ Items => 'Album',
+ NewItem => 'Album baru',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Judul',
+ Cover => 'Sampul',
+ Artist => 'Artis',
+ Format => 'Format',
+ Running => 'Durasi',
+ Release => 'Tanggal rilis',
+ Genre => 'Genre',
+ Origin => 'Asal',
+
+#For tracks list
+ Tracks => 'Daftar track',
+ Number => 'Nomor',
+ Track => 'Judul',
+ Time => 'Waktu',
+
+ Composer => 'Komposer',
+ Producer => 'Produser',
+ Playlist => 'Playlist',
+ Comments => 'Komentar',
+ Label => 'Label',
+ Location => 'Lokasi',
+ Url => 'Halaman web',
+
+ General => 'General',
+ Details => 'Detail',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..ba9e50c
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::ID::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..796e9cf
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ID::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..1794245
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ID::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ID/GCModels/GCstamps.pm
new file mode 100644
index 0000000..bc8cc9e
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::ID::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCModels/GCwines.pm b/lib/gcstar/GCLang/ID/GCModels/GCwines.pm
new file mode 100644
index 0000000..fb8cc3c
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::ID::GCModels::GCwines;
+
+ use utf8;
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => {0 => 'Wine',
+ 1 => 'Wine',
+ X => 'Wines'},
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ID/GCstar.pm b/lib/gcstar/GCLang/ID/GCstar.pm
new file mode 100644
index 0000000..6861440
--- /dev/null
+++ b/lib/gcstar/GCLang/ID/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::ID;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Indonesia',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Hati-hati</b>:
+
+Information downloaded from web sites (through the
+search plugins) is for <b>personal use only</b>.
+
+Any redistribution is forbidden without the site\'s
+<b>explicit authorization</b>.
+
+To determine which site owns the information, you
+may use the <b>button below item details</b>.',
+
+ 'AllItemsFiltered' => 'Tidak ada yang cocok dengan kriteria pemilahan', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Di install di ',
+ 'InstallMandatory' => 'Mandatory components',
+ 'InstallOptional' => 'Komponen Tambahan',
+ 'InstallErrorMissing' => 'Error : Komponen Perl berikut harus sudah terinstall: ',
+ 'InstallPrompt' => 'Direktori untuk instalasi [/usr/local]: ',
+ 'InstallEnd' => 'Akhir instalasi',
+ 'InstallNoError' => 'Tidak ada error',
+ 'InstallLaunch' => 'To use this application, one can launch ',
+ 'InstallDirectory' => 'Base direktori',
+ 'InstallTitle' => 'Instalasi GCstar',
+ 'InstallDependencies' => 'Dependencies',
+ 'InstallPath' => 'Path',
+ 'InstallOptions' => 'Opsi',
+ 'InstallSelectDirectory' => 'Select base directory for the installation',
+ 'InstallWithClean' => 'Remove files found in installation directory',
+ 'InstallWithMenu' => 'Add GCstar to Applications menu',
+ 'InstallNoPermission' => 'Error: You don\'t have permission to write in the selected directory',
+ 'InstallMissingMandatory' => 'Mandatory dependencies are missing. You won\'t be able to install GCstar until they have been added to your system.',
+ 'InstallMissingOptional' => 'Some optional dependencies are missing. There are listed under. GCstar may be installed but some features won\'t be available.',
+ 'InstallMissingNone' => 'There are no missing dependency. You may continue and install GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Hilang',
+ 'InstallMissingFor' => 'Missing for',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Mennyalin file di direktori: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy yang digunakan (tekan enter jika tidak ada): ',
+ 'UpdateNoPermission' => 'Write permission denied in this directory: ',
+ 'UpdateNone' => 'Tidak ada update yang ditemukan',
+ 'UpdateFileNotFound' => 'File tidak ditemukan',
+
+#Splash
+ 'SplashInit' => 'Initialization',
+ 'SplashLoad' => 'Loading Collection',
+ 'SplashDisplay' => 'Memperlihatkan Koleksi',
+ 'SplashSort' => 'Mengurutkan Koleksi',
+ 'SplashDone' => 'Siap',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sepertinya anda sebelumnya menggunakan GCfilms. Apakah anda mau mengimpor dari GCfilms ke GCstar (tidak akan mempengaruhi GCfilms jika anda masih ingin menggunakannya)?',
+ 'GCfilmsImportOptions' => 'Pengaturan',
+ 'GCfilmsImportData' => 'Daftar Film',
+
+#Menus
+ 'MenuFile' => '_File',
+ 'MenuNewList' => '_Koleksi Baru',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Recent Collections',
+ 'MenuLend' => 'Tampilkan _Item yang dipinjam', # Accepts model codes
+ 'MenuImport' => '_Import',
+ 'MenuExport' => '_Export',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Ubah',
+ 'MenuDuplicate' => 'Du_plicate item', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Remove item', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_Lock Collection',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Simpan pencarian',
+ 'MenuSavedSearchesSave' => 'Simpan pencarian yang sekarang',
+ 'MenuSavedSearchesEdit' => 'Ubah simpanan pencarian',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Show _All items', # Accepts model codes
+ 'MenuNoFilter' => '_Any',
+
+ 'MenuConfiguration' => '_Settings',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Displayed Information',
+ 'MenuBorrowers' => '_Borrowers',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre _Conversion',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Help',
+ 'MenuHelpContent' => '_Content',
+ 'MenuAllPlugins' => 'Lihat _plugin',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => '_About GCstar',
+
+ 'MenuNewWindow' => 'Show item in _New Window', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand all',
+ 'ContextCollapseAll' => 'Collapse all',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Buka dengan pengedit gambar',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Do you really want to remove this item?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'Add a new item', # Accepts model codes
+ 'NoItemFound' => 'Tidak menemukan apapun. Apa anda mau mencari di situs yang lain?',
+ 'OpenList' => 'Harap pilih koleksi',
+ 'SaveList' => 'Harap pilih lokasi penyimpanan koleksi',
+ 'SaveListTooltip' => 'Save current collection',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Jangan disimpan',
+ 'PreferencesTooltip' => 'Set your preferences',
+ 'ViewTooltip' => 'Change collection display',
+ 'PlayTooltip' => 'Play video associated to the item', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Menyimpan...',
+ 'StatusLoad' => 'Membuka...',
+ 'StatusSearch' => 'Sedang mencari...',
+ 'StatusGetInfo' => 'Mengambil informasi...',
+ 'StatusGetImage' => 'Mengambil gambar...',
+
+ 'SaveError' => 'Cannot save items list. Please check access rights and disk free space.',
+ 'OpenError' => 'Cannot open items list. Please check access rights.',
+ 'OpenFormatError' => 'Cannot open items list. Format may be incorrect.',
+ 'OpenVersionWarning' => 'Koleksi dibuat menggunakan versi terbaru GCstar. Mungkin akan terjadi kerusakan data jika disimpan.',
+ 'OpenVersionQuestion' => 'Masih ingin melanjutkan ??',
+ 'ImageError' => 'Selected directory to save images is not correct. Please select another one.',
+ 'OptionsCreationError'=> 'Cannot create options file: ',
+ 'OptionsOpenError'=> 'Cannot open options file: ',
+ 'OptionsSaveError'=> 'Cannot save options file: ',
+ 'ErrorModelNotFound' => 'Model tidak ditemukan: ',
+ 'ErrorModelUserDir' => 'Model buatan pengguna ada di: ',
+
+ 'RandomTooltip' => 'What to see this evening ?',
+ 'RandomError'=> 'You have no item that could be selected', # Accepts model codes
+ 'RandomEnd'=> 'There are no more items', # Accepts model codes
+ 'RandomNextTip'=> 'Next suggestion',
+ 'RandomOkTip'=> 'Accept this item',
+
+ 'AboutTitle' => 'Tentang GCstar',
+ 'AboutDesc' => 'Collection manager',
+ 'AboutVersion' => 'Versi',
+ 'AboutTeam' => 'Tim',
+ 'AboutWho' => 'Christian Jodar (Tian): Manajer Proyek, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Distributed under the terms of the GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Terjemahan bahasa Ingrris oleh Yuda Nugrahadi',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo dan desain web oleh le Spektre',
+
+ 'ToolbarRandom' => 'Malam ini',
+
+ 'UnsavedCollection' => 'Koleksi yang belum disimpan',
+ 'ModelsSelect' => 'Pilih tipe koleksi',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'Tipe koleksi baru',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Informasi',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Tipe:',
+ 'ModelFieldGroup' => 'Grup:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maksimum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Ditampilkan sebagai:',
+ 'ModelFieldDisplayAsText' => 'Teks',
+ 'ModelFieldDisplayAsGraphical' => 'Pengendali Rating',
+ 'ModelFieldTypeShortText' => 'Text pendek',
+ 'ModelFieldTypeLongText' => 'Text panjang',
+ 'ModelFieldTypeYesNo' => 'Ya/Tidak',
+ 'ModelFieldTypeNumber' => 'Nomor',
+ 'ModelFieldTypeDate' => 'Tanggal',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Gambar',
+ 'ModelFieldTypeSingleList' => 'Daftar sederhana',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameter',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Tampilkan dalam satu baris',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'Format file:',
+ 'ModelFieldFileFile' => 'File sederhana',
+ 'ModelFieldFileImage' => 'Gambar',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Otomatis',
+ 'ModelOptionsFieldsNone' => 'Tidak ada',
+ 'ModelOptionsFieldsTitle' => 'Sebagai judul',
+ 'ModelOptionsFieldsId' => 'Sebagai identifikasi',
+ 'ModelOptionsFieldsCover' => 'Sebagai cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Barang dapat diberi tag',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Perbandingan',
+ 'ModelFilterContain' => 'Berisi',
+ 'ModelFilterDoesNotContain' => 'Tidak mengandung kata',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'Ini akan menambah tempat untu mengatur tag',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Select an item', # Accepts model codes
+ 'ResultsNextTip' => 'Cari di situs berikutnya',
+ 'ResultsPreview' => 'Pratayang',
+ 'ResultsInfo' => 'Anda dapat menambah barang lebih dari satu ke koleksi dengan menekan+tahan tombol Ctrl atau Shift dan pilih barang yang akan dimasukkan', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferences',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Tetapkan jenis aplikasi untuk digunakan oleh media yang berbeda, tinggalkan kosong untuk menggunakan konfigurasi dasar sistem',
+ 'OptionsBrowser' => 'Penjelajah web',
+ 'OptionsPlayer' => 'Video player',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Pengedit gambar',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Direktori gambar',
+ 'OptionsUseRelativePaths' => 'Use relative paths for images',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Tampilkan status bar',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Peringatan: Perubahan pada tab ini tidak akan berpengaruh sampai aplikasi ini ditutup kemudian dibuka kembali.',
+ 'OptionsRemoveConfirm' => 'Ask confirmation before item deletion',
+ 'OptionsAutoSave' => 'Otomatis menyimpan koleksi',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Perlihatkan splash screen',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Gunakan pemeriksa bahasa untuk teks yang panjang',
+ 'OptionsProgramTitle' => 'Pilih program yang akan digunakan',
+ 'OptionsPlugins' => 'Situs untuk pengambilan data',
+ 'OptionsAskPlugins' => 'Tanya (Semua situs)',
+ 'OptionsPluginsMulti' => 'Banyak situs',
+ 'OptionsPluginsMultiAsk' => 'Tanya (Banyak situs)',
+ 'OptionsPluginsMultiPerField' => 'Banyak situs (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Set daftar',
+ 'OptionsAskImport' => 'Select fields to be imported',
+ 'OptionsProxy' => 'Menggunakan proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Bahasa',
+ 'OptionsMain' => 'Utama',
+ 'OptionsPaths' => 'Lokasi',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Fitur',
+ 'OptionsDisplay' => 'Tampilan',
+ 'OptionsToolbar' => 'Toolbar',
+ 'OptionsToolbars' => {0 => 'Tidak ada', 1 => 'Kecil', 2 => 'Besar', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Posisi',
+ 'OptionsToolbarPositions' => {0 => 'Atas', 1 => 'Bawah', 2 => 'Kiri', 3 => 'Kanan'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Items list',
+ 'OptionsViews' => {0 => 'Teks', 1 => 'Gambar', 2 => 'Detail'},
+ 'OptionsColumns' => 'Kolom',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'e-mail anda',
+ 'OptionsTransform' => 'Place articles at the end of titles',
+ 'OptionsArticles' => 'Artikel (Dipisahkan koma)',
+ 'OptionsSearchStop' => 'Allow search to be aborted',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Use main title as the original title if none present',
+ 'OptionsRestoreAccelerators' => 'Mengembalikan accelerators',
+ 'OptionsHistory' => 'Size of history',
+ 'OptionsClearHistory' => 'Clear history',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Jangan bertanya lagi',
+ 'OptionsPathProgramsGroup' => 'Aplikasi',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Gambar',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Artikel',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Gaya',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Kenyamanan',
+ 'OptionsPicturesFormat' => 'Prefiks yang digunakan untuk gambar:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'Seting',
+ 'ImagesOptionsTitle' => 'Settings for images list',
+ 'ImagesOptionsSelectColor' => 'Pilih warna',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Background',
+ 'ImagesOptionsBgPicture' => 'Use a background picture',
+ 'ImagesOptionsFg'=> 'Selection',
+ 'ImagesOptionsBgTooltip' => 'Change background color',
+ 'ImagesOptionsFgTooltip'=> 'Change selection color',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Ukuran',
+ 'ImagesOptionsSizeList' => {0 => 'Sangat Kecil', 1 => 'Kecil', 2 => 'Medium', 3 => 'Besar', 4 => 'Sangat besar'},
+ 'ImagesOptionsSizeTooltip' => 'Pilih ukuran gambar',
+
+ 'DetailedOptionsTitle' => 'Settings for detailed list',
+ 'DetailedOptionsImageSize' => 'Ukuran gambar',
+ 'DetailedOptionsGroupItems' => 'Group items by',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Select fields to display',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Informasi',
+ 'ExtractTitle' => 'Informasi file',
+ 'ExtractImport' => 'Use values',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Export item list',
+ 'ExportFilter' => 'Export only displayed items',
+ 'ExportFieldsTitle' => 'Fields to be exported',
+ 'ExportFieldsTip' => 'Select fields you want to export',
+ 'ExportWithPictures' => 'Copy pictures in a sub-directory',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Urutan',
+
+ 'ImportListTitle' => 'Import another items list',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'File',
+ 'ImportExportFieldsUnused' => 'Unused fields',
+ 'ImportExportFieldsUsed' => 'Used fields',
+ 'ImportExportFieldsFill' => 'Tambahkan Semua',
+ 'ImportExportFieldsClear' => 'Hapus Semua',
+ 'ImportExportFieldsEmpty' => 'You must choose at least one field',
+ 'ImportExportFileEmpty' => 'You have to specify a file name',
+ 'ImportFieldsTitle' => 'Fields to be imported',
+ 'ImportFieldsTip' => 'Select fields you want to import',
+ 'ImportNewList' => 'Create a new collection',
+ 'ImportCurrentList' => 'Add to current collection',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Please select file to use',
+ 'FileChooserDirectory' => 'Direktori',
+ 'FileChooserOpenDirectory' => 'Pilih direktori',
+ 'FileChooserOverwrite' => 'This file already exists. Do you want to overwrite it?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Read Only',
+ 'PanelForm' => 'Tab',
+
+ 'PanelSearchButton' => 'Fetch Information',
+ 'PanelSearchTip' => 'Search web for information on this name',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Click on the picture to select different one.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Right click for more options.',
+ 'PanelImageTitle' => 'Pilih gambar',
+ 'PanelImageNoImage' => 'Tidak ada gambar',
+ 'PanelSelectFileTitle' => 'Pilih sebuah file',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Dari',
+ 'PanelTo' =>'Ke',
+
+ 'PanelWeb' => 'View Information',
+ 'PanelWebTip' => 'View information on the web about this item', # Accepts model codes
+ 'PanelRemoveTip' => 'Remove current item', # Accepts model codes
+
+ 'PanelDateSelect' => 'Select a Date',
+ 'PanelNobody' => 'Nobody',
+ 'PanelUnknown' => 'Tidak diketahui',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Rating',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Location',
+
+ 'PanelLending' => 'Lending',
+ 'PanelBorrower' => 'Peminjam',
+ 'PanelLendDate' => 'Keluar sejak',
+ 'PanelHistory' => 'Sejarah peminjaman',
+ 'PanelReturned' => 'Barang dikembalikan', # Accepts model codes
+ 'PanelReturnDate' => 'Tanggal pengembalian',
+ 'PanelLendedYes' => 'Lended',
+ 'PanelLendedNo' => 'Tersedia',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favorit',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Either',
+ 'CheckYes' => 'Ya',
+ 'CheckNo' => 'Tidak',
+
+ 'ToolbarAll' => 'Lihat Semua',
+ 'ToolbarAllTooltip' => 'View all items',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Pencarian cepat',
+ 'ToolbarQuickSearchLabel' => 'Pencarian',
+ 'ToolbarQuickSearchTooltip' => 'Pilih bagian yang akan dicari. masukkan kata yang dicari kemudian tekan enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Search an item',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Search site',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nama',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Author',
+ 'PluginsLang' => 'Bahasa',
+ 'PluginsUseSite' => 'Gunakan situs yang dipilih untuk pencarian seterusnya',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Borrower Configuration',
+ 'BorrowersList' => 'Peminjam',
+ 'BorrowersName' => 'Nama',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Tambah',
+ 'BorrowersRemove' => 'Mengurangi',
+ 'BorrowersEdit' => 'Edit',
+ 'BorrowersTemplate' => 'Mail template',
+ 'BorrowersSubject' => 'Mail subject',
+ 'BorrowersNotice1' => '%1 will be replaced with the borrower\'s name',
+ 'BorrowersNotice2' => '%2 will be replaced with the item title',
+ 'BorrowersNotice3' => '%3 will be replaced with the borrow date',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'Format file:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Barang yang dipinjam', # Accepts model codes
+ 'BorrowedDate' => 'Sejak',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Send an e-mail',
+ 'MailFrom' => 'Dari: ',
+ 'MailTo' => 'Kepada: ',
+ 'MailSubject' => 'Subjek: ',
+ 'MailSmtpError' => 'Problem when connecting to SMTP server',
+ 'MailSendmailError' => 'Problem when launching sendmail',
+
+ 'SearchTooltip' => 'Search all items', # Accepts model codes
+ 'SearchTitle' => 'Item Search', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Current value',
+ 'QueryReplaceNew' => 'New value',
+ 'QueryReplaceLaunch' => 'Replace',
+
+ 'ImportWindowTitle' => 'Select Fields to be Imported',
+ 'ImportViewPicture' => 'View picture',
+ 'ImportSelectAll' => 'Select all',
+ 'ImportSelectNone' => 'Select none',
+
+ 'MultiSiteTitle' => 'Sites to use for searches',
+ 'MultiSiteUnused' => 'Unused plugins',
+ 'MultiSiteUsed' => 'Plugins to be used',
+ 'MultiSiteLang' => 'Fill list with English plugins',
+ 'MultiSiteEmptyError' => 'You have an empty site list',
+ 'MultiSiteClear' => 'Clear list',
+
+ 'DisplayOptionsTitle' => 'Items to display',
+ 'DisplayOptionsAll' => 'Select all',
+ 'DisplayOptionsSearch' => 'Search button',
+
+ 'GenresTitle' => 'Genre Conversion',
+ 'GenresCategoryName' => 'Genre to use',
+ 'GenresCategoryMembers' => 'Genre to replace',
+ 'GenresLoad' => 'Load a list',
+ 'GenresExport' => 'Save list to a file',
+ 'GenresModify' => 'Edit conversion',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Kode bahasa',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Folders',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Simpan pencarian',
+ 'AdvancedSearchSaveName' => 'Nama',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Laporan kerusakan dibuat dari GCstar',
+ 'BugReportVersion' => 'Versi',
+ 'BugReportPlatform' => 'Sistem operasi',
+ 'BugReportMessage' => 'Pesan error',
+ 'BugReportInformation' => 'Informasi tambahan',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..2bc1adb
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportCSV.pm
@@ -0,0 +1,47 @@
+{
+ package GCLang::IT::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Aggiungere colonna',
+ 'Separator' => 'Delimitatore',
+ 'Replacement' => 'Ripeti delimitazione con',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..47a2867
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::IT::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..3045fa7
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportHTML.pm
@@ -0,0 +1,71 @@
+{
+ package GCLang::IT::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Usa Javascript',
+ 'FileTemplate' => 'Modello:',
+ 'Preview' => 'Anteprima',
+ 'NoPreview' => 'Anteprima non disponibilee',
+ 'Title' => 'Titolo pagina',
+ 'InfoFile' => 'La lista dei film è nel file : ',
+ 'InfoDir' => 'Immagini sono in : ',
+ 'HeightImg' => 'Altezza in pixel dell\'immagine da esportare :',
+ 'OpenFileInBrowser' => 'Apri il file generato nel web browser',
+ 'Note' => 'Lista generata con <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Immetti testo da cercare',
+ 'SearchType1' => 'Solo il titolo',
+ 'SearchType2' => 'Informazioni complete',
+ 'SearchButton' => 'Cerca',
+ 'SearchTitle' => 'Visualizza solo i film trovati con il criterio precedente',
+ 'AllButton' => 'Tutto',
+ 'AllTitle' => 'Visualizza tutti i film',
+ 'Expand' => 'Espandi tutto',
+ 'ExpandTitle' => 'Visualizza tutte le informazioni dei film',
+ 'Collapse' => 'Comprimi tutto',
+ 'CollapseTitle' => 'Comprimi tutte le informazioni dei film',
+ 'Borrowed' => 'Preso in prestito da: ',
+ 'NotBorrowed' => 'Disponibile',
+ 'Top' => 'In alto',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..7b70074
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::IT::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..808a587
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportSQL.pm
@@ -0,0 +1,47 @@
+{
+ package GCLang::IT::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Includi istruzione DROP',
+ 'WithCreate' => 'Includi istruzione CREATE',
+ 'TableName' => 'Nome tabella',
+ 'InfoFile' => 'File SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2aaf1f4
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportTarGz.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::IT::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'L\'archivio e\' in questo file: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..979b15e
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCExport/GCExportXML.pm
@@ -0,0 +1,48 @@
+{
+ package GCLang::IT::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Modello file',
+ 'ModelText' => 'Modello testo',
+ 'Models' => 'Modello da usare',
+ 'UseFile' => 'Usa file',
+ 'UseModel' => 'Usa area di testo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..1d5f17d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::IT::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Dove cercare',
+ 'Default' => 'Directory di Alexandria',
+ 'Specified' => 'Directory specificata piu\' sotto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..fb76914
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportCSV.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::IT::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignora la prima linea',
+ 'Separator' => 'Delimitatore',
+ 'Plugin' => 'Lato da utilizzare',
+ 'UseFirst' => 'In caso di piu\' risultati utilizza il primo',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..614da49
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::IT::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..8cd35fb
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportGCstar.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::IT::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copia immagini',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportList.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportList.pm
new file mode 100644
index 0000000..ec2da7a
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportList.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::IT::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Elenco dei titoli',
+ 'Plugin' => 'Lato da utilizzare',
+ 'UseFirst' => 'In caso di piu\' risultati utilizza il primo',
+ 'CommentAuto' => 'Articolo importato automaticamente.',
+ 'CommentSite' => 'Sito web: ',
+ 'CommentTitle' => 'Titolo: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..f7e6343
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::IT::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..d20b7c3
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCImport/GCImportTellico.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::IT::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Il file non contiene una collezione valida Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..cc546b1
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCTVepisodes.pm
@@ -0,0 +1,48 @@
+{
+ package GCLang::IT::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => {0 => 'Episode',
+ 1 => 'Episode',
+ X => 'Episodes'},
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..1932fa5
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCTVseries.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::IT::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => {0 => 'Series',
+ 1 => 'Series',
+ X => 'Series'},
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..1200981
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::IT::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCbooks.pm b/lib/gcstar/GCLang/IT/GCModels/GCbooks.pm
new file mode 100644
index 0000000..b846c6f
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCbooks.pm
@@ -0,0 +1,77 @@
+{
+ package GCLang::IT::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Biblioteca',
+ Items => {0 => 'Libri',
+ 1 => 'Libri',
+ X => 'Libris'},
+ NewItem => 'Libro nuovo',
+
+ Isbn => 'ISBN',
+ Title => 'Titolo',
+ Cover => 'Copertina',
+ Authors => 'Autore(i)',
+ Publisher => 'Editore',
+ Publication => 'Data di pubblicazione',
+ Language => 'Lingua',
+ Genre => 'Genere',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Bookdescription => 'Descrizione',
+ Pages => 'Pagine',
+ Read => 'Letto',
+ Acquisition => 'Acquisito il',
+ Edition => 'Edizione',
+ Format => 'Formato',
+ Comments => 'Commenti',
+ Url => 'Pagina web',
+ Translator => 'Traduttore',
+ Artist => 'Scrittore',
+ DigitalFile => 'Digital version',
+
+ General => 'Generale',
+ Details => 'Dettagli',
+
+ ReadNo => 'Non letto',
+ ReadYes => 'Letto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCcoins.pm b/lib/gcstar/GCLang/IT/GCModels/GCcoins.pm
new file mode 100644
index 0000000..0f0d79d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCcoins.pm
@@ -0,0 +1,110 @@
+{
+ package GCLang::IT::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatica',
+ Items => {0 => 'Monete',
+ 1 => 'Monete',
+ X => 'Monete'},
+ NewItem => 'Moneta nuova',
+
+ Name => 'Nome',
+ Country => 'Stato',
+ Year => 'Anno',
+ Currency => 'Valuta',
+ Value => 'Valore',
+ Picture => 'Immagine',
+ Diameter => 'Diametro',
+ Metal => 'Metallo',
+ Edge => 'Profilo',
+ Edge1 => 'Profilo 1',
+ Edge2 => 'Profilo 2',
+ Edge3 => 'Profilo 3',
+ Edge4 => 'Profilo 4',
+ Head => 'Fronte',
+ Tail => 'Retro',
+ Comments => 'Commenti',
+ History => 'Storia',
+ Website => 'Sito Web',
+ Estimate => 'Stima',
+ References => 'Riferimenti',
+ Type => 'Tipo',
+ Coin => 'Moneta',
+ Banknote => 'Banconota',
+
+ Main => 'Principale',
+ Description => 'Descrizione',
+ Other => 'Altre informazioni',
+ Pictures => 'Immagini',
+
+ Condition => 'Condizioni (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCcomics.pm b/lib/gcstar/GCLang/IT/GCModels/GCcomics.pm
new file mode 100644
index 0000000..821debb
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::IT::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCfilms.pm b/lib/gcstar/GCLang/IT/GCModels/GCfilms.pm
new file mode 100644
index 0000000..b77dab7
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCfilms.pm
@@ -0,0 +1,99 @@
+{
+ package GCLang::IT::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmoteca',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Film'},
+ NewItem => 'Nuovo film',
+
+ Id => 'Id',
+ Title => 'Titolo',
+ Date => 'Data',
+ Time => 'Durata',
+ Director => 'Regista',
+ Country => 'Nazione',
+ MinimumAge => 'Eta\' minima',
+ Genre => 'Genere',
+ Image => 'Immagine',
+ Original => 'Titolo originale',
+ Actors => 'Cast',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Commento',
+ Synopsis => 'Trama',
+ Seen => 'Gia\' visto',
+ Number => 'Numero',
+ Format => 'Tipo',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'URL',
+ Audio => 'Audio',
+ Video => 'Video',
+ Trailer => 'Trailer',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Subtitles => 'Sottotitoli',
+
+ SeenYes => 'Gia\' visto',
+ SeenNo => 'Non visto',
+
+ AgeUnrated => 'Sconosciuta',
+ AgeAll => 'Nessuna',
+ AgeParent => 'V.m.',
+
+ Main => 'Oggetti principali',
+ General => 'Informazioni film',
+ Details => 'Dettagli',
+
+ Information => 'Informazioni',
+ Languages => 'Lingua',
+ Encoding => 'Codifica',
+
+ FilterAudienceAge => 'Eta\' pubblico',
+ FilterSeenNo => '_Non visto',
+ FilterSeenYes => '_Gia\' visto',
+ FilterRatingSelect => 'Valutazione maggiore di...',
+
+ ExtractSize => 'Dimensione',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCgames.pm b/lib/gcstar/GCLang/IT/GCModels/GCgames.pm
new file mode 100644
index 0000000..d005508
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCgames.pm
@@ -0,0 +1,89 @@
+{
+ package GCLang::IT::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Videogiochi',
+ Items => {0 => 'Giochi',
+ 1 => 'Giochi',
+ X => 'Giochi'},
+ NewItem => 'Nuovo gioco',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Titolo',
+ Platform => 'Piattaforma',
+ Players => 'Numero giocatori',
+ Released => 'Data rilascio',
+ Editor => 'Editore',
+ Developer => 'Sviluppatore',
+ Genre => 'Genere',
+ Box => 'Scatola',
+ Case => 'Contenitore',
+ Manual => 'Manuale d\'istruzioni',
+ Completion => 'Completato (%)',
+ Executable => 'Executable',
+ Description => 'Descrizione',
+ Codes => 'Codici',
+ Code => 'Codice',
+ Effect => 'Effetto',
+ Secrets => 'Segreti',
+ Screenshots => 'Vista',
+ Screenshot1 => 'Prima vista',
+ Screenshot2 => 'Seconda vista',
+ Comments => 'Commenti',
+ Url => 'Pagina web',
+ Unlockables => 'Non bloccabili',
+ Unlockable => 'Bloccabile',
+ Howto => 'Come sbloccare',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Generale',
+ Details => 'Dettagli',
+ Tips => 'Suggerimenti',
+ Information => 'Informatzioni',
+
+ FilterRatingSelect => 'Valutazioni, almeno...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..6550088
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::IT::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCminicars.pm b/lib/gcstar/GCLang/IT/GCModels/GCminicars.pm
new file mode 100644
index 0000000..f635c44
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::IT::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCmusics.pm b/lib/gcstar/GCLang/IT/GCModels/GCmusics.pm
new file mode 100644
index 0000000..8a1a13f
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCmusics.pm
@@ -0,0 +1,75 @@
+{
+ package GCLang::IT::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Musicoteca',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Album'},
+ NewItem => 'Nuovo album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titolo',
+ Cover => 'Copertina',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Durata',
+ Release => 'Data pubblicazione',
+ Genre => 'Genere',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Lista tracce',
+ Number => 'Numero',
+ Track => 'Titolo',
+ Time => 'Tempo',
+
+ Composer => 'Compositore',
+ Producer => 'Produttore',
+ Playlist => 'Playlist',
+ Comments => 'Commenti',
+ Label => 'Etichetta',
+ Url => 'WPagina web',
+
+ General => 'Generale',
+ Details => 'Dettagli',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..d5d1446
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::IT::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..ad7d61b
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::IT::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..335390d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::IT::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCstamps.pm b/lib/gcstar/GCLang/IT/GCModels/GCstamps.pm
new file mode 100644
index 0000000..bec04a6
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::IT::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCModels/GCwines.pm b/lib/gcstar/GCLang/IT/GCModels/GCwines.pm
new file mode 100644
index 0000000..ced6664
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCModels/GCwines.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::IT::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+#######################################################
+#
+# v2.0.12 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Enoteca',
+ Items => {0 => 'Vini',
+ 1 => 'Vini',
+ X => 'Vini'},
+ NewItem => 'Nuovo vino',
+
+ Name => 'Nome',
+ Designation => 'Designazione',
+ Vintage => 'Annata',
+ Vineyard => 'Vigna',
+ Type => 'Tipo',
+ Grapes => 'Uve',
+ Soil => 'Suolo',
+ Producer => 'Produttore',
+ Country => 'Nazione',
+ Volume => 'Capacita\' (ml)',
+ Alcohol => 'Gradazione alc. (%)',
+ Medal => 'Premi',
+
+ Storage => 'Conservazione',
+ Location => 'Localizzazione',
+ ShelfIndex => 'Indice',
+ Quantity => 'Quantita\'',
+ Acquisition => 'Acquisizione',
+ PurchaseDate => 'Data acquisto',
+ PurchasePrice => 'Prezzo',
+ Gift => 'Omaggio',
+ BottleLabel => 'Etichetta',
+ Website => 'Riferimento sul web',
+
+ Tasted => 'Assaggiato',
+ Comments => 'Commenti',
+ Serving => 'Da servire',
+ TastingField => 'Note',
+
+ General => 'Generali',
+ Details => 'Detttagli',
+ Tasting => 'Assaggio',
+
+ TastedNo => 'Non assaggiato',
+ TastedYes => 'Assaggiato',
+
+ FilterRange => 'Campo',
+ FilterTastedNo => '_Non ancora assaggiato',
+ FilterTastedYes => 'Gia\' assaggia_to',
+ FilterRatingSelect => 'Valutato a_lmeno...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/IT/GCstar.pm b/lib/gcstar/GCLang/IT/GCstar.pm
new file mode 100644
index 0000000..fade2d1
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/GCstar.pm
@@ -0,0 +1,678 @@
+{
+ package GCLang::IT;
+
+ use utf8;
+######################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Italiano',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Attenzione</b>:
+
+Le informazioni scaricate dai siti Internet (con i plugin di ricerca) sono previste
+<b>esclusivamente per l\'uso personale</b>.
+
+La loro redistributione senza l\'esplicita autorizzazione scritta dei siti web e\'
+<b>severamente vietata!</b> e viene penalmente perseguita!
+
+Per determinare il sito web proprietario delle informazioni consultare l\'etichetta <b>[dettagli]</b>.',
+
+ 'AllItemsFiltered' => 'Nessun articolo soddisfa ai criteri di filtro selezionati', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installazione in ',
+ 'InstallMandatory' => 'Componenti obbligatorie',
+ 'InstallOptional' => 'Componenti opzionali',
+ 'InstallErrorMissing' => 'Errore : Occorre installare le seguenti componenti Perl: ',
+ 'InstallPrompt' => 'Directory radice d\'installazione [es. /usr/local]: ',
+ 'InstallEnd' => 'Installazione terminata',
+ 'InstallNoError' => 'Nessun errore',
+ 'InstallLaunch' => 'Per utilizzare questa applicazione si puo\' lanciare ',
+ 'InstallDirectory' => 'Directory radice',
+ 'InstallTitle' => 'Installazione di GCstar',
+ 'InstallDependencies' => 'Dipendenze',
+ 'InstallPath' => 'Percorso',
+ 'InstallOptions' => 'Opzioni',
+ 'InstallSelectDirectory' => 'Selezionare la directory radice per l\'installazione',
+ 'InstallWithClean' => 'Rimuovere i file trovati nella directory di installazione',
+ 'InstallWithMenu' => 'Aggiungere GCstar al menu\' Applicazioni',
+ 'InstallNoPermission' => 'Errore: Diritti di scrittura mancanti per la directory selezionata',
+ 'InstallMissingMandatory' => 'Alcune dipendenze necessarie sono mancanti. Non e\' possibile installare GCstar sinche\' esse non sono presenti nel sistema.',
+ 'InstallMissingOptional' => 'Mancano alcune dipendenze opzionali, elencate qui sotto. GCstar verra\' installato ma alcune funzioni non saranno disponibili.',
+ 'InstallMissingNone' => 'Tutte le dipendenze sono soddisfatte. Continuare con l\'installazione di GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Mancante',
+ 'InstallMissingFor' => 'Mancante per',
+ 'InstallCleanDirectory' => 'Rimozione dei file di GCStar dalla directory: ',
+ 'InstallCopyDirectory' => 'Copia dei file nella directory: ',
+ 'InstallCopyDesktop' => 'Copia dei file di desktop in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy (premere Invio se nessuno): ',
+ 'UpdateNoPermission' => 'Diritti di scrittura negati per questa directory: ',
+ 'UpdateNone' => 'Non e\' stato trovato alcun aggiornamento',
+ 'UpdateFileNotFound' => 'File non trovato',
+
+#Splash
+ 'SplashInit' => 'Inizializzazione',
+ 'SplashLoad' => 'Caricamento Collezione',
+ 'SplashDisplay' => 'Visualizzazione Collezione',
+ 'SplashSort' => 'Ordinamento Collezione',
+ 'SplashDone' => 'Finito!',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Sono stati individuati elementi di GCfilms. Cosa si vuole importare di GCfilms in GCstar? (e\' comunque possibile continuare ad utilizzare GCfilms in parallelo)',
+ 'GCfilmsImportOptions' => 'Impostazioni',
+ 'GCfilmsImportData' => 'Collezione film',
+
+#Menus
+ 'MenuFile' => 'File',
+ 'MenuNewList' => '_Nuova collezione',
+ 'MenuStats' => 'Statistiche',
+ 'MenuHistory' => 'Ultime collezioni aperte',
+ 'MenuLend' => 'Visualizza articoli prestati', # Accepts model codes
+ 'MenuImport' => '_Importa',
+ 'MenuExport' => '_Esporta',
+ 'MenuAddItem' => '_Aggiungi articolo', # Accepts model codes
+
+ 'MenuEdit' => 'Modifica',
+ 'MenuDuplicate' => '_Duplica articolo', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plica articoli', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Seleziona tutti gli articoli', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Rimuovi articolo corrente',, # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Rimuovi articolo', # Accepts model codes
+ 'MenuEditFields' => '_Cambia campi della collezione',
+ 'MenuEditLockItems' => 'B_locca la collezione',
+
+ 'MenuDisplay' => 'F_iltri',
+ 'MenuSavedSearches' => 'Ricerche salvate',
+ 'MenuSavedSearchesSave' => 'Salva ricerca corrente',
+ 'MenuSavedSearchesEdit' => 'Modifica ricerche salvate',
+ 'MenuAdvancedSearch' => 'Ricerca Avanzata',
+ 'MenuViewAllItems' => 'Mostr_a tutti gli articoli', # Accepts model codes
+ 'MenuNoFilter' => 'Tutti',
+
+ 'MenuConfiguration' => 'Configurazione',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Visualizzazione articoli',
+ 'MenuBorrowers' => 'Gestione prestiti',
+ 'MenuToolbarConfiguration' => 'Configura _Toolbar',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversione di Genere',
+
+ 'MenuBookmarks' => '_Collezioni',
+ 'MenuBookmarksAdd' => '_Aggiungi collezione corrente',
+ 'MenuBookmarksEdit' => '_Edita collezioni selezionate',
+
+ 'MenuHelp' => '?',
+ 'MenuHelpContent' => 'Contenuti',
+ 'MenuAllPlugins' => 'Mostra _plugin',
+ 'MenuBugReport' => 'Segnala un _bug',
+ 'MenuAbout' => 'Su GCstar',
+
+ 'MenuNewWindow' => 'Visulizza articoli in una nuova finestra', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Visulizza articoli in una nuova finestra', # Accepts model codes
+
+ 'ContextExpandAll' => 'Espandi tutti',
+ 'ContextCollapseAll' => 'Collassa tutti',
+ 'ContextChooseImage' => 'Scegli _Immagine',
+ 'ContextOpenWith' => 'Apri con ...',
+ 'ContextImageEditor' => 'Modifica Immagine',
+ 'ContextImgFront' => 'Fronte',
+ 'ContextImgBack' => 'Retro',
+ 'ContextChooseFile' => 'Scegli file',
+ 'ContextChooseFolder' => 'Scegli cartella',
+
+ 'DialogEnterNumber' => 'Immettere valore',
+
+ 'RemoveConfirm' => 'Desideri davvero rimuovere questo articolo?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Desideri davvero rimuovere questi articoli?', # Accepts model codes
+ 'DefaultNewItem' => 'Nuovo articolo', # Accepts model codes
+ 'NewItemTooltip' => 'Aggiungi un nuovo articolo', # Accepts model codes
+ 'NoItemFound' => 'Nessun articolo trovato. Effettuare una ricerca su un altro sito?',
+ 'OpenList' => 'Scegliere collezione',
+ 'SaveList' => 'Scegli il nome e dove salvare la collezione',
+ 'SaveListTooltip' => 'Salva collezione corrente',
+ 'SaveUnsavedChanges' => 'Ci sono modifiche alla collezione non ancora salvate. Salvarle?',
+ 'SaveDontSave' => 'Non salvare',
+ 'PreferencesTooltip' => 'Impostazione preferenze',
+ 'ViewTooltip' => 'Cambia visualizzazione',
+ 'PlayTooltip' => 'Mostra il video associato all\'articolo', # Accepts model codes
+ 'PlayFileNotFound' => 'Il file da riprodurre non è stato trovato nella posizione:',
+ 'PlayRetry' => 'Riprova',
+
+ 'StatusSave' => 'Salvataggio...',
+ 'StatusLoad' => 'Caricamento...',
+ 'StatusSearch' => 'Ricerca in atto...',
+ 'StatusGetInfo' => 'Recupero informazioni...',
+ 'StatusGetImage' => 'Recupero immagine...',
+
+ 'SaveError' => 'Impossibile salvare la collezione! Controllare i diritti di accesso e lo spazio libero sul disco.',
+ 'OpenError' => 'Impossibile caricare la collezione! Controllare i diritti di accesso.',
+ 'OpenFormatError' => 'Impossibile interpretare la collezione! Formato probabilmente scorretto.',
+ 'OpenVersionWarning' => 'La collezione e\' stata creata con una versione piu\' recente di GCStar. Salvandola, potresti perdere dei dati.',
+ 'OpenVersionQuestion' => 'Sei sicuro di voler continuare?',
+ 'ImageError' => 'Directory non corretta! Selezionarne un\'altra.',
+ 'OptionsCreationError'=> 'Generazione file opzioni impossibile: ',
+ 'OptionsOpenError'=> 'Caricamento file opzioni impossibile: ',
+ 'OptionsSaveError'=> 'Salvataggio file opzioni impossibile: ',
+ 'ErrorModelNotFound' => 'Modello non trovato: ',
+ 'ErrorModelUserDir' => 'I modelli definiti dagli utenti sono in: ',
+
+ 'RandomTooltip' => 'Articoli non visti',
+ 'RandomError'=> 'Non ci sono articoli non visti', # Accepts model codes
+ 'RandomEnd'=> 'Non ci sono piu\' articoli', # Accepts model codes
+ 'RandomNextTip'=> 'Prossimo suggerimento',
+ 'RandomOkTip'=> 'Accetto questo articolo',
+
+ 'AboutTitle' => 'Su GCstar',
+ 'AboutDesc' => 'Manager di collezioni',
+ 'AboutVersion' => 'Versione',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian) : Project Manager, Programmatore
+Nyall Dawson (Zombiepig) : Programmatore
+TPF : Programmatore
+Adolfo González : Programmatore
+',
+ 'AboutLicense' => 'Distribuito nei i termini della GNU GPL
+Logo Copyright le Spektre',
+ 'AboutTranslation' => 'Traduzione italiana v1.0.2 - 2006-05-04 di:
+Andreas Troschka - <swsolutions@om.it.eu.org>',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo e webdesign di le Spektre',
+
+ 'ToolbarRandom' => 'Non visti',
+
+ 'UnsavedCollection' => 'Collezione non salvata',
+ 'ModelsSelect' => 'Selezionare un modello/collezione',
+ 'ModelsPersonal' => 'Personali',
+ 'ModelsDefault' => 'Predefiniti',
+ 'ModelsList' => 'Definizione collezione',
+ 'ModelSettings' => 'Impostazioni della collezione',
+ 'ModelNewType' => 'Nuovo modello di collezione',
+ 'ModelName' => 'Nome modello di collezione:',
+ 'ModelFields' => 'Campi',
+ 'ModelOptions' => 'Opzioni',
+ 'ModelFilters' => 'Filtri',
+ 'ModelNewField' => 'Nuovo campo',
+ 'ModelFieldInformation' => 'Informazioni',
+ 'ModelFieldName' => 'Etichetta:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Gruppo:',
+ 'ModelFieldValues' => 'Valori',
+ 'ModelFieldInit' => 'Predefiniti:',
+ 'ModelFieldMin' => 'Minimo:',
+ 'ModelFieldMax' => 'Massimo:',
+ 'ModelFieldList' => 'Lista valori:',
+ 'ModelFieldListLegend' => '<i>separati da virgole</i>',
+ 'ModelFieldDisplayAs' => 'Mostra come:',
+ 'ModelFieldDisplayAsText' => 'Testo',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Testo corto',
+ 'ModelFieldTypeLongText' => 'Testo lungo',
+ 'ModelFieldTypeYesNo' => 'Si/No',
+ 'ModelFieldTypeNumber' => 'Numero',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Lista valori predefiniti',
+ 'ModelFieldTypeImage' => 'Immagine',
+ 'ModelFieldTypeSingleList' => 'Lista semplice',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dipendente da altri campi',
+ 'ModelFieldParameters' => 'Parametri',
+ 'ModelFieldHasHistory' => 'Utilizza la cronologia',
+ 'ModelFieldFlat' => 'Visualizza su una riga',
+ 'ModelFieldStep' => 'Passi di incremento:',
+ 'ModelFieldFileFormat' => 'Formato file:',
+ 'ModelFieldFileFile' => 'File semplice',
+ 'ModelFieldFileImage' => 'Immagine',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Programma',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Campi da utilizzare',
+ 'ModelOptionsFieldsAuto' => 'Automatico',
+ 'ModelOptionsFieldsNone' => 'Nessuno',
+ 'ModelOptionsFieldsTitle' => 'Come titolo',
+ 'ModelOptionsFieldsId' => 'Come identificatore',
+ 'ModelOptionsFieldsCover' => 'Come copertina',
+ 'ModelOptionsFieldsPlay' => 'Per pulsante Play',
+ 'ModelCollectionSettings' => 'Impostazioni collezione',
+ 'ModelCollectionSettingsLending' => 'Prestabile',
+ 'ModelCollectionSettingsTagging' => 'Etichettabile',
+ 'ModelFilterActivated' => 'Nel box di ricerca',
+ 'ModelFilterComparison' => 'Comparazione',
+ 'ModelFilterContain' => 'Contiene',
+ 'ModelFilterDoesNotContain' => 'Non contiene',
+ 'ModelFilterRegexp' => 'Espressione regolare',
+ 'ModelFilterRange' => 'Campo',
+ 'ModelFilterNumeric' => 'Comparazione numerica',
+ 'ModelFilterQuick' => 'Creazione filtro veloce',
+ 'ModelTooltipName' => 'Specifica un nome per riutilizzare questo modello in altre collezioni. In caso di nome nullo le impostazioni verranno registrate dentro il file della collezione stessa, ma non saranno piu\' disponibili per altre collezioni.',
+ 'ModelTooltipLabel' => 'Il nome del campo cosi\' come deve essere visualizzato',
+ 'ModelTooltipGroup' => 'Utilizzato per raggruppare campi. Articoli con valore nullo verranno inseriti in un gruppo predefinito',
+ 'ModelTooltipHistory' => 'I valori precedentemente inseriti devono essere salvati in una lista associata al campo?',
+ 'ModelTooltipFormat' => 'Questo formato viene utilizzato per determinare l\'azione necessaria per aprire il file mediante il tasto Play',
+ 'ModelTooltipLending' => 'Aggiunge alcuni campi per la gestione dei prestiti',
+ 'ModelTooltipTagging' => 'Aggiunge alcuni campi per la gestione delle etichette (tags)',
+ 'ModelTooltipNumeric' => 'Nella comparazione i valori sono considerati numeri',
+ 'ModelTooltipQuick' => 'Aggiunge una voce di submenu\' nel menu\' filtri',
+
+ 'ResultsTitle' => 'Seleziona un articolo', # Accepts model codes
+ 'ResultsNextTip' => 'Cerca nel prossimo sito',
+ 'ResultsPreview' => 'Anteprima',
+ 'ResultsInfo' => 'Puoi utilizzare più risultati selezionandoli, tenendo premuto il tasto Ctrl o Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferenze',
+ 'OptionsExpertMode' => 'Modalita\' per esperti',
+ 'OptionsPrograms' => 'Specifica le applicazioni da utilizzare per i differenti media, lasciare vuoto per utilizzare quelle di sistema',
+ 'OptionsBrowser' => 'Web browser',
+ 'OptionsPlayer' => 'Video player',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Editor di immagini',
+ 'OptionsCdDevice' => 'Unita\' CD',
+ 'OptionsImages' => 'Indice di immagini',
+ 'OptionsUseRelativePaths' => 'Utilizza percorsi relativi per le immagini',
+ 'OptionsLayout' => 'Maschera',
+ 'OptionsStatus' => 'Visualizza la barra di stato in fondo alla finestra',
+ 'OptionsUseStars' => 'Usa stelle per mostrare l\'indice di gradimento',
+ 'OptionsWarning' => 'Attenzione: Le modifiche eventualmente appportate in questo pannello avranno effetto solo dopo il riavvio dell\' applicazione GCstar!!!',
+ 'OptionsRemoveConfirm' => 'Chiedi conferma prima di rimuovere un articolo dalla collezione',
+ 'OptionsAutoSave' => 'Salva automaticamente la collezione',
+ 'OptionsAutoLoad' => 'All\'avvio carica l\'ultima collezione trattata',
+ 'OptionsSplash' => 'Mostra splashscreen',
+ 'OptionsTearoffMenus' => 'Abilita il tear-off menu\'',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Seleziona il programma per essere usato',
+ 'OptionsPlugins' => 'Siti da utilizzare per le informazioni degli articoli',
+ 'OptionsAskPlugins' => 'Chiedi (Tutti i siti)',
+ 'OptionsPluginsMulti' => 'Diversi siti',
+ 'OptionsPluginsMultiAsk' => 'Chiedi (Diversi siti)',
+ 'OptionsPluginsMultiPerField' => 'Diversi siti (configurazione campi)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Diversi siti (configurazione campi)',
+ 'OptionsPluginsMultiPerFieldDesc' => 'Per ciascun campo selezionato verra\' ritornata la prima informazione non vuota partendo da sinistra',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Primo',
+ 'OptionsPluginsMultiPerFieldLast' => 'Ultimo',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Rimuovi',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Pulisci campi selezionati',
+ 'OptionsPluginsList' => 'Configura la lista',
+ 'OptionsAskImport' => 'Seleziona i campi da importare',
+ 'OptionsProxy' => 'Usa un proxy',
+ 'OptionsCookieJar' => 'Use questo cookie jar file',
+ 'OptionsLang' => 'Lingua',
+ 'OptionsMain' => 'Principale',
+ 'OptionsPaths' => 'Percorsi',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' =>'Strumenti',
+ 'OptionsDisplay' => 'Visualizzazione',
+ 'OptionsToolbar' => 'Toolbar',
+ 'OptionsToolbars' => {0 => 'Nessuno', 1 => 'Piccolo', 2 => 'Grande', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Posizione',
+ 'OptionsToolbarPositions' => {0 => 'In alto', 1 => 'In basso', 2 => 'A sinistra', 3 => 'A destra'},
+ 'OptionsExpandersMode' => 'Informazioni troppo lunghe',
+ 'OptionsExpandersModes' => {'asis' => 'Non fare niente', 'cut' => 'Taglia', 'wrap' => 'A capo automatico'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Il formato è quello utilizzato dalla funzione strftime(3). Il valore di default è %d/%m/%Y',
+ 'OptionsView' => 'Visualizzazione articoli',
+ 'OptionsViews' => {0 => 'Testo', 1 => 'Immagine', 2 => 'Dettagli'},
+ 'OptionsColumns' => 'Colonne',
+ 'OptionsMailer' => 'Metodo di invio',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Mittente e-mail',
+ 'OptionsTransform' => 'Mettere gli articoli alla fine dei titoli',
+ 'OptionsArticles' => 'Articoli (separare mediante virgola)',
+ 'OptionsSearchStop' => 'L\'utente può arrestare una ricerca',
+ 'OptionsBigPics' => 'Usa immagini grandi quando disponibili',
+ 'OptionsAlwaysOriginal' => 'Utilizza il titolo principale come originale in mancanza di uno specificato',
+ 'OptionsRestoreAccelerators' => 'Abilita combinazioni di tasti',
+ 'OptionsHistory' => 'Dimensione della cronologia',
+ 'OptionsClearHistory' => 'Cancella cronologia',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Non chiedere piu\'',
+ 'OptionsPathProgramsGroup' => 'Applicazioni',
+ 'OptionsProgramsSystem' => 'Utilizza i programmi definiti dal sistema',
+ 'OptionsProgramsUser' => 'Utilizza i programmi specificati',
+ 'OptionsProgramsSet' => 'Impostazione programmi',
+ 'OptionsPathImagesGroup' => 'Immagini',
+ 'OptionsInternetDataGroup' => 'Importazione dati',
+ 'OptionsInternetSettingsGroup' => 'Impostazioni',
+ 'OptionsDisplayInformationGroup' => 'Informazioni',
+ 'OptionsDisplayArticlesGroup' => 'Articoli',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Stile',
+ 'OptionsDetailedPreferencesGroup' => 'Preferenze',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefisso per le immagini:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titolo o nome dell\'articolo associato',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% o . verra\' rimpiazzato dal nome della directory della collezione (utilizza solo all\'inizio del percorso)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% verra\' rimpiazzato dal nome della collezione senza il suffisso (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% puo\' essere utilizzato solo all\'inizio del percorso che punta alle immagini',
+ 'OptionsConfigureMailers' => 'Configura programmi di posta',
+
+ 'ImagesOptionsButton' => 'Impostazioni',
+ 'ImagesOptionsTitle' => 'Impostazioni della lista delle immagini',
+ 'ImagesOptionsSelectColor' => 'Seleziona un colore',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Sfondo',
+ 'ImagesOptionsBgPicture' => 'Usa un\'immagine come sfondo',
+ 'ImagesOptionsFg'=> 'Selezione',
+ 'ImagesOptionsBgTooltip' => 'Cambia colore di sfondo',
+ 'ImagesOptionsFgTooltip'=> 'Cambia il colore di selezione',
+ 'ImagesOptionsResizeImgList' => 'Cambia automaticamente il numero di colonne',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Dimensione',
+ 'ImagesOptionsSizeList' => {0 => 'Ultra piccola', 1 => 'Piccola', 2 => 'Media', 3 => 'Grande', 4 => 'Extra Grande'},
+ 'ImagesOptionsSizeTooltip' => 'Seleziona dimensioni immagine',
+
+ 'DetailedOptionsTitle' => 'Impostazioni lista dettagliata',
+ 'DetailedOptionsImageSize' => 'Dimensioni immagine',
+ 'DetailedOptionsGroupItems' => 'Raggruppa gli articoli per',
+ 'DetailedOptionsSecondarySort' => 'Ordina gli articoli per',
+ 'DetailedOptionsFields' => 'Scegli i campi da visualizzare',
+ 'DetailedOptionsGroupedFirst' => 'Raggruppa insieme gli articoli orfani',
+ 'DetailedOptionsAddCount' => 'Aggiungi il numero di elementi alle categorie',
+
+ 'ExtractButton' => 'Informazioni',
+ 'ExtractTitle' => 'Informazioni file',
+ 'ExtractImport' => 'Utilizza i valori',
+
+ 'FieldsListOpen' => 'Caricare un elenco di campi da un file',
+ 'FieldsListSave' => 'Salvare un elenco di campi in un file',
+ 'FieldsListError' => 'L\'elenco di campi non puo\' essere utilizzato con questo modello di collezione',
+ 'FieldsListIgnore' => '--- Ignora',
+
+ 'ExportTitle' => 'Gestione elenco campi da esportare',
+ 'ExportFilter' => 'Esportare solo i campi visualizzati',
+ 'ExportFieldsTitle' => 'Campi da esportare',
+ 'ExportFieldsTip' => 'Campi prescelti per l\'esportazione',
+ 'ExportWithPictures' => 'Copiare le immagini in una sottodirectory',
+ 'ExportSortBy' => 'Ordina per',
+ 'ExportOrder' => 'Ordine',
+
+ 'ImportListTitle' => 'Importazione della collezione:',
+ 'ImportExportData' => 'Dati',
+ 'ImportExportFile' => 'Elenco',
+ 'ImportExportFieldsUnused' => 'Campi non selezionati',
+ 'ImportExportFieldsUsed' => 'Campi selezionati',
+ 'ImportExportFieldsFill' => 'Tutti i campi',
+ 'ImportExportFieldsClear' => 'Nessun campo',
+ 'ImportExportFieldsEmpty' => 'Occorre selezionare almeno un campo',
+ 'ImportExportFileEmpty' => 'Specificare un nome per il file',
+ 'ImportFieldsTitle' => 'Campi da importare',
+ 'ImportFieldsTip' => 'Scegliere i campi da importare',
+ 'ImportNewList' => 'Creare una nuova collezione',
+ 'ImportCurrentList' => 'Aggiungere alla collezione corrente',
+ 'ImportDropError' => 'Si e\' verificato un errore durante l\'apertura di almeno un file. Viene ricaricata la precedente collezione!',
+ 'ImportGenerateId' => 'Generare identificatore per ogni articolo',
+
+ 'FileChooserOpenFile' => 'Selezionare l\'elenco',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Seleziona un indice',
+ 'FileChooserOverwrite' => 'Questa collezione esiste gia\', sovrascriverla?',
+ 'FileAllFiles' => 'Tutti i file',
+ 'FileVideoFiles' => 'Video File',
+ 'FileEbookFiles' => 'Ebook File',
+ 'FileAudioFiles' => 'Audio File',
+ 'FileGCstarFiles' => 'Collezioni GCStar',
+
+ 'PanelCompact' => 'Compattare',
+ 'PanelReadOnly' => 'Sola lettura',
+ 'PanelForm' => 'Etichette',
+
+ 'PanelSearchButton' => 'Recupera informazioni',
+ 'PanelSearchTip' => 'Cerca informazioni secondo il titolo dell\'articolo inserito',
+ 'PanelSearchContextChooseOne' => 'Scegli un sito ...',
+ 'PanelSearchContextMultiSite' => 'Use "Diversi siti"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Diversi siti (configurazione campi)"',
+ 'PanelSearchContextOptions' => 'Cambia opzioni ...',
+ 'PanelImageTipOpen' => 'Clicca sull\'immagine per sceglierne un\'altra.',
+ 'PanelImageTipView' => 'Clicca sull\'immagine per visualizzare in grandezza naturale.',
+ 'PanelImageTipMenu' => 'Clicca tasto destro per piu\' opzioni.',
+ 'PanelImageTitle' => 'Scegliere un\'immagine',
+ 'PanelImageNoImage' => 'Nessuna immagine',
+ 'PanelSelectFileTitle' => 'Seleziona un file',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Ripristina predefiniti',
+ 'PanelRefresh' => 'Aggiorna',
+ 'PanelRefreshTip' => 'Aggiorna le informazioni dal web',
+
+ 'PanelFrom' =>'Da',
+ 'PanelTo' =>'A',
+
+ 'PanelWeb' => 'Leggi informazioni dell\'articolo',
+ 'PanelWebTip' => 'Leggi informazioni su questo articolo e disponibili sul web', # Accepts model codes
+ 'PanelRemoveTip' => 'Rimuovi l\'articolo corrente', # Accepts model codes
+
+ 'PanelDateSelect' => 'Scegli una data',
+ 'PanelNobody' => 'Nessuno',
+ 'PanelUnknown' => 'Sconosciuta',
+ 'PanelAdded' => 'Aggiungi data',
+ 'PanelRating' => 'Valutazione',
+ 'PanelPressRating' => 'Press ratings',
+ 'PanelLocation' => 'Luogo',
+
+ 'PanelLending' => 'Prestiti',
+ 'PanelBorrower' => 'Prestiti',
+ 'PanelLendDate' => 'Data',
+ 'PanelHistory' => 'Cronologia',
+ 'PanelReturned' => 'Articolo restituito', # Accepts model codes
+ 'PanelReturnDate' => 'Data restituzione',
+ 'PanelLendedYes' => 'Prestato',
+ 'PanelLendedNo' => 'Disponibile',
+
+ 'PanelTags' => 'Etichette (Tags)',
+ 'PanelFavourite' => 'Preferiti',
+ 'TagsAssigned' => 'Etichette assegnate',
+
+ 'PanelUser' => 'Campi utente',
+
+ 'CheckUndef' => 'Nessun problema',
+ 'CheckYes' => 'Sì',
+ 'CheckNo' => 'No',
+
+ 'ToolbarAll' => 'Mostra tutto',
+ 'ToolbarAllTooltip' => 'Visualizza tutti gli articoli',
+ 'ToolbarGroupBy' => 'Raggruppa per',
+ 'ToolbarGroupByTooltip' => 'Selezionare il campo da utilizzare per raggruppare gli articoli della collezione',
+ 'ToolbarQuickSearch' => 'Ricerca rapida',
+ 'ToolbarQuickSearchLabel' => 'Ricerca',
+ 'ToolbarQuickSearchTooltip' => 'Seleziona il campo in cui ricercare. Inserisci le parole da ricercare e premi Invio',
+ 'ToolbarSeparator' => ' Separatore',
+
+ 'PluginsTitle' => 'Cerca un articolo',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Cerca un sito',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nome',
+ 'PluginsSearchFields' => 'Cerca campi',
+ 'PluginsAuthor' => 'Autore',
+ 'PluginsLang' => 'Lingua',
+ 'PluginsUseSite' => 'Utilizza il sito selezionato per ricerche future',
+ 'PluginsPreferredTooltip' => 'Sito raccomandato da GCstar',
+ 'PluginDisabled' => 'Disabilitato',
+
+ 'BorrowersTitle' => 'Configurazione prestiti',
+ 'BorrowersList' => 'Beneficiari dei prestiti',
+ 'BorrowersName' => 'Nome',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Aggiungi',
+ 'BorrowersRemove' => 'Elimina',
+ 'BorrowersEdit' => 'Modifica',
+ 'BorrowersTemplate' => 'Modello mail',
+ 'BorrowersSubject' => 'Oggetto',
+ 'BorrowersNotice1' => '%1 inserisce il nome di chi beneficia del prestito',
+ 'BorrowersNotice2' => '%2 inserisce il nome dell\'articolo',
+ 'BorrowersNotice3' => '%3 inserisce la data del prestito',
+
+ 'BorrowersImportTitle' => 'Importa informazioni beneficiari di prestito',
+ 'BorrowersImportType' => 'Formato file:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Articoli prestati', # Accepts model codes
+ 'BorrowedDate' => 'Il',
+ 'BorrowedDisplayInPanel' => 'Mostra articolo nella schermata principale', # Accepts model codes
+
+ 'MailTitle' => 'Manda una e-mail',
+ 'MailFrom' => 'Da: ',
+ 'MailTo' => 'A: ',
+ 'MailSubject' => 'Oggetto: ',
+ 'MailSmtpError' => 'Problema di connessione al server SMTP',
+ 'MailSendmailError' => 'Problema nell\'inviare l\'e-mail',
+
+ 'SearchTooltip' => 'Cerca nella collezione', # Accepts model codes
+ 'SearchTitle' => 'Cerca', # Accepts model codes
+ 'SearchNoField' => 'Nessun campo è stato selezionato nel box di ricerca.
+Aggiungine uno o più nella scheda Filtri, nelle impostazioni per la collezione.',
+
+ 'QueryReplaceField' => 'Campo da sostituire',
+ 'QueryReplaceOld' => 'Nome corrente',
+ 'QueryReplaceNew' => 'Nuovo nome',
+ 'QueryReplaceLaunch' => 'Sostituisci',
+
+ 'ImportWindowTitle' => 'Scegli i campi da importare',
+ 'ImportViewPicture' => 'Visualizza immagine',
+ 'ImportSelectAll' => 'Aggiungi tutti',
+ 'ImportSelectNone' => 'Rimuovi tutti',
+
+ 'MultiSiteTitle' => 'Siti da interrogare per le ricerche',
+ 'MultiSiteUnused' => 'Plugin inutilizzati',
+ 'MultiSiteUsed' => 'Plugin da utilizzare',
+ 'MultiSiteLang' => 'Riempi la lista con il plugin inglese',
+ 'MultiSiteEmptyError' => 'Hai una lista di siti vuota',
+ 'MultiSiteClear' => 'Pulisci la lista',
+
+ 'DisplayOptionsTitle' => 'Articoli da visualizzare',
+ 'DisplayOptionsAll' => 'Scegli tutto',
+ 'DisplayOptionsSearch' => 'Pulsante ricerche',
+
+ 'GenresTitle' => 'Conversione di genere',
+ 'GenresCategoryName' => 'Genere da utilizzare',
+ 'GenresCategoryMembers' => 'Genere da sostituire',
+ 'GenresLoad' => 'Carica lista',
+ 'GenresExport' => 'Salva lista in un file',
+ 'GenresModify' => 'Modifica conversione',
+
+ 'PropertiesName' => 'Nome collezione',
+ 'PropertiesLang' => 'Codice lingua',
+ 'PropertiesOwner' => 'Proprietario',
+ 'PropertiesEmail' => 'e-mail',
+ 'PropertiesDescription' => 'Descrizione',
+ 'PropertiesFile' => 'Informazione file',
+ 'PropertiesFilePath' => 'Percorso completo',
+ 'PropertiesItemsNumber' => 'Numero di articoli', # Accepts model codes
+ 'PropertiesFileSize' => 'Dimensione',
+ 'PropertiesFileSizeSymbols' => ['Byte', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Proprieta\' collezione',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programmi per spedizione e-mail',
+ 'MailProgramsName' => 'Nome',
+ 'MailProgramsCommand' => 'Linea di comando',
+ 'MailProgramsRestore' => 'Riproponi predefiniti',
+ 'MailProgramsAdd' => 'Aggiungi programma',
+ 'MailProgramsInstructions' => 'Nella command-line:
+ %f inserisce l\'indirizzo di e-mail del mittente.
+ %t inserisce l\'indirizzo di e-mail del destinatario.
+ %s inserisce il soggetto del messaggio.
+ %b inserisce il testo del messaggio.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Etichetta',
+ 'BookmarksPath' => 'Percorso',
+ 'BookmarksNewFolder' => 'Nuova cartella',
+
+ 'AdvancedSearchType' => 'Tipo di ricerca',
+ 'AdvancedSearchTypeAnd' => 'Articoli soddisfacenti tutti i criteri (AND)', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Articoli soddisfacenti almeno un criterio (OR)', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteri',
+ 'AdvancedSearchAnyField' => 'Qualsiasi campo',
+ 'AdvancedSearchSaveTitle' => 'Salva ricerca',
+ 'AdvancedSearchSaveName' => 'Nome',
+ 'AdvancedSearchSaveOverwrite' => 'Una ricerca salvata esiste già con questo nome. Utilizzare un nome differente.',
+ 'AdvancedSearchUseCase' => 'Distinzione maiuscole/minuscole',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignora accenti ed altri caratteri speciali',
+
+ 'BugReportSubject' => 'Bug report generato da GCstar',
+ 'BugReportVersion' => 'Versione',
+ 'BugReportPlatform' => 'Sistema operativo',
+ 'BugReportMessage' => 'Messaggio d\'errore',
+ 'BugReportInformation' => 'Informazioni addizionali',
+
+#Statistics
+ 'StatsFieldToUse' => 'Campi da usare',
+ 'StatsSortByNumber' => 'Ordina per numero di {lowercaseX}',
+ 'StatsGenerate' => 'Genera',
+ 'StatsKindOfGraph' => 'Tipo di grafico',
+ 'StatsBars' => 'Barre',
+ 'StatsPie' => 'Torta',
+ 'Stats3DPie' => 'Torta 3D',
+ 'StatsArea' => 'Aree',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Lunghezza',
+ 'StatsHeight' => 'Altezza',
+ 'StatsFontSize' => 'Dimensione carattere',
+ 'StatsDisplayNumber' => 'Mostra numeri',
+ 'StatsSave' => 'Salva statistiche su file',
+ 'StatsAccumulate' => 'Accumula valori',
+ 'StatsShowAllDates' => 'Mostra tutte le date',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/IT/README.txt b/lib/gcstar/GCLang/IT/README.txt
new file mode 100644
index 0000000..0679b6d
--- /dev/null
+++ b/lib/gcstar/GCLang/IT/README.txt
@@ -0,0 +1,9 @@
+#######################################################
+#
+# v1.0.2 - Italian localization by Andreas Troschka
+#
+# for GCstar v1.1.1
+#
+#######################################################
+
+
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..b72eb0d
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::NL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inclusief veldnamen aan de bovenkant',
+ 'Separator' => 'Scheidingsteken',
+ 'Replacement' => 'Vervang het scheidingsteken door',
+ 'Charset' => 'Tekenset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..2c2bf1c
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::NL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..dbad849
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::NL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ongeldig sjabloonbestand',
+ 'UseFile' => 'Gebruik het hieronder gespecificeerde bestand',
+ 'WithJS' => 'Gebruik Javascript',
+ 'FileTemplate' => 'Sjabloon',
+ 'Preview' => 'Voorbeeld',
+ 'NoPreview' => 'Geen voorbeeld beschikbaar',
+ 'TemplateExternalFile' => 'Sjabloonbestand',
+ 'Title' => 'Paginatitel',
+ 'InfoFile' => 'Filmlijst staat in het bestand: ',
+ 'InfoDir' => 'Afbeeldingen staan in: ',
+ 'HeightImg' => 'Hoogte (in pixels) van het uit te voeren beeld',
+ 'OpenFileInBrowser' => 'Open gegenereerd bestand in de webbrowser',
+ 'Note' => 'Lijst gegenereerd door <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Geef de gezochte tekst',
+ 'SearchType1' => 'Titel alleen',
+ 'SearchType2' => 'Volledige informatie',
+ 'SearchButton' => 'Zoek',
+ 'SearchTitle' => 'Toon enkel films overeenstemmend met voorgaande criteria',
+ 'AllButton' => 'Alle',
+ 'AllTitle' => 'Toon alle films',
+ 'Expand' => 'Alles uitvouwen',
+ 'ExpandTitle' => 'Toon alle informatie van de films',
+ 'Collapse' => 'Alles dichtvouwen',
+ 'CollapseTitle' => 'Verberg alle informatie van de films',
+ 'Borrowed' => 'Geleend door: ',
+ 'NotBorrowed' => 'Beschikbaar',
+ 'Top' => 'Bovenaan',
+ 'Bottom' => 'Onderaan',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..7371152
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::NL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..f59a75a
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::NL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inclusief DROP instructie',
+ 'WithCreate' => 'Inclusief CREATE instructie',
+ 'TableName' => 'Tabel Naam',
+ 'InfoFile' => 'SQL bestand: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..cbfeb73
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::NL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archief staat in bestand: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..031b08e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::NL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Sjabloon bestand',
+ 'ModelText' => 'Sjabloon tekst',
+ 'Models' => 'Te gebruiken sjabloon',
+ 'UseFile' => 'Gebruik bestand',
+ 'UseModel' => 'Gebruik tekst zone',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9029b3b
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::NL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Waar moet ik zoeken',
+ 'Default' => 'Standaard Alexandria\'s map',
+ 'Specified' => 'Map hieronder aangegeven',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..9d4a1a9
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::NL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Tekenset',
+ 'Header' => 'Negeer eerste lijn',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Webpagina te gebruiken',
+ 'UseFirst' => 'Selecteer de eerste bij een groot aantal resultaten',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..ddf445e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::NL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Map',
+ 'Recursive' => 'Doorblader sub-mappen',
+ 'Suffixes' => 'Achtervoegsels of extensies van de bestanden',
+ 'SuffixesTooltip' => 'Een door komma\'s gescheiden lijst van achtervoegsels of extensies van de te overwegen bestanden',
+ 'Remove' => 'Om te worden verwijderd uit de namen',
+ 'RemoveTooltip' => 'Een door komma\'s gescheiden lijst van woorden dat uit de bestandsnamen verwijderd moeten worden om de opgehaalde namen aan te maken',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # Deze plug-in deelt enkele waarden met ImportList, het voegt hen van het toe
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..7793d13
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::NL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopieer afbeeldingen',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..fe9fff6
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::NL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Namenlijst',
+ 'Plugin' => 'Webpagina te gebruiken',
+ 'UseFirst' => 'Selecteer de eerste bij een groot aantal resultaten',
+ 'CommentAuto' => 'Item automatisch geïmporteerd.',
+ 'CommentSite' => 'Webpagina: ',
+ 'CommentTitle' => 'Titel: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..6663e3e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::NL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..455af81
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::NL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Bestand is een niet ondersteunde Tellico collectie',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..cc3812f
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::NL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie TV-serie (afleveringen)',
+ Items => 'Afleveringen',
+ NewItem => 'Nieuwe aflevering',
+ NewSeries => 'Nieuwe serie',
+ Episode => 'Aflevering',
+ );
+ # Beiden zijn nodig als importTranslation niet voorvalt
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..45679d4
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::NL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie TV-series',
+ Items => 'Series',
+ NewItem => 'Nieuwe serie',
+ Name => 'Naam',
+ Season => 'Seizoen',
+ Part => 'Deel',
+ Episodes => 'Afleveringen',
+ FirstAired => 'Eerste keer uitgezonden',
+ Time => 'Speelduur',
+ Producer => 'Producent',
+ Music => 'Muziek',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..885b0e7
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::NL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie gezelschapsspellen',
+ Items => {0 => 'Spel',
+ 1 => 'Spel',
+ X => 'Spellen'},
+ NewItem => 'Nieuw spel',
+
+ Id => 'Id',
+ Name => 'Naam',
+ Original => 'Oorspronkelijke naam',
+ Box => 'Afbeelding van de doos',
+ DesignedBy => 'Ontworpen door',
+ PublishedBy => 'Gepubliceerd door',
+ Players => 'Aantal spelers',
+ PlayingTime => 'Speelduur',
+ SuggestedAge => 'Voorgestelde leeftijd',
+ Released => 'Uitgegeven',
+ Description => 'Beschrijving',
+ Category => 'Categorie',
+ Mechanics => 'Mechanisme(s)',
+ ExpandedBy => 'Uitgebreid door',
+ ExpansionFor => 'Uitbreiding voor',
+ GameFamily => 'Spelgenre',
+ IllustratedBy => 'Geïllustreerd door',
+ Url => 'Webpagina',
+ TimesPlayed => 'Aantal keer gespeeld',
+ CompleteContents => 'Volledige inhoud',
+ Copies => 'Aantal exemplaren',
+ Condition => 'Staat',
+ Photos => 'Foto\'s',
+ Photo1 => 'Eerste foto',
+ Photo2 => 'Tweede foto',
+ Photo3 => 'Derde foto',
+ Photo4 => 'Vierde foto',
+ Comments => 'Opmerkingen',
+
+ Perfect => 'Perfect',
+ Good => 'Goed',
+ Average => 'Gemiddeld',
+ Poor => 'Slecht',
+
+ CompleteYes => 'Volledige inhoud',
+ CompleteNo => 'Ontbrekende stukjes',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ Personal => 'Persoonlijk',
+ Information => 'Informatie',
+
+ FilterRatingSelect => 'Minimum waardering...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/NL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..f193ee8
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::NL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie boeken',
+ Items => {0 => 'Boek',
+ 1 => 'Boek',
+ X => 'Boeken'},
+ NewItem => 'Nieuw boek',
+
+ Isbn => 'ISBN',
+ Title => 'Titel',
+ Cover => 'Cover',
+ Authors => 'Auteurs',
+ Publisher => 'Uitgever',
+ Publication => 'Publicatiedatum',
+ Language => 'Taal',
+ Genre => 'Genre',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Bookdescription => 'Beschrijving',
+ Pages => 'Pagina\'s',
+ Read => 'Lees',
+ Acquisition => 'Verkregen op',
+ Edition => 'Uitgave',
+ Format => 'Formaat',
+ Comments => 'Opmerkingen',
+ Url => 'Webpagina',
+ Translator => 'Vertaler',
+ Artist => 'Illustrator',
+ DigitalFile => 'Digital version',
+
+ General => 'Algemeen',
+ Details => 'Details',
+
+ ReadNo => 'Niet gelezen',
+ ReadYes => 'Gelezen',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/NL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..0a43a56
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::NL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatische collectie',
+ Items => {0 => 'Muntstuk',
+ 1 => 'Muntstuk',
+ X => 'Muntstukken'},
+ NewItem => 'Nieuw muntstuk',
+
+ Name => 'Naam',
+ Country => 'Land',
+ Year => 'Jaar',
+ Currency => 'Valuta',
+ Value => 'Waarde',
+ Picture => 'Hoofdafbeelding',
+ Diameter => 'Diameter',
+ Metal => 'Metaal',
+ Edge => 'Rand',
+ Edge1 => 'Rand 1',
+ Edge2 => 'Rand 2',
+ Edge3 => 'Rand 3',
+ Edge4 => 'Rand 4',
+ Head => 'Kop',
+ Tail => 'Munt',
+ Comments => 'Opmerkingen',
+ History => 'Geschiedenis',
+ Website => 'Webpagina',
+ Estimate => 'Raming',
+ References => 'Referenties',
+ Type => 'Type',
+ Coin => 'Muntstuk',
+ Banknote => 'Bankbiljet',
+
+ Main => 'Hoofd',
+ Description => 'Beschrijving',
+ Other => 'Overige informatie',
+ Pictures => 'Afbeeldingen',
+
+ Condition => 'Toestand (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/NL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..e3105cc
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::NL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie strips',
+ Items => {0 => 'Strips',
+ 1 => 'Strip',
+ X => 'Strips'},
+ NewItem => 'Nieuwe strip',
+
+
+ Id => 'Id',
+ Name => 'Naam',
+ Series => 'Series',
+ Volume => 'Deel',
+ Title => 'Titel',
+ Writer => 'Schrijver',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colorist',
+ Publisher => 'Uitgever',
+ Synopsis => 'Synopsis',
+ Collection => 'Collectie',
+ PublishDate => 'Publicatiedatum',
+ PrintingDate => 'Afdrukdatum',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Categorie',
+ Format => 'Formaat',
+ NumberBoards => 'Aantal',
+ Signing => 'Ondertekening',
+ Cost => 'Kost',
+ Rating => 'Waardering',
+ Comment => 'Opmerkingen',
+ Url => 'Webpagina',
+
+ FilterRatingSelect => 'Minimum waardering...',
+
+ Main => 'Belangrijkste punten',
+ General => 'Algemeen',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/NL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..2e2c09a
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::NL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie films',
+ Items => {0 => 'Film',
+ 1 => 'Film',
+ X => 'Films'},
+ NewItem => 'Nieuwe film',
+
+
+ Id => 'Id',
+ Title => 'Titel',
+ Date => 'Datum',
+ Time => 'Speelduur',
+ Director => 'Director',
+ Country => 'Land',
+ MinimumAge => 'Minimum leeftijd',
+ Genre => 'Genre',
+ Image => 'Afbeelding',
+ Original => 'Originele titel',
+ Actors => 'Acteurs',
+ Actor => 'Acteur',
+ Role => 'Rol',
+ Comment => 'Opmerkingen',
+ Synopsis => 'Synopsis',
+ Seen => 'Gezien',
+ Number => '# van de Media',
+ Format => 'Media',
+ Region => 'Regio',
+ Identifier => 'Identificatie',
+ Url => 'Webpagina',
+ Audio => 'Geluid',
+ Video => 'Videoformaat',
+ Trailer => 'Videobestand',
+ Serie => 'Serie',
+ Rank => 'Rank',
+ Subtitles => 'Ondertitels',
+
+ SeenYes => 'Gezien',
+ SeenNo => 'Niet Gezien',
+
+ AgeUnrated => 'Niet geschat',
+ AgeAll => 'Alle leeftijden',
+ AgeParent => 'Begeleiding ouders',
+
+ Main => 'Hoofditems',
+ General => 'Algemeen',
+ Details => 'Details',
+
+ Information => 'Informatie',
+ Languages => 'Talen',
+ Encoding => 'Codering',
+
+ FilterAudienceAge => 'Leeftijdcategorie',
+ FilterSeenNo => '_Nog niet gezien',
+ FilterSeenYes => '_Al gezien',
+ FilterRatingSelect => 'Minimum waardering...',
+
+ ExtractSize => 'Grootte',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCgames.pm b/lib/gcstar/GCLang/NL/GCModels/GCgames.pm
new file mode 100644
index 0000000..2ee1a84
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::NL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie computerspellen',
+ Items => {0 => 'Spel',
+ 1 => 'Spel',
+ X => 'Spellen'},
+ NewItem => 'Nieuw spel',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Naam',
+ Platform => 'Platform',
+ Players => 'Aantal spelers',
+ Released => 'Uitgegeven',
+ Editor => 'Montage',
+ Developer => 'Ontwikkelaar',
+ Genre => 'Genre',
+ Box => 'Afbeelding van de doos',
+ Case => 'Zaak',
+ Manual => 'Handleiding',
+ Completion => 'Voltooid (%)',
+ Executable => 'Uitvoerbaar bestand',
+ Description => 'Beschrijving',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Geheimen',
+ Screenshots => 'Schermafdrukken',
+ Screenshot1 => 'Eerste schermafdruk',
+ Screenshot2 => 'Tweede schermafdruk',
+ Comments => 'Opmerkingen',
+ Url => 'Webpagina',
+ Unlockables => 'ontgrendelbare',
+ Unlockable => 'ontgrendelbaar',
+ Howto => 'Hoe te ontgrendelen',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Informatie',
+
+ FilterRatingSelect => 'Minimum waardering...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..f12b436
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::NL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/NL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..57b2bd3
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::NL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/NL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f1eff76
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::NL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Muziekcollectie',
+ Items => {0 => 'Album',
+ 1 => 'Album',
+ X => 'Albums'},
+ NewItem => 'Nieuw album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titel',
+ Cover => 'Hoes',
+ Artist => 'Artiest',
+ Format => 'Formaat',
+ Running => 'Speelduur',
+ Release => 'Datum uitgave',
+ Genre => 'Genre',
+ Origin => 'Oorsprong',
+
+#voor tracks lijst
+ Tracks => 'Trackslijst',
+ Number => 'Nummer',
+ Track => 'Titel',
+ Time => 'Duur',
+
+ Composer => 'Componist',
+ Producer => 'Producent',
+ Playlist => 'Afspeellijst',
+ Comments => 'Opmerkingen',
+ Label => 'Label',
+ Url => 'Webpagina',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..433ccaa
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::NL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..179b1b4
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::NL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..330b3fc
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::NL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/NL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..1f70d68
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::NL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCModels/GCwines.pm b/lib/gcstar/GCLang/NL/GCModels/GCwines.pm
new file mode 100644
index 0000000..035a6fb
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::NL::GCModels::GCwines;
+
+ use utf8;
+
+# Auteursrecht 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Collectie wijn',
+ Items => {0 => 'Wijn',
+ 1 => 'Wijn',
+ X => 'Wijn'},
+ NewItem => 'Nieuwe wijn',
+
+ Name => 'Naam',
+ Designation => 'Benoeming',
+ Vintage => 'Wijnoogst',
+ Vineyard => 'Wijngaard',
+ Type => 'Type',
+ Grapes => 'Druiven',
+ Soil => 'Bodem',
+ Producer => 'Producent',
+ Country => 'Land',
+ Volume => 'Inhoud (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medaille',
+
+ Storage => 'Opslag',
+ Location => 'Locatie',
+ ShelfIndex => 'Index',
+ Quantity => 'Hoeveelheid',
+ Acquisition => 'Verwerving',
+ PurchaseDate => 'Aankoopdatum',
+ PurchasePrice => 'Aankoopprijs',
+ Gift => 'Geschenk',
+ BottleLabel => 'Label van de fles',
+ Website => 'Referentie op het web',
+
+ Tasted => 'Geproefd',
+ Comments => 'Opmerkingen',
+ Serving => 'Serveren',
+ TastingField => 'Nota\'s van het proeven',
+
+ General => 'Algemeen',
+ Details => 'Details',
+ Tasting => 'Proeven',
+
+ TastedNo => 'Niet geproefd',
+ TastedYes => 'Geproefd',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Nog niet geproefd',
+ FilterTastedYes => 'Al geproefd',
+ FilterRatingSelect => 'Minimum waardering...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/NL/GCstar.pm b/lib/gcstar/GCLang/NL/GCstar.pm
new file mode 100644
index 0000000..7a88d8e
--- /dev/null
+++ b/lib/gcstar/GCLang/NL/GCstar.pm
@@ -0,0 +1,671 @@
+{
+ package GCLang::NL;
+
+ use utf8;
+###################################################
+#
+# Auteursrecht 2005-2009 Tian
+#
+# Dit bestand is onderdeel van GCstar.
+#
+# GCstar is gratis software; je kan het verspreiden en/ of wijzigen
+# onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
+# de Free Software Foundation; ofwel versie 2 van de licentie, of
+# (op uw keuze) een latere versie.
+#
+# GCstar wordt verspreid in de hoop dat het nuttig zal zijn
+# maar ZONDER ENIGE GARANTIE, zelfs zonder de impliciete garantie van
+# Verkoopbaarheid of geschiktheid voor een bepaald doel. Zie de
+# GNU General Public License voor meer details.
+#
+# Je zou een kopie van de GNU General Public License moeten ontvangen hebben
+# samen met GCstar; zo niet, schrijf naar de Free Software
+# Foundation, Inc, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Nederlands',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Waarschuwing</b>:
+
+Informatie gedownload van websites (via de zoekplugins) is <b>enkel voor persoonlijk gebruik</b>.
+
+Elke herverdeling is verboden zonder <b>uitdrukkelijke toestemming</b> van de website.
+
+Om te bepalen welke site eigenaar van de informatie is,
+
+kunt u gebruik maken van de <b>onderstaande knop item details</b>.',
+
+ 'AllItemsFiltered' => 'Geen item komt overeen met je filtercriteria', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installeren in ',
+ 'InstallMandatory' => 'Verplichte onderdelen',
+ 'InstallOptional' => 'Optionele onderdelen',
+ 'InstallErrorMissing' => 'Fout: de volgende onderdelen van Perl moeten geïnstalleerd worden: ',
+ 'InstallPrompt' => 'Basismap voor installatie [/usr/local]: ',
+ 'InstallEnd' => 'Einde van de installatie',
+ 'InstallNoError' => 'Geen fouten',
+ 'InstallLaunch' => 'Om gebruik te maken van deze toepassing, kun je starten ',
+ 'InstallDirectory' => 'Basismap',
+ 'InstallTitle' => 'GCstar installatie',
+ 'InstallDependencies' => 'Afhankelijkheden',
+ 'InstallPath' => 'Doel',
+ 'InstallOptions' => 'Opties',
+ 'InstallSelectDirectory' => 'Kies basismap voor de installatie',
+ 'InstallWithClean' => 'Verwijder bestanden die in de installatiemap gevonden zijn',
+ 'InstallWithMenu' => 'Voeg GCstar toe aan het menu Toepassingen',
+ 'InstallNoPermission' => 'Fout: geen schrijfrechten in de gekozen map',
+ 'InstallMissingMandatory' => 'Verplichte onderdelen ontbreken. Zolang deze niet geïnstalleerd zijn, kun je GCstar niet installeren.',
+ 'InstallMissingOptional' => 'Enkele optionele afhankelijkheden ontbreken. Deze zijn opgesomd in de lijst hieronder. GCstar zal geïnstalleerd worden, maar enkele mogelijkheden zullen niet werken.',
+ 'InstallMissingNone' => 'Alle afhankelijkheden zijn in orde. Je kunt doorgaan met de installatie.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Ontbreekt',
+ 'InstallMissingFor' => 'Ontbreekt voor',
+ 'InstallCleanDirectory' => 'Verwijderen van GCstar\'s bestanden in de map: ',
+ 'InstallCopyDirectory' => 'Bestanden kopiëren naar map: ',
+ 'InstallCopyDesktop' => 'Kopieer desktopbestand in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Gebruik een proxy (druk op enter om zonder proxy door te gaan): ',
+ 'UpdateNoPermission' => 'Geen schrijfrechten in deze map: ',
+ 'UpdateNone' => 'Geen update gevonden',
+ 'UpdateFileNotFound' => 'Bestand niet gevonden',
+
+#Splash
+ 'SplashInit' => 'Initialisatie',
+ 'SplashLoad' => 'Collectie wordt geladen',
+ 'SplashDisplay' => 'Collectie weergeven',
+ 'SplashSort' => 'Collectie sorteren',
+ 'SplashDone' => 'Klaar',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Waarschijnlijk gebruikte je GCfilms eerder. Wat wil je importeren van GCfilms naar GCstar? (Dit heeft geen invloed op GCfilms als je die nog wilt gebruiken.)',
+ 'GCfilmsImportOptions' => 'Instellingen',
+ 'GCfilmsImportData' => 'Filmlijst',
+
+#Menus
+ 'MenuFile' => '_Bestand',
+ 'MenuNewList' => '_Nieuwe collectie',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Recente collecties',
+ 'MenuLend' => 'Toon _Uitgeleende items', # Accepts model codes
+ 'MenuImport' => '_Importeer',
+ 'MenuExport' => '_Exporteer',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Bewerken',
+ 'MenuDuplicate' => 'Du_pliceer item', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_pliceer items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Verwijder item', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove items', # Accepts model codes
+ 'MenuEditFields' => 'Ve_rander collectievelden',
+ 'MenuEditLockItems' => '_Blokkeer collectie',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Bewaarde zoekopdrachten',
+ 'MenuSavedSearchesSave' => 'Bewaar huidige zoekopdracht',
+ 'MenuSavedSearchesEdit' => 'Modificeer opgeslagen zoekopdrachten',
+ 'MenuAdvancedSearch' => 'Geavanceer_de zoekopdracht',
+ 'MenuViewAllItems' => 'Toon _Alle items', # Accepts model codes
+ 'MenuNoFilter' => '_Om het even welk',
+
+ 'MenuConfiguration' => 'In_stellingen',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Getoon_de informatie',
+ 'MenuBorrowers' => '_Leners',
+ 'MenuToolbarConfiguration' => '_Werkbalk aanpassen',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre om_zetting',
+
+ 'MenuBookmarks' => 'Mijn _Collecties',
+ 'MenuBookmarksAdd' => '_Huidige collectie toevoegen',
+ 'MenuBookmarksEdit' => '_Bewerk opgeslagen collecties',
+
+ 'MenuHelp' => '_Help',
+ 'MenuHelpContent' => '_Inhoud',
+ 'MenuAllPlugins' => 'Bekijk _Plug-ins',
+ 'MenuBugReport' => 'Rappor_teer een probleem',
+ 'MenuAbout' => '_Over GCstar',
+
+ 'MenuNewWindow' => 'Toon item in _Nieuw Venster', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Toon items in _Nieuw Venster', # Accepts model codes
+
+ 'ContextExpandAll' => 'Alles _uitvouwen',
+ 'ContextCollapseAll' => 'Alles _samenvouwen',
+ 'ContextChooseImage' => '_Kies afbeelding',
+ 'ContextOpenWith' => 'Openen _met',
+ 'ContextImageEditor' => 'Afbeeldingsbewerker',
+ 'ContextImgFront' => 'Voorkant',
+ 'ContextImgBack' => 'Achterkant',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Voer een waarde in',
+
+ 'RemoveConfirm' => 'Ben je zeker dat je dit item wilt verwijderen?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Nieuw item', # Accepts model codes
+ 'NewItemTooltip' => 'Voeg een nieuw item toe', # Accepts model codes
+ 'NoItemFound' => 'Niets gevonden. Wil je in een andere website zoeken?',
+ 'OpenList' => 'Kies collectie',
+ 'SaveList' => 'Kies waar je de collectie wilt opslaan',
+ 'SaveListTooltip' => 'Bewaar huidige collectie',
+ 'SaveUnsavedChanges' => 'Er zijn niet opgeslagen wijzigingen in je collectie. Wil je die opslaan?',
+ 'SaveDontSave' => 'Niet opslaan',
+ 'PreferencesTooltip' => 'Instellingen',
+ 'ViewTooltip' => 'Verander collectiebeeld',
+ 'PlayTooltip' => 'Open bestand geassocieerd met dit item', # Accepts model codes
+ 'PlayFileNotFound' => 'Bestand niet gevonden op deze plaats:',
+ 'PlayRetry' => 'Opnieuw',
+
+ 'StatusSave' => 'Opslaan...',
+ 'StatusLoad' => 'Laden...',
+ 'StatusSearch' => 'Bezig met zoeken...',
+ 'StatusGetInfo' => 'Informatie ophalen...',
+ 'StatusGetImage' => 'Afbeelding ophalen...',
+
+ 'SaveError' => 'Kan de itemlijst niet opslaan. Controleer schijfruimte en schrijfrechten.',
+ 'OpenError' => 'Kan de itemlijst niet openen. Controleer leesrechten.',
+ 'OpenFormatError' => 'Kan de itemlijst niet openen. Formaat is misschien foutief.',
+ 'OpenVersionWarning' => 'Collectie was aangemaakt met een nieuwere versie van GCstar. Als je het toch opslaat kun je data verliezen.',
+ 'OpenVersionQuestion' => 'Wil je toch doorgaan?',
+ 'ImageError' => 'Gekozen map om afbeeldingen in op te slaan is niet juist. Kies een andere map.',
+ 'OptionsCreationError'=> 'Kan geen optiebestand maken: ',
+ 'OptionsOpenError'=> 'Kan optiebestand niet openen: ',
+ 'OptionsSaveError'=> 'Kan optiebestand niet opslaan: ',
+ 'ErrorModelNotFound' => 'Model niet gevonden: ',
+ 'ErrorModelUserDir' => 'Door gebruiker gedefinieerde modellen staan in: ',
+
+ 'RandomTooltip' => 'Wat te bekijken deze avond?',
+ 'RandomError'=> 'Je hebt geen selecteerbare items', # Accepts model codes
+ 'RandomEnd'=> 'Er zijn geen items meer', # Accepts model codes
+ 'RandomNextTip'=> 'Volgende suggestie',
+ 'RandomOkTip'=> 'Accepteer dit item',
+
+ 'AboutTitle' => 'Over GCstar',
+ 'AboutDesc' => 'Persoonlijke collectiebeheerder',
+ 'AboutVersion' => 'Versie',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian): projectbeheerder, programmeur
+Nyall Dawson (Zombiepig): programmeur
+TPF: programmeur
+Adolfo González: programmeur
+',
+ 'AboutLicense' => 'verspreid onder GNU GPL termen
+Logo Copyright le Spektre',
+ 'AboutTranslation' => 'Engelse vertaling door Kim',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo en webdesign door le Spektre',
+
+ 'UnsavedCollection' => 'Niet opgeslagen collectie',
+ 'ModelsSelect' => 'Kies een collectietype',
+ 'ModelsPersonal' => 'Persoonlijke modellen',
+ 'ModelsDefault' => 'Standaardmodellen',
+ 'ModelsList' => 'Collectiedefinitie',
+ 'ModelSettings' => 'Collectieinstellingen',
+ 'ModelNewType' => 'Nieuw collectietype',
+ 'ModelName' => 'Naam van het collectietype:',
+ 'ModelFields' => 'Velden',
+ 'ModelOptions' => 'Opties',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'Nieuw veld',
+ 'ModelFieldInformation' => 'Informatie',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Groep:',
+ 'ModelFieldValues' => 'Waarden',
+ 'ModelFieldInit' => 'Standaard:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Waardenlijst:',
+ 'ModelFieldListLegend' => '<i>door komma\'s gescheiden</i>',
+ 'ModelFieldDisplayAs' => 'Geef weer als:',
+ 'ModelFieldDisplayAsText' => 'Tekst',
+ 'ModelFieldDisplayAsGraphical' => 'Waarderingsbeheer',
+ 'ModelFieldTypeShortText' => 'Korte tekst',
+ 'ModelFieldTypeLongText' => 'Lange tekst',
+ 'ModelFieldTypeYesNo' => 'Ja/Nee',
+ 'ModelFieldTypeNumber' => 'Nummer',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Vooraf gedefinieerde waardenlijst',
+ 'ModelFieldTypeImage' => 'Afbeelding',
+ 'ModelFieldTypeSingleList' => 'Eenvoudige lijst',
+ 'ModelFieldTypeFile' => 'Bestand',
+ 'ModelFieldTypeFormatted' => 'Afhankelijk van andere velden',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Gebruik een geschiedenis',
+ 'ModelFieldFlat' => 'Toon op een lijn',
+ 'ModelFieldStep' => 'Incrementele stap:',
+ 'ModelFieldFileFormat' => 'Bestandsformaat:',
+ 'ModelFieldFileFile' => 'Eenvoudig bestand',
+ 'ModelFieldFileImage' => 'Afbeelding',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Geluid',
+ 'ModelFieldFileProgram' => 'Programma',
+ 'ModelFieldFileUrl' => 'Link',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Velden om te gebruiken',
+ 'ModelOptionsFieldsAuto' => 'Automatisch',
+ 'ModelOptionsFieldsNone' => 'Geen',
+ 'ModelOptionsFieldsTitle' => 'Zoals titel',
+ 'ModelOptionsFieldsId' => 'Zoals ID',
+ 'ModelOptionsFieldsCover' => 'Zoals cover',
+ 'ModelOptionsFieldsPlay' => 'Voor Playknop',
+ 'ModelCollectionSettings' => 'Collectie instellingen',
+ 'ModelCollectionSettingsLending' => 'Items kunnen geleend worden',
+ 'ModelCollectionSettingsTagging' => 'Items kunnen getagd worden',
+ 'ModelFilterActivated' => 'Zou in het zoekvak moeten zijn',
+ 'ModelFilterComparison' => 'Vergelijking',
+ 'ModelFilterContain' => 'Bevat',
+ 'ModelFilterDoesNotContain' => 'Bevat niet',
+ 'ModelFilterRegexp' => 'Reguliere expressie',
+ 'ModelFilterRange' => 'Bereik',
+ 'ModelFilterNumeric' => 'Vergelijking is numeriek',
+ 'ModelFilterQuick' => 'Maak een snelle filter',
+ 'ModelTooltipName' => 'Gebruik een naam om dit model voor vele collecties te herbruiken. Indien leeg, zullen de instellingen in het model zelf opgeslagen worden',
+ 'ModelTooltipLabel' => 'De veldnaam zoals het weergegeven zal worden',
+ 'ModelTooltipGroup' => 'Gebruikt om velden te groeperen. Items zonder waarde zitten in een standaardgroep',
+ 'ModelTooltipHistory' => 'Moeten de vorige ingevoerde waarden worden opgeslagen in een lijst geassocieerd aan het veld',
+ 'ModelTooltipFormat' => 'Dit formaat dient om de aktie van de playknop te bepalen',
+ 'ModelTooltipLending' => 'Dit voegt velden toe om uitleningen te beheren',
+ 'ModelTooltipTagging' => 'Dit voegt velden toe om tags te beheren',
+ 'ModelTooltipNumeric' => 'Moeten de waarden worden beschouwd als nummers om te vergelijken',
+ 'ModelTooltipQuick' => 'Dit voegt een submenu toe bij de filters',
+
+ 'ResultsTitle' => 'Kies een item', # Accepts model codes
+ 'ResultsNextTip' => 'Zoek in de volgende website',
+ 'ResultsPreview' => 'Voorvertoning',
+ 'ResultsInfo' => 'Je kan meerdere items toevoegen aan de collectie met Ctrl of Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Voorkeuren',
+ 'OptionsExpertMode' => 'Geavanceerde opties',
+ 'OptionsPrograms' => 'Kies de te gebruiken programma\'s voor verschillende media, laat leeg voor systeemstandaarden',
+ 'OptionsBrowser' => 'Webbrowser',
+ 'OptionsPlayer' => 'Videospeler',
+ 'OptionsAudio' => 'Geluidspeler',
+ 'OptionsImageEditor' => 'Afbeeldingsbewerker',
+ 'OptionsCdDevice' => 'CD-apparaat',
+ 'OptionsImages' => 'Afbeeldingenmap',
+ 'OptionsUseRelativePaths' => 'Gebruik relatieve paden voor afbeeldingen',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Toon statusbalk',
+ 'OptionsUseStars' => 'Gebruik sterren om beoordelingen te tonen',
+ 'OptionsWarning' => 'Waarschuwing: Veranderingen op dit tabblad hebben geen effect tot je GCstar herstart.',
+ 'OptionsRemoveConfirm' => 'Vraag bevestiging voordat een item verwijderd wordt',
+ 'OptionsAutoSave' => 'Automatisch collectie opslaan',
+ 'OptionsAutoLoad' => 'Laad vorige collectie bij programmastart',
+ 'OptionsSplash' => 'Toon splash beeld',
+ 'OptionsTearoffMenus' => 'Sta afneembare menu\'s toe',
+ 'OptionsSpellCheck' => 'Gebruik spellingscontrole in lange tekstvelden',
+ 'OptionsProgramTitle' => 'Kies het programma om te gebruiken',
+ 'OptionsPlugins' => 'Website om data van op te halen',
+ 'OptionsAskPlugins' => 'Vraag (vele websites)',
+ 'OptionsPluginsMulti' => 'Vele websites',
+ 'OptionsPluginsMultiAsk' => 'Vraag (vele websites)',
+ 'OptionsPluginsMultiPerField' => 'Vele websites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Stel lijst in',
+ 'OptionsAskImport' => 'Kies velden om te importeren',
+ 'OptionsProxy' => 'Gebruik een proxy',
+ 'OptionsCookieJar' => 'Gebruik dit cookie jar bestand',
+ 'OptionsLang' => 'Taal',
+ 'OptionsMain' => 'Hoofd',
+ 'OptionsPaths' => 'Paden',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Extra\'s',
+ 'OptionsDisplay' => 'Beeld',
+ 'OptionsToolbar' => 'Werkbalk',
+ 'OptionsToolbars' => {0 => 'Geen', 1 => 'Klein', 2 => 'Groot', 3 => 'Systeem instelling'},
+ 'OptionsToolbarPosition' => 'Positie',
+ 'OptionsToolbarPositions' => {0 => 'Bovenaan', 1 => 'Onderaan', 2 => 'Links', 3 => 'Rechts'},
+ 'OptionsExpandersMode' => 'Expanders te lang',
+ 'OptionsExpandersModes' => {'asis' => 'Doe niets', 'cut' => 'knip', 'wrap' => 'Regelafbraak'},
+ 'OptionsDateFormat' => 'Datum formaat',
+ 'OptionsDateFormatTooltip' => 'Formaat is gebruikt door strftime(3). Standaard is %d/%m/%Y',
+ 'OptionsView' => 'Items lijst',
+ 'OptionsViews' => {0 => 'Tekst', 1 => 'Afbeelding', 2 => 'Gedetailleerd'},
+ 'OptionsColumns' => 'Kolommen',
+ 'OptionsMailer' => 'E-mailer',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Jouw e-mail',
+ 'OptionsTransform' => 'Plaats lidwoorden op het einde van de titels',
+ 'OptionsArticles' => 'Lidwoorden (door komma\'s gescheiden)',
+ 'OptionsSearchStop' => 'Zoeken mag onderbroken worden',
+ 'OptionsBigPics' => 'Gebruik grote afbeeldingen indien beschikbaar',
+ 'OptionsAlwaysOriginal' => 'Gebruik hoofdtitel als de originele titel niet beschikbaar is',
+ 'OptionsRestoreAccelerators' => 'Herstel sneltoetsen toetsenbord ',
+ 'OptionsHistory' => 'Grootte van de geschiedenis',
+ 'OptionsClearHistory' => 'Verwijder geschiedenis',
+ 'OptionsStyle' => 'Uiterlijk',
+ 'OptionsDontAsk' => 'Niet opnieuw vragen',
+ 'OptionsPathProgramsGroup' => 'Toepassingen',
+ 'OptionsProgramsSystem' => 'Gebruik standaard systeemtoepassingen',
+ 'OptionsProgramsUser' => 'Gebruik programma\'s van je eigen keuze',
+ 'OptionsProgramsSet' => 'Kies programma\'s',
+ 'OptionsPathImagesGroup' => 'Afbeeldingen',
+ 'OptionsInternetDataGroup' => 'Data importeren',
+ 'OptionsInternetSettingsGroup' => 'Instellingen',
+ 'OptionsDisplayInformationGroup' => 'Informatievenster',
+ 'OptionsDisplayArticlesGroup' => 'Lidwoorden',
+ 'OptionsImagesDisplayGroup' => 'Beeld',
+ 'OptionsImagesStyleGroup' => 'Stijl',
+ 'OptionsDetailedPreferencesGroup' => 'Voorkeuren',
+ 'OptionsFeaturesConveniencesGroup' => 'Gemak',
+ 'OptionsPicturesFormat' => 'Voorvoegsel bij afbeeldingen:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titel of naam van het item',
+ 'OptionsPicturesWorkingDir' => '%werkmap% of . zal vervangen worden door collectiemap',
+ 'OptionsPicturesFileBase' => '%bestand_basis% zal vervangen worden door de collectiebestandsnaam zonder extensie (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%werkmap% kan alleen gebruikt worden aan het begin van het pad voor afbeeldingen',
+ 'OptionsConfigureMailers' => 'Stel e-mailprogramma\'s in',
+
+ 'ImagesOptionsButton' => 'Instellingen',
+ 'ImagesOptionsTitle' => 'Instellingen voor de afbeeldingenlijst',
+ 'ImagesOptionsSelectColor' => 'Kies een kleur',
+ 'ImagesOptionsUseOverlays' => 'Gebruik afbeelding overlay',
+ 'ImagesOptionsBg' => 'Achtergrond',
+ 'ImagesOptionsBgPicture' => 'Gebruik een achtergrondafbeelding',
+ 'ImagesOptionsFg'=> 'Selectie',
+ 'ImagesOptionsBgTooltip' => 'Verander achtergrondkleur',
+ 'ImagesOptionsFgTooltip'=> 'Verander selectiekleur',
+ 'ImagesOptionsResizeImgList' => 'Aantal kolommen automatisch veranderen',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Grootte',
+ 'ImagesOptionsSizeList' => {0 => 'Zeer klein', 1 => 'Klein', 2 => 'Gemiddeld', 3 => 'Groot', 4 => 'Zeer groot'},
+ 'ImagesOptionsSizeTooltip' => 'Kies afbeeldingsgrootte',
+
+ 'DetailedOptionsTitle' => 'Instellingen voor de gedetailleerde lijst',
+ 'DetailedOptionsImageSize' => 'afbeeldingsgrootte',
+ 'DetailedOptionsGroupItems' => 'Sorteer items op',
+ 'DetailedOptionsSecondarySort' => 'Sorteer onderliggende velden',
+ 'DetailedOptionsFields' => 'Kies de te tonen velden',
+ 'DetailedOptionsGroupedFirst' => 'Hou verweesde items samen',
+ 'DetailedOptionsAddCount' => 'Voeg aantal elementen aan categorieën toe',
+
+ 'ExtractButton' => 'Informatie',
+ 'ExtractTitle' => 'Bestandsinformatie',
+ 'ExtractImport' => 'Gebruik waarden',
+
+ 'FieldsListOpen' => 'Laad een veldlijst van een bestand',
+ 'FieldsListSave' => 'Bewaar veldlijst in een bestand',
+ 'FieldsListError' => 'Deze veldlijst kan niet gebruikt worden bij dit soort collectie',
+ 'FieldsListIgnore' => '--- Negeer',
+
+ 'ExportTitle' => 'Exporteer itemlijst',
+ 'ExportFilter' => 'Exporteer enkel getoonde items',
+ 'ExportFieldsTitle' => 'Velden om te exporteren',
+ 'ExportFieldsTip' => 'Kies velden om te exporteren',
+ 'ExportWithPictures' => 'Kopieer afbeeldingen in een onderliggende map',
+ 'ExportSortBy' => 'Sorteer op',
+ 'ExportOrder' => 'Volgorde',
+
+ 'ImportListTitle' => 'Importeer een andere itemlijst',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Bestand',
+ 'ImportExportFieldsUnused' => 'Ongebruikte velden',
+ 'ImportExportFieldsUsed' => 'Gebruikte velden',
+ 'ImportExportFieldsFill' => 'Alles toevoegen',
+ 'ImportExportFieldsClear' => 'Alles verwijderen',
+ 'ImportExportFieldsEmpty' => 'Je moet minstens één veld kiezen',
+ 'ImportExportFileEmpty' => 'Je moet een bestandsnaam specifiëren',
+ 'ImportFieldsTitle' => 'Velden om te importeren',
+ 'ImportFieldsTip' => 'Kies velden om te importeren',
+ 'ImportNewList' => 'Maak een nieuwe collectie',
+ 'ImportCurrentList' => 'Voeg aan huidige collectie toe',
+ 'ImportDropError' => 'Er was een fout tijdens het openen van minstens één bestand. De vorige lijst wordt herladen.',
+ 'ImportGenerateId' => 'Genereer identificatie voor ieder item',
+
+ 'FileChooserOpenFile' => 'Kies een bestand om te gebruiken',
+ 'FileChooserDirectory' => 'Map',
+ 'FileChooserOpenDirectory' => 'Kies een map',
+ 'FileChooserOverwrite' => 'Dit bestand bestaat al. Wil je het overschrijven?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Enkel lezen',
+ 'PanelForm' => 'Tabbladen',
+
+ 'PanelSearchButton' => 'Haal informatie op',
+ 'PanelSearchTip' => 'Zoek informatie op het internet',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Klik op de afbeelding om een andere te kiezen.',
+ 'PanelImageTipView' => 'Klik op de afbeelding om op ware grootte weer te geven.',
+ 'PanelImageTipMenu' => ' Rechts klikken voor meer opties.',
+ 'PanelImageTitle' => 'Kies een afbeelding',
+ 'PanelImageNoImage' => 'Geen afbeelding',
+ 'PanelSelectFileTitle' => 'Kies een bestand',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Herstel standaard',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Van',
+ 'PanelTo' =>'Naar',
+
+ 'PanelWeb' => 'Bekijk informatie',
+ 'PanelWebTip' => 'Bekijk informatie op het internet voor dit item', # Accepts model codes
+ 'PanelRemoveTip' => 'Verwijder huidig item', # Accepts model codes
+
+ 'PanelDateSelect' => 'Kies',
+ 'PanelNobody' => 'Niemand',
+ 'PanelUnknown' => 'Onbekend',
+ 'PanelAdded' => 'Toegevoegd op',
+ 'PanelRating' => 'Waardering',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Locatie',
+
+ 'PanelLending' => 'Uitgeleend',
+ 'PanelBorrower' => 'Lener',
+ 'PanelLendDate' => 'Uitgeleend sinds',
+ 'PanelHistory' => 'Uitleengeschiedenis',
+ 'PanelReturned' => 'Item teruggebracht', # Accepts model codes
+ 'PanelReturnDate' => 'Datum teruggave',
+ 'PanelLendedYes' => 'Ooit uitgeleend',
+ 'PanelLendedNo' => 'Beschikbaar',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favorieten',
+ 'TagsAssigned' => 'Toegewezen tags',
+
+ 'PanelUser' => 'Gebruikersvelden',
+
+ 'CheckUndef' => 'Of',
+ 'CheckYes' => 'Ja',
+ 'CheckNo' => 'Nee',
+
+ 'ToolbarRandom' => 'Vannacht',
+ 'ToolbarAll' => 'Toon alles',
+ 'ToolbarAllTooltip' => 'Toon alle items',
+ 'ToolbarGroupBy' => 'Groepeer op',
+ 'ToolbarGroupByTooltip' => 'Kies het veld waarmee items gegroepeerd moeten worden',
+ 'ToolbarQuickSearch' => 'Snel zoeken',
+ 'ToolbarQuickSearchLabel' => 'Zoeken',
+ 'ToolbarQuickSearchTooltip' => 'Kies het veld om in te zoeken. Voer zoektermen in en druk op enter',
+ 'ToolbarSeparator' => ' Scheidingsteken',
+
+ 'PluginsTitle' => 'Zoek een item',
+ 'PluginsQuery' => 'Vraag',
+ 'PluginsFrame' => 'Zoek website',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Naam',
+ 'PluginsSearchFields' => 'Zoek velden',
+ 'PluginsAuthor' => 'Auteur',
+ 'PluginsLang' => 'Taal',
+ 'PluginsUseSite' => 'Gebruik geselecteerde website voor verdere zoekacties',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Lenersconfiguratie',
+ 'BorrowersList' => 'Leners',
+ 'BorrowersName' => 'Naam',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Voeg toe',
+ 'BorrowersRemove' => 'Verwijder',
+ 'BorrowersEdit' => 'Bewerk',
+ 'BorrowersTemplate' => 'Mail sjabloon',
+ 'BorrowersSubject' => 'Mail onderwerp',
+ 'BorrowersNotice1' => '%1 zal vervangen worden door de naam van de lener',
+ 'BorrowersNotice2' => '%2 zal vervangen worden door de titel van het item',
+ 'BorrowersNotice3' => '%3 zal vervangen worden door de uitleendatum',
+
+ 'BorrowersImportTitle' => 'Importeer lenersinformatie',
+ 'BorrowersImportType' => 'Bestandsformaat:',
+ 'BorrowersImportFile' => 'Bestand:',
+
+ 'BorrowedTitle' => 'Uitgeleende items', # Accepts model codes
+ 'BorrowedDate' => 'Sinds',
+ 'BorrowedDisplayInPanel' => 'Toon item in hoofdvenster', # Accepts model codes
+
+ 'MailTitle' => 'Stuur een e-mail',
+ 'MailFrom' => 'Van: ',
+ 'MailTo' => 'Naar: ',
+ 'MailSubject' => 'Onderwerp: ',
+ 'MailSmtpError' => 'Probleem bij verbinding met SMTP-server',
+ 'MailSendmailError' => 'Probleem wanneer sendmail gestart wordt',
+
+ 'SearchTooltip' => 'Zoek alle items', # Accepts model codes
+ 'SearchTitle' => 'Zoek item', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Velden om te vervangen',
+ 'QueryReplaceOld' => 'Huidige waarde',
+ 'QueryReplaceNew' => 'Nieuwe waarde',
+ 'QueryReplaceLaunch' => 'Vervang',
+
+ 'ImportWindowTitle' => 'Kies velden om te importeren',
+ 'ImportViewPicture' => 'Bekijk afbeelding',
+ 'ImportSelectAll' => 'Kies alles',
+ 'ImportSelectNone' => 'Kies niets',
+
+ 'MultiSiteTitle' => 'Websites om te gebruiken voor zoekopdrachten',
+ 'MultiSiteUnused' => 'Niet gebruikte plug-ins',
+ 'MultiSiteUsed' => 'Gebruikte plug-ins',
+ 'MultiSiteLang' => 'Vul lijst met Engelse plug-ins',
+ 'MultiSiteEmptyError' => 'Je hebt een lege websitelijst',
+ 'MultiSiteClear' => 'Wis lijst',
+
+ 'DisplayOptionsTitle' => 'Items om te tonen',
+ 'DisplayOptionsAll' => 'Kies alles',
+ 'DisplayOptionsSearch' => 'Zoek knop',
+
+ 'GenresTitle' => 'Genreconversie',
+ 'GenresCategoryName' => 'Genre om te gebruiken',
+ 'GenresCategoryMembers' => 'Genre om te vervangen',
+ 'GenresLoad' => 'Laad een lijst',
+ 'GenresExport' => 'Bewaar lijst in een bestand',
+ 'GenresModify' => 'Bewerk conversie',
+
+ 'PropertiesName' => 'Collectienaam',
+ 'PropertiesLang' => 'Taalcode',
+ 'PropertiesOwner' => 'Eigenaar',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Beschrijving',
+ 'PropertiesFile' => 'Bestandsinformatie',
+ 'PropertiesFilePath' => 'Volledig pad',
+ 'PropertiesItemsNumber' => 'Aantal items', # Accepts model codes
+ 'PropertiesFileSize' => 'Grootte',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collectie eigenschappen',
+ 'PropertiesDefaultPicture' => 'Standaardafbeelding',
+
+ 'MailProgramsTitle' => 'Programma\'s om mail te versturen',
+ 'MailProgramsName' => 'Naam',
+ 'MailProgramsCommand' => 'Commandlijn',
+ 'MailProgramsRestore' => 'Herstel standaarden',
+ 'MailProgramsAdd' => 'Voeg een programma toe',
+ 'MailProgramsInstructions' => 'In command lijn, een aantal substituties worden gemaakt:
+ %f is vervangen door e-mailadres van de gebruiker.
+ %t is vervangen door adres van de ontvanger.
+ %s is vervangen door het onderwerp van het bericht.
+ %b is vervangen door de inhoud van het bericht.',
+
+ 'BookmarksBookmarks' => 'Bladwijzers',
+ 'BookmarksFolder' => 'Mappen',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Doel',
+ 'BookmarksNewFolder' => 'Nieuwe map',
+
+ 'AdvancedSearchType' => 'Zoektype',
+ 'AdvancedSearchTypeAnd' => 'Items komen met alle criteria overeen', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items komen met minstens één criterium overeen', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Elk veld',
+ 'AdvancedSearchSaveTitle' => 'Bewaar zoekopdracht',
+ 'AdvancedSearchSaveName' => 'Naam',
+ 'AdvancedSearchSaveOverwrite' => 'Er bestaat al een opgeslagen zoekopdracht met deze naam. Gebruik een andere naam.',
+ 'AdvancedSearchUseCase' => 'Hoofdlettergevoelig',
+ 'AdvancedSearchIgnoreDiacritics' => 'Negeer accenten en andere diacritische tekens',
+
+ 'BugReportSubject' => 'Foutenrapport gegenereerd door GCstar',
+ 'BugReportVersion' => 'Versie',
+ 'BugReportPlatform' => 'Besturingssysteem',
+ 'BugReportMessage' => 'Fout bericht',
+ 'BugReportInformation' => 'Extra informatie',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..f431bc8
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PL::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Dodaj nazwy pól na górze',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'ZastÄ…p separator znakiem',
+ 'Charset' => 'Kodowanie znaków',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..4696453
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PL::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..28ba198
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::PL::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Niepoprawny plik szablonu',
+ 'UseFile' => 'Skorzystaj z poniższego pliku',
+ 'TemplateExternalFile' => 'Plik szablonu',
+ 'WithJS' => 'Używaj Javascript',
+ 'FileTemplate' => 'Plik tymczasowy:',
+ 'Preview' => 'PodglÄ…d',
+ 'NoPreview' => 'Podgląd niedostępny',
+ 'Title' => 'Tytuł strony',
+ 'InfoFile' => 'Lista pozycji jest w pliku: ',
+ 'InfoDir' => 'Obrazy sÄ… w : ',
+ 'HeightImg' => 'Wysokość (w pikselach) obrazu do eksportu: ',
+ 'OpenFileInBrowser' => 'Otwórz wygenerowany plik w przeglądarce',
+ 'Note' => 'Lista wygenerowana przez program <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Wpisz szukany ciąg znaków',
+ 'SearchType1' => 'Tylko tytuł',
+ 'SearchType2' => 'Pełna informacja',
+ 'SearchButton' => 'Szukaj',
+ 'SearchTitle' => 'Wyświetlaj tylko filmy pasujące do kryterium szukania',
+ 'AllButton' => 'Wszystkie',
+ 'AllTitle' => 'Pokaż wszystkie',
+ 'Expand' => 'Rozwiń wszystkie',
+ 'ExpandTitle' => 'Wyświetl informacje o wszystkich filmach',
+ 'Collapse' => 'Ukryj wszystkie',
+ 'CollapseTitle' => 'Ukryj informacje o wszystkich filmach',
+ 'Borrowed' => 'Pożyczone przez: ',
+ 'NotBorrowed' => 'Dostępne',
+ 'Top' => 'Góra',
+ 'Bottom' => 'U dołu',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b0566e5
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PL::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..c7eb4c3
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PL::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Zawiera DROP instrukcje',
+ 'WithCreate' => 'Zawiera CREATE instrukcje',
+ 'TableName' => 'Nazwa tabeli',
+ 'InfoFile' => 'Plik SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..4ee538d
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PL::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Archiwum jest w pliku: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..85c887d
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::PL::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Plik tymczasowy',
+ 'ModelText' => 'Tekst tymczasowy',
+ 'Models' => 'Tymczasowy do użytku',
+ 'UseFile' => 'Używaj pliku',
+ 'UseModel' => 'Używaj obszaru tekstowego',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..9057666
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::PL::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Gdzie szukać',
+ 'Default' => 'Domyślny katalog Alexandrii',
+ 'Specified' => 'Katalog podany poniżej',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..1c889d6
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PL::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Kodowanie znaków',
+ 'Header' => 'Ignoruj pierwszÄ… linie',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Strona używana',
+ 'UseFirst' => 'Wybierz pierwszy, jeżeli dużo wyników',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..d7afa75
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::PL::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Katalog',
+ 'Recursive' => 'PrzeglÄ…daj podkatalogi',
+ 'Suffixes' => 'Sufiksy lub rozszerzenia nazw plików',
+ 'SuffixesTooltip' => 'Lista sufiksów lub rozszerzeń nzaw plików rozdzielonych przecinkami',
+ 'Remove' => 'Do usunięcia z nazw',
+ 'RemoveTooltip' => 'Lista słów rozdzielonych przecinkami, które mają być usunięte z nazw plików w trakcie pobierania',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Usuń tylko całe słowa',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Słowa będą usuwane tylko jeśli wystąpią w całości',
+ 'RemoveRegularExpr' => 'Wyrażenie regularne',
+ 'RemoveTooltipRegularExpr' => 'Pamiętaj, że \'Do usunięcia z nazw\' jest wyrażeniem regularnym Perla',
+ 'SkipFileAlreadyInCollection' => 'Dodaj tylko nowe pliki',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Dodaje tylko te pliki, których jeszcze nie ma w Zbiorze',
+ 'SkipFileNo' => 'Nie',
+ 'SkipFileFullPath' => 'na podstawie pełnej ścieżki',
+ 'SkipFileFileName' => 'na podstawie nazwy pliku',
+ 'SkipFileFileNameAndUpdate' => 'na podstawie nazwy pliku (ale zmienia ścieżkę w Zbiorze)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..89d5767
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PL::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopiuj obrazy',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportList.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportList.pm
new file mode 100644
index 0000000..9302174
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PL::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista tytułów',
+ 'Plugin' => 'Strona używana',
+ 'UseFirst' => 'Wybierz pierwszy, jeżeli dużo wyników',
+ 'CommentAuto' => 'Import automatyczny',
+ 'CommentSite' => 'Strona: ',
+ 'CommentTitle' => 'Tytuł: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..3f79709
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::PL::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..1ed22b0
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PL::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Plik nie jest plikiem kolekcji Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..e6dd5cd
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCTVepisodes.pm
@@ -0,0 +1,51 @@
+{
+ package GCLang::PL::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zbiór nagrań TV (odcinki)',
+ Items => sub {
+ my $number = shift;
+ return 'Odcinek' if $number eq '1';
+ return 'Odcinki' if $number =~ /(?<!1)[2-4]$/;
+ return 'Odcinków';
+ },
+ NewItem => 'Nowy odcinek',
+ NewSeries => 'Nowy serial',
+ Episode => 'Odcinek',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..1679abb
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCTVseries.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::PL::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zbiór nagrań TV (seriale)',
+ Items => sub {
+ my $number = shift;
+ return 'Serial' if $number eq '1';
+ return 'Seriale' if $number =~ /(?<!1)[2-4]$/;
+ return 'Seriali';
+ },
+ NewItem => 'Nowy serial',
+ Name => 'Tytuł',
+ Season => 'Sezon',
+ Part => 'Część',
+ Episodes => 'Odcinki',
+ FirstAired => 'Premiera',
+ Time => 'Długość odcinka',
+ Producer => 'Producent',
+ Music => 'Muzyka',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..0bf0342
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCboardgames.pm
@@ -0,0 +1,89 @@
+{
+ package GCLang::PL::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar, WG
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja gier planszowych',
+ Items => sub {
+ my $number = shift;
+ return 'Gra' if $number eq '1';
+ return 'Gry' if $number =~ /(?<!1)[2-4]$/;
+ return 'Gier';
+ },
+ NewItem => 'Nowa gra',
+
+ Id => 'Id',
+ Name => 'Nazwa',
+ Original => 'Nazwa oryginału',
+ Box => 'Zdjęcie pudełka',
+ DesignedBy => 'Autor',
+ PublishedBy => 'Wydawca',
+ Players => 'Ilość graczy',
+ PlayingTime => 'Czas gry',
+ SuggestedAge => 'Zalecany wiek graczy',
+ Released => 'Data wydania',
+ Description => 'Opis',
+ Category => 'Kategoria',
+ Mechanics => 'Mechanika gry',
+ ExpandedBy => 'Dodatki',
+ ExpansionFor => 'Dodatek do',
+ GameFamily => 'Rodzina gier',
+ IllustratedBy => 'Opracowanie graficzne',
+ Url => 'Strona internetowa',
+ TimesPlayed => 'Czas spędzony na grze',
+ CompleteContents => 'Kompletna',
+ Copies => 'Ilość egzemplarzy',
+ Condition => 'Stan',
+ Photos => 'Zdjęcia',
+ Photo1 => 'Zdjęcie pierwsze',
+ Photo2 => 'Zdjęcie drugie',
+ Photo3 => 'Zdjęcie trzecie',
+ Photo4 => 'Zdjęcie czwarte',
+ Comments => 'Opinie',
+
+ Perfect => 'Doskonały',
+ Good => 'Dobry',
+ Average => 'Znośny',
+ Poor => 'ZÅ‚y',
+
+ CompleteYes => 'Zawartość kompletna',
+ CompleteNo => 'Brakuje elementów',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Personal => 'Osobiste',
+ Information => 'Informacje',
+
+ FilterRatingSelect => 'Ocena co najmniej...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCbooks.pm b/lib/gcstar/GCLang/PL/GCModels/GCbooks.pm
new file mode 100644
index 0000000..a2a222b
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCbooks.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::PL::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Księgozbiór',
+ Items => sub {
+ my $number = shift;
+ return 'Książka' if $number eq '1';
+ return 'Książki' if $number =~ /(?<!1)[2-4]$/;
+ return 'Książek';
+ },
+ NewItem => 'Nowa książka',
+
+ Isbn => 'ISBN',
+ Title => 'Tytuł',
+ Cover => 'Okładka',
+ Authors => 'Autor',
+ Publisher => 'Wydawca',
+ Publication => 'Data wydania',
+ Language => 'Język',
+ Genre => 'Gatunek',
+ Serie => 'Seria',
+ Rank => 'Ranga',
+ Bookdescription => 'Opis',
+ Pages => 'Stron',
+ Read => 'Przeczytana',
+ Acquisition => 'Data pozyskania',
+ Edition => 'Wydanie',
+ Format => 'Oprawa',
+ Comments => 'Komentarze',
+ Url => 'Strona internetowa',
+ Translator => 'TÅ‚umaczenie',
+ Artist => 'Ilustrator',
+ DigitalFile => 'Digital version',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+
+ ReadNo => 'Nieczytana',
+ ReadYes => 'Czytana',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCcoins.pm b/lib/gcstar/GCLang/PL/GCModels/GCcoins.pm
new file mode 100644
index 0000000..8f7a14e
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCcoins.pm
@@ -0,0 +1,107 @@
+{
+ package GCLang::PL::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja numizmatyczna',
+ Items => sub {
+ my $number = shift;
+ return 'Numizmat' if $number eq '1';
+ return 'Numizmaty' if $number =~ /(?<!1)[2-4]$/;
+ return 'Numizmatów';
+ },
+ NewItem => 'Nowy numizmat',
+
+ Name => 'Nazwa',
+ Country => 'Kraj',
+ Year => 'Rok',
+ Currency => 'Waluta',
+ Value => 'Nominał',
+ Picture => 'Zdjęcie',
+ Diameter => 'Åšrednica',
+ Metal => 'Metal',
+ Edge => 'Krawędź',
+ Edge1 => 'Krawędź 1',
+ Edge2 => 'Krawędź 2',
+ Edge3 => 'Krawędź 3',
+ Edge4 => 'Krawędź 4',
+ Head => 'Awers',
+ Tail => 'Rewers',
+ Comments => 'Komentarze',
+ History => 'Historia',
+ Website => 'Strona internetowa',
+ Estimate => 'Wycena',
+ References => 'Rekomendacje',
+ Type => 'Typ',
+ Coin => 'Moneta',
+ Banknote => 'Banknot',
+
+ Main => 'Główne',
+ Description => 'Opis',
+ Other => 'Inne informacje',
+ Pictures => 'Zdjęcia',
+
+ Condition => 'Stan (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCcomics.pm b/lib/gcstar/GCLang/PL/GCModels/GCcomics.pm
new file mode 100644
index 0000000..20cfb0f
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::PL::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCfilms.pm b/lib/gcstar/GCLang/PL/GCModels/GCfilms.pm
new file mode 100644
index 0000000..19b0a42
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCfilms.pm
@@ -0,0 +1,96 @@
+{
+ package GCLang::PL::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmoteka',
+ Items => sub {
+ my $number = shift;
+ return 'Film' if $number eq '1';
+ return 'Filmy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Filmów';
+ },
+ NewItem => 'Nowy film',
+
+
+ Id => 'Id',
+ Title => 'Tytuł',
+ Date => 'Data',
+ Time => 'Czas trwania',
+ Director => 'Reżyser',
+ Country => 'Kraj',
+ MinimumAge => 'Minimalny wiek',
+ Genre => 'Gatunek',
+ Image => 'Obraz',
+ Original => 'Oryginalny tytuł',
+ Actors => 'Obsada',
+ Actor => 'Aktor',
+ Role => 'Rola',
+ Comment => 'Komentarz',
+ Synopsis => 'Opis',
+ Seen => 'OglÄ…dany',
+ Number => 'PÅ‚yt',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identyfikator',
+ Url => 'Strona internetowa',
+ Audio => 'Dźwięk',
+ Video => 'Format obrazu',
+ Trailer => 'Plik wideo',
+ Serie => 'Kolekcja',
+ Rank => 'Ranga',
+ Subtitles => 'Napisy',
+
+ SeenYes => 'PrzeglÄ…dane',
+ SeenNo => 'Nie przeglÄ…dane',
+
+ AgeUnrated => 'Bez ograniczeń wiekowych',
+ AgeAll => 'Bez ograniczeń',
+ AgeParent => 'Ochrona rodzicielska',
+
+ Main => 'Główne pozycje',
+ General => 'Główny',
+ Details => 'Szczegóły',
+
+ Information => 'Informacja',
+ Languages => 'Języki',
+ Encoding => 'Dekodowanie',
+
+ FilterAudienceAge => 'Widownia',
+ FilterSeenNo => 'Nie oglÄ…dane',
+ FilterSeenYes => 'OglÄ…dane',
+ FilterRatingSelect => 'Notowanie Większe od...',
+
+ ExtractSize => 'Rozmiar',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCgames.pm b/lib/gcstar/GCLang/PL/GCModels/GCgames.pm
new file mode 100644
index 0000000..91e5b6d
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCgames.pm
@@ -0,0 +1,85 @@
+{
+ package GCLang::PL::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja gier',
+ Items => sub {
+ my $number = shift;
+ return 'Gra' if $number eq '1';
+ return 'Gry' if $number =~ /(?<!1)[2-4]$/;
+ return 'Gier';
+ },
+ NewItem => 'Nowa gra',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nazwa',
+ Platform => 'Platforma',
+ Players => 'Ilość graczy',
+ Released => 'Data wydania',
+ Editor => 'Wydawca',
+ Developer => 'Twórca',
+ Genre => 'Gatunek',
+ Box => 'Zdjęcie pudełka',
+ Case => 'Opakowanie',
+ Manual => 'Podręcznik',
+ Completion => 'Zaawansowanie (%)',
+ Executable => 'Executable',
+ Description => 'Opis',
+ Codes => 'Kody',
+ Code => 'Kod',
+ Effect => 'Efekt',
+ Secrets => 'Podpowiedzi',
+ Screenshots => 'Galeria',
+ Screenshot1 => 'Pierwsza zrzutka',
+ Screenshot2 => 'Druga zrzutka',
+ Comments => 'Opinie',
+ Url => 'Strona internetowa',
+ Unlockables => 'Da się odblokować...',
+ Unlockable => 'Do odblokowania',
+ Howto => 'Jak to zrobić',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Tips => 'Tipsy',
+ Information => 'Informacje',
+
+ FilterRatingSelect => 'Ocena co najmniej...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..877718b
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PL::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCminicars.pm b/lib/gcstar/GCLang/PL/GCModels/GCminicars.pm
new file mode 100644
index 0000000..ace475f
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::PL::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCmusics.pm b/lib/gcstar/GCLang/PL/GCModels/GCmusics.pm
new file mode 100644
index 0000000..5417c62
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCmusics.pm
@@ -0,0 +1,72 @@
+{
+ package GCLang::PL::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Fonoteka',
+ Items => sub {
+ my $number = shift;
+ return 'Album' if $number eq '1';
+ return 'Albumy' if $number =~ /(?<!1)[2-4]$/;
+ return 'Albumów';
+ },
+
+ NewItem => 'Nowy album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Tytuł',
+ Cover => 'Okładka',
+ Artist => 'Wykonawca',
+ Format => 'Format',
+ Running => 'ÅÄ…czny czas',
+ Release => 'Data wydania',
+ Genre => 'Gatunek',
+ Origin => 'Źródło',
+
+#For tracks list
+ Tracks => 'Lista utworów',
+ Number => 'Ścieżka',
+ Track => 'Tytuł',
+ Time => 'Czas trwania',
+
+ Composer => 'Kompozytor',
+ Producer => 'Producent',
+ Playlist => 'Lista odtwarzania',
+ Comments => 'Opinie',
+ Label => 'Label',
+ Url => 'Strona internetowa',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..16df556
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::PL::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Zbiór czasopism',
+ Items => sub {
+ my $number = shift;
+ return 'Czasopismo' if $number eq '1';
+ return 'Czasopisma' if $number =~ /(?<!1)[2-4]$/;
+ return 'Czasopism';
+ },
+ NewItem => 'Nowe czasopismo',
+
+ Title => 'Tytuł',
+ Cover => 'Okładka',
+ Periodical => 'Periodyczność',
+ Number => 'Numer',
+ Date => 'Data',
+ Subject => 'Temat',
+ Articles => 'Artykuły',
+
+ General => 'Ogólne',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..bfac91e
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::PL::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..a595af9
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCsoftware.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::PL::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja oprogramowania',
+ Items => sub {
+ my $number = shift;
+ return 'Aplikacja' if $number eq '1';
+ return 'Aplikacje' if $number =~ /(?<!1)[2-4]$/;
+ return 'Aplikacji';
+ },
+ NewItem => 'Nowa aplikacja',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nazwa',
+ Platform => 'Platforma',
+ Released => 'Data wydania',
+ Homepage => 'Strona domowa',
+ Editor => 'Wydawca',
+ Developer => 'Autor',
+ Category => 'Rodzaj',
+ Box => 'Zdjęcie pudełka',
+ NumberOfCopies => 'Liczba kopii',
+ Price => 'Cena',
+ Case => 'Opakowanie',
+ Manual => 'Podręcznik',
+ Executable => 'Plik wykonywalny',
+ Description => 'Opis',
+ License => 'Typ licencji',
+ Commercial => 'Komercyjna',
+ FreewareNoncommercial => 'Freeware (do użytku niekomercyjnego)',
+ OtherOpenSource => 'Inna Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Inna',
+ Registration => 'Rejestracja',
+ RegistrationInfo => 'Dane rejestracyjne',
+ RegInfo => 'Dane rejestracyjne',
+ RegistrationName => 'Nazwa użytkownika',
+ RegistrationNumber => 'Numer rejestracyjny',
+ RegistrationComments => 'Dodatkowe informacje/komentarz',
+ PanelRegistration => 'Dane rejestracyjne',
+ Screenshots => 'Galeria',
+ Screenshot1 => 'Pierwszy zrzut',
+ Screenshot2 => 'Drugi zrzut',
+ Comments => 'Opinie',
+ Url => 'Strona internetowa',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Information => 'Informacje',
+
+ FilterRatingSelect => 'Ocena co najmniej...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCstamps.pm b/lib/gcstar/GCLang/PL/GCModels/GCstamps.pm
new file mode 100644
index 0000000..4abc6f6
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::PL::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCModels/GCwines.pm b/lib/gcstar/GCLang/PL/GCModels/GCwines.pm
new file mode 100644
index 0000000..90e756c
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCModels/GCwines.pm
@@ -0,0 +1,87 @@
+{
+ package GCLang::PL::GCModels::GCwines;
+
+ use utf8;
+###################################################
+#
+# Copyright 2007 Yves Martin, WG
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Kolekcja win',
+ Items => sub {
+ my $number = shift;
+ return 'Wino' if $number eq '1';
+ return 'Wina' if $number =~ /(?<!1)[2-4]$/;
+ return 'Win';
+ },
+ NewItem => 'Nowe wino',
+
+ Name => 'Nazwa',
+ Designation => 'Apelacja',
+ Vintage => 'Rocznik',
+ Vineyard => 'Winnica',
+ Type => 'Typ',
+ Grapes => 'Grona',
+ Soil => 'Gleba',
+ Producer => 'Producent',
+ Country => 'Kraj',
+ Volume => 'Pojemność (ml)',
+ Alcohol => 'Alkohol (%)',
+ Medal => 'Medale/Wyróżnienia',
+
+ Storage => 'Przechowywanie',
+ Location => 'Miejsce',
+ ShelfIndex => 'Identyfikator',
+ Quantity => 'Ilość',
+ Acquisition => 'Pozyskanie',
+ PurchaseDate => 'Data zakupu',
+ PurchasePrice => 'Cena zakupu',
+ Gift => 'Prezent',
+ BottleLabel => 'Etykieta',
+ Website => 'Strona internetowa',
+
+ Tasted => 'Degustowane',
+ Comments => 'Opinie',
+ Serving => 'Podawanie',
+ TastingField => 'Opis smakowy',
+
+ General => 'Ogólne',
+ Details => 'Szczegóły',
+ Tasting => 'Degustacja',
+
+ TastedNo => 'Nie degustowane',
+ TastedYes => 'Degustowane',
+
+ FilterRange => 'Wybór',
+ FilterTastedNo => 'Jeszcze nie degustowane',
+ FilterTastedYes => 'Już degustowane',
+ FilterRatingSelect => 'Ocena co najmniej...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PL/GCstar.pm b/lib/gcstar/GCLang/PL/GCstar.pm
new file mode 100644
index 0000000..84782b8
--- /dev/null
+++ b/lib/gcstar/GCLang/PL/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::PL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Polski',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Ostrzeżenie</b>:
+
+Informacje pobrane z internetu (za pomocÄ… wtyczki
+do wyszukiwania) są <b>tylko do użytku prywatnego</b>.
+
+Jakakolwiek dystrybucja pobranych danych bez
+autoryzacji, <b>zabroniona</b>.
+
+Aby dowiedzieć się skąd pochodzą dane pobrane
+można użyć <b>przycisku pod szczegółami</b>.',
+
+ 'AllItemsFiltered' => 'Brak pozycji pasujÄ…cych do filtru', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalacja w ',
+ 'InstallMandatory' => 'Pakiety wymagane',
+ 'InstallOptional' => 'Pakiety opcjonalne',
+ 'InstallErrorMissing' => 'Błąd : Następujące pakiety Perl, są wymagane: ',
+ 'InstallPrompt' => 'Katalog główny dla instalacji [/usr/local]: ',
+ 'InstallEnd' => 'Koniec instalacji',
+ 'InstallNoError' => 'Brak błędu',
+ 'InstallLaunch' => 'Może być uruchomiona tylko jedna kopia',
+ 'InstallDirectory' => 'Katalog główny',
+ 'InstallTitle' => 'Instalacja GCstar',
+ 'InstallDependencies' => 'Elementy',
+ 'InstallPath' => 'Ścieżka',
+ 'InstallOptions' => 'Opcje',
+ 'InstallSelectDirectory' => 'Wybierz katalog główny dla programu',
+ 'InstallWithClean' => 'Usuń pliku w katalogu instalacyjnym',
+ 'InstallWithMenu' => 'Dodaj GCstar do Menu aplikacji',
+ 'InstallNoPermission' => 'Błąd: Nie masz uprawnień do zapisywania w wybranym katalogu',
+ 'InstallMissingMandatory' => 'Brakuje wymaganych elementów. Nie będziesz w stanie zainstalować GCstar dopóki ich nie zainstalujesz.',
+ 'InstallMissingOptional' => 'Brakuje elementów opcjonalnych. Lista znajduje sie poniżej. Niektóre funkcje GCstar mogą nie działać, lub działać niepoprawnie.',
+ 'InstallMissingNone' => 'Możesz kontynuować instalację GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Brak',
+ 'InstallMissingFor' => 'Brak',
+ 'InstallCleanDirectory' => 'Usuwanie plików GCstar z katalogu: ',
+ 'InstallCopyDirectory' => 'Kopiowanie plików w katalogu: ',
+ 'InstallCopyDesktop' => 'Kopiowanie plików pulpitu w: ',
+
+#Update
+ 'UpdateUseProxy' => 'Wybierz serwer proxy (naciśnij Enter aby pominąć): ',
+ 'UpdateNoPermission' => 'Nie masz uprawnień do zapisu w tym katalogu: ',
+ 'UpdateNone' => 'Nie znaleziono aktualizacji',
+ 'UpdateFileNotFound' => 'Nie znaleziono pliku',
+
+#Splash
+ 'SplashInit' => 'Uruchamianie',
+ 'SplashLoad' => 'Åadowanie Zbioru',
+ 'SplashDisplay' => 'Wyświetlanie Zbioru',
+ 'SplashSort' => 'Sortowanie Zbioru',
+ 'SplashDone' => 'Gotowe',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Wydaje się, że poprzednio używałeś GCfilms. Co chciałbyś wczytać z GCfilms do GCstar (nie będzie miało to znaczenia dla GCfilms jeśli nadal zechcesz go używać)?',
+ 'GCfilmsImportOptions' => 'Ustawienia',
+ 'GCfilmsImportData' => 'Lista filmów',
+
+#Menus
+ 'MenuFile' => 'Plik',
+ 'MenuNewList' => 'Nowy Zbiór',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Ostatnio używany Zbiór',
+ 'MenuLend' => 'Wyświetl wypożyczone', # Accepts model codes
+ 'MenuImport' => 'Import',
+ 'MenuExport' => 'Eksport',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => 'Edycja',
+ 'MenuDuplicate' => 'Kopiuj bieżącą pozycję',, # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All {X}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Usuń bieżącą pozycję',, # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => 'Zmień pola Zbioru',
+ 'MenuEditLockItems' => 'Zablokuj Zbiory',
+
+ 'MenuDisplay' => 'Filtr',
+ 'MenuSavedSearches' => 'Zapisane wyszukiwania',
+ 'MenuSavedSearchesSave' => 'Zapisz bieżące wyszukiwanie',
+ 'MenuSavedSearchesEdit' => 'Edytuj zapisane wyszukiwania',
+ 'MenuAdvancedSearch' => 'Wyszukiwanie zaawansowane',
+ 'MenuViewAllItems' => 'Pokaż wszystkie pozycje', # Accepts model codes
+ 'MenuNoFilter' => 'Wszystkie',
+
+ 'MenuConfiguration' => 'Ustawienia',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => 'Wyświetlane informacje',
+ 'MenuBorrowers' => 'Dłużnicy',
+ 'MenuToolbarConfiguration' => 'Dos_tosuj pasek narzędzi',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Konwersja gatunków',
+
+ 'MenuBookmarks' => 'Ulubione',
+ 'MenuBookmarksAdd' => 'Dodaj bieżący Zbiór',
+ 'MenuBookmarksEdit' => 'Edytuj ulubione',
+
+ 'MenuHelp' => 'Pomoc',
+ 'MenuHelpContent' => 'Pomoc',
+ 'MenuAllPlugins' => 'PrzeglÄ…d wtyczek',
+ 'MenuBugReport' => 'Zgłoś błąd',
+ 'MenuAbout' => 'O programie',
+
+ 'MenuNewWindow' => 'Pokaż w nowym oknie', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Rozwiń wszystkie',
+ 'ContextCollapseAll' => 'Zwiń wszystkie',
+ 'ContextChooseImage' => 'Wyb_ierz obraz',
+ 'ContextOpenWith' => 'O_twórz w',
+ 'ContextImageEditor' => 'Otwórz w edytorze graficznym',
+ 'ContextImgFront' => 'Przód',
+ 'ContextImgBack' => 'Tył',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Wprowadź wartość',
+
+ 'RemoveConfirm' => 'Czy naprawdę chcesz usunąć tą pozycję?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Nowa pozycja', # Accepts model codes
+ 'NewItemTooltip' => 'Dodaj nowÄ… pozycjÄ™', # Accepts model codes
+ 'NoItemFound' => 'Nie znaleziono tej pozycji, czy chcesz przeszukać następną witrynę?',
+ 'OpenList' => 'Wybierz Zbiór',
+ 'SaveList' => 'Gdzie mam zapisać Zbiór?',
+ 'SaveListTooltip' => 'Zapisz Zbiór',
+ 'SaveUnsavedChanges' => 'Zmiany w Twoim Zbiorze nie zostały zapisane. Czy chcesz je zapisać?',
+ 'SaveDontSave' => 'Nie zapisuj',
+ 'PreferencesTooltip' => 'Ustaw swoje preferencje',
+ 'ViewTooltip' => 'Zmień sposób wyświetlania Zbioru',
+ 'PlayTooltip' => 'Odtwórz wideo połączone z filmem', # Accepts model codes
+ 'PlayFileNotFound' => 'W podanym miejscu nie ma pliku do odtworzenia:',
+ 'PlayRetry' => 'Ponów',
+
+ 'StatusSave' => 'ZapisujÄ™...',
+ 'StatusLoad' => 'WczytujÄ™...',
+ 'StatusSearch' => 'Trwa wyszukiwanie...',
+ 'StatusGetInfo' => 'Pobieranie informacji...',
+ 'StatusGetImage' => 'Pobieranie zdjęcia...',
+
+ 'SaveError' => 'Nie mogę zapisać listy pozycji. Sprawdź uprawnienia lub wolne miejsce na dysku.',
+ 'OpenError' => 'Nie mogę odczytać listy pozycji. Sprawdź uprawnienia.',
+ 'OpenFormatError' => 'Nie mogę odczytać listy pozycji.',
+ 'OpenVersionWarning' => 'Zbiór został utworzony za pomocą nowszej wersji programu GCstar. Jeśli go zapiszesz możesz utracić część danych.',
+ 'OpenVersionQuestion' => 'Czy mimo to chcesz kontynuować?',
+ 'ImageError' => 'Wybrany katalog dla obrazów jest niewłaściwy. Wybierz inny.',
+ 'OptionsCreationError'=> 'Nie mogę stworzyć pliku konfiguracji: ',
+ 'OptionsOpenError'=> 'Nie mogę otworzyć pliku konfiguracji: ',
+ 'OptionsSaveError'=> 'Nie mogę zapisać pliku konfiguracji: ',
+ 'ErrorModelNotFound' => 'Nie znaleziono szablonu: ',
+ 'ErrorModelUserDir' => 'Szablony zdefiniowane przez użytkownika znajdują się w: ',
+
+ 'RandomTooltip' => 'Co by tu dziÅ› ...?',
+ 'RandomError'=> 'Wszystko już było', # Accepts model codes
+ 'RandomEnd'=> 'Nie mam więcej propozycji', # Accepts model codes
+ 'RandomNextTip'=> 'Kolejna propozycja',
+ 'RandomOkTip'=> 'Wybierz',
+
+ 'AboutTitle' => 'O programie',
+ 'AboutDesc' => 'Menedżer Zbiorów Gtk2',
+ 'AboutVersion' => 'Wersja',
+ 'AboutTeam' => 'Organizacja',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => 'Rozpowszechniany na warunkach licencji GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'TÅ‚umaczenie: kepin & zomers, WG',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo i webmaster: le Spektre',
+
+ 'ToolbarRandom' => 'DziÅ› wieczorem',
+
+ 'UnsavedCollection' => 'Zbiór nie zapisany',
+ 'ModelsSelect' => 'Wybierz typ zbioru',
+ 'ModelsPersonal' => 'Szablony osobiste',
+ 'ModelsDefault' => 'Szablony domyślne',
+ 'ModelsList' => 'Definiowanie zbioru',
+ 'ModelSettings' => 'Ustawienia zbioru',
+ 'ModelNewType' => 'Nowy typ zbioru',
+ 'ModelName' => 'Nazwa dla zbiorów tego typu:',
+ 'ModelFields' => 'Pola',
+ 'ModelOptions' => 'Opcje',
+ 'ModelFilters' => 'Filtry',
+ 'ModelNewField' => 'Nowe pole',
+ 'ModelFieldInformation' => 'Informacje',
+ 'ModelFieldName' => 'Etykieta:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Grupa:',
+ 'ModelFieldValues' => 'Wartości',
+ 'ModelFieldInit' => 'Domyślna:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maksimum:',
+ 'ModelFieldList' => 'Lista wartości:',
+ 'ModelFieldListLegend' => '<i>oddzielone przecinkami</i>',
+ 'ModelFieldDisplayAs' => 'Wyświetl jako:',
+ 'ModelFieldDisplayAsText' => 'Tekst',
+ 'ModelFieldDisplayAsGraphical' => 'Grafika',
+ 'ModelFieldTypeShortText' => 'Krótki tekst',
+ 'ModelFieldTypeLongText' => 'DÅ‚ugi tekst',
+ 'ModelFieldTypeYesNo' => 'Tak/Nie',
+ 'ModelFieldTypeNumber' => 'Liczba',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Predefiniowana lista wartości',
+ 'ModelFieldTypeImage' => 'Obraz',
+ 'ModelFieldTypeSingleList' => 'Prosta lista',
+ 'ModelFieldTypeFile' => 'Plik',
+ 'ModelFieldTypeFormatted' => 'Zależne od innych pól',
+ 'ModelFieldParameters' => 'Parametry',
+ 'ModelFieldHasHistory' => 'Korzystaj z historii',
+ 'ModelFieldFlat' => 'Pokazuj w jednej linii',
+ 'ModelFieldStep' => 'Krok przyrostu:',
+ 'ModelFieldFileFormat' => 'Format pliku:',
+ 'ModelFieldFileFile' => 'Zwykły plik',
+ 'ModelFieldFileImage' => 'Obraz',
+ 'ModelFieldFileVideo' => 'Wideo',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Wykorzystane pola',
+ 'ModelOptionsFieldsAuto' => 'Automatycznie',
+ 'ModelOptionsFieldsNone' => 'Wcale',
+ 'ModelOptionsFieldsTitle' => 'Jako tytuł',
+ 'ModelOptionsFieldsId' => 'Jako identyfikator',
+ 'ModelOptionsFieldsCover' => 'Jako okładka',
+ 'ModelOptionsFieldsPlay' => 'Przycisk Odtwórz',
+ 'ModelCollectionSettings' => 'Ustawienia Zbioru',
+ 'ModelCollectionSettingsLending' => 'Pozycje mogą być pożyczane',
+ 'ModelCollectionSettingsTagging' => 'Można stosować znaczniki',
+ 'ModelFilterActivated' => 'Pole będzie szukane',
+ 'ModelFilterComparison' => 'Porównanie',
+ 'ModelFilterContain' => 'Zawiera',
+ 'ModelFilterDoesNotContain' => 'Nie zawiera',
+ 'ModelFilterRegexp' => 'Wyrażenie regularne',
+ 'ModelFilterRange' => 'W zakresie',
+ 'ModelFilterNumeric' => 'Porównanie jest numeryczne',
+ 'ModelFilterQuick' => 'Utwórz szybki filtr',
+ 'ModelTooltipName' => 'Podaj nazwę jeśli chciałbyś używać tego szablonu dla wielu zbiorów. Jeżeli jej nie podasz ustawienia będą przechowywane bezpośrednio w samym zbiorze',
+ 'ModelTooltipLabel' => 'Wyświetlana nazwa pola',
+ 'ModelTooltipGroup' => 'Używana do grupowania pól. Pozycje, dla których wartość ta nie będzie ustawiona znajdą się w grupie domyślnej',
+ 'ModelTooltipHistory' => 'Poprzednio wprowadzone wartości będą przechowywane w liście przypisanej do tego pola',
+ 'ModelTooltipFormat' => 'Ten format jest używany przy określaniu akcji otwarcia pliku przyciskiem Odtwórz',
+ 'ModelTooltipLending' => 'Dodaje kilka pól odnoszących się do pożyczania',
+ 'ModelTooltipTagging' => 'Dodaje kilka pól pozwalających na zarządzanie znacznikami',
+ 'ModelTooltipNumeric' => 'Wartości będą traktowane jako liczby przy porównaniu',
+ 'ModelTooltipQuick' => 'Dodaje podmenu w menu Filtrów',
+
+ 'ResultsTitle' => 'Wybierz pozycjÄ™', # Accepts model codes
+ 'ResultsNextTip' => 'Szukaj na następnej witrynie',
+ 'ResultsPreview' => 'PodglÄ…d',
+ 'ResultsInfo' => 'Do Zbioru możesz dodać wiele pozycji jednocześnie, wybierając je trzymaj wciśnięty klawisz Ctrl lub Shift', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferencje',
+ 'OptionsExpertMode' => 'Ustawienia zaawansowane',
+ 'OptionsPrograms' => 'Wybierz program do obsługi plików danego typu, puste pole spowoduje użycie aplikacji domyślnej',
+ 'OptionsBrowser' => 'PrzeglÄ…darka',
+ 'OptionsPlayer' => 'Odtwarzacz multimedialny',
+ 'OptionsAudio' => 'Odtwarzacz muzyczny',
+ 'OptionsImageEditor' => 'Edytor graficzny',
+ 'OptionsCdDevice' => 'UrzÄ…dzenie CD',
+ 'OptionsImages' => 'Katalog obrazów',
+ 'OptionsUseRelativePaths' => 'Używaj względnych ścieżek dla obrazów',
+ 'OptionsLayout' => 'Układ',
+ 'OptionsStatus' => 'Wyświetlaj pasek stanu',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Ostrzeżenie: Zmiany zostaną wprowadzone dopiero po ponownym uruchomieniu programu.',
+ 'OptionsRemoveConfirm' => 'Potwierdzaj przed usunięciem pozycji',
+ 'OptionsAutoSave' => 'Autozapis Zbioru',
+ 'OptionsAutoLoad' => 'Po uruchomieniu załaduj poprzedni Zbiór',
+ 'OptionsSplash' => 'Pokazuj logo przy uruchamianiu',
+ 'OptionsTearoffMenus' => 'WÅ‚Ä…cz odrywane menu',
+ 'OptionsSpellCheck' => 'Zastosuj korektor pisowni w długich polach tekstowych',
+ 'OptionsProgramTitle' => 'Wybierz program którego chcesz używać',
+ 'OptionsPlugins' => 'Witryna do pobierania danych',
+ 'OptionsAskPlugins' => 'Pytaj (Wszystkie witryny)',
+ 'OptionsPluginsMulti' => 'Wiele witryn',
+ 'OptionsPluginsMultiAsk' => 'Pytaj (Wiele witryn)',
+ 'OptionsPluginsMultiPerField' => 'Wiele witryn (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Ustaw listÄ™',
+ 'OptionsAskImport' => 'Wybierz pola do importu',
+ 'OptionsProxy' => 'Używaj proxy',
+ 'OptionsCookieJar' => 'Użyj tego pliku JAR',
+ 'OptionsLang' => 'Język',
+ 'OptionsMain' => 'Główny',
+ 'OptionsPaths' => 'Ścieżki',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opcje',
+ 'OptionsDisplay' => 'Wyświetl',
+ 'OptionsToolbar' => 'Menu podręczne',
+ 'OptionsToolbars' => {0 => 'Brak', 1 => 'Małe', 2 => 'Duże', 3 => 'Ustawienia systemowe'},
+ 'OptionsToolbarPosition' => 'Pozycja',
+ 'OptionsToolbarPositions' => {0 => 'Góra', 1 => 'Dół', 2 => 'Lewa', 3 => 'Prawa'},
+ 'OptionsExpandersMode' => 'Rozmiar listy zbyt duży',
+ 'OptionsExpandersModes' => {'asis' => 'Nie zmieniaj', 'cut' => 'Przytnij', 'wrap' => 'Zawiń linie'},
+ 'OptionsDateFormat' => 'Format daty',
+ 'OptionsDateFormatTooltip' => 'Format stosowany w strftime(3). Domyślnie %d/%m/%Y',
+ 'OptionsView' => 'Lista pozycji',
+ 'OptionsViews' => {0 => 'Tekst', 1 => 'Obrazki', 2 => 'Szczegóły'},
+ 'OptionsColumns' => 'Kolumny',
+ 'OptionsMailer' => 'Program pocztowy',
+ 'OptionsSMTP' => 'Serwer',
+ 'OptionsFrom' => 'Twój adres e-mail',
+ 'OptionsTransform' => 'Umieszczaj rodzajniki na końcu',
+ 'OptionsArticles' => 'Rodzajniki',
+ 'OptionsSearchStop' => 'Zezwalaj na zatrzymanie szukania',
+ 'OptionsBigPics' => 'Użyj dużego zdjęcia jeśli to możliwe',
+ 'OptionsAlwaysOriginal' => 'Używaj głównego tytułu jako tytułu oryginalnego',
+ 'OptionsRestoreAccelerators' => 'Przywróć domyślne skróty',
+ 'OptionsHistory' => 'Rozmiar historii',
+ 'OptionsClearHistory' => 'Czyść historie',
+ 'OptionsStyle' => 'Skórka',
+ 'OptionsDontAsk' => 'Nie pytaj więcej',
+ 'OptionsPathProgramsGroup' => 'Aplikacje',
+ 'OptionsProgramsSystem' => 'Użyj programów zdefiniowanych przez system',
+ 'OptionsProgramsUser' => 'Użyj wybranych programów',
+ 'OptionsProgramsSet' => 'Wybierz programy',
+ 'OptionsPathImagesGroup' => 'Obrazy',
+ 'OptionsInternetDataGroup' => 'Import danych',
+ 'OptionsInternetSettingsGroup' => 'Ustawienia',
+ 'OptionsDisplayInformationGroup' => 'Wyświetlanie informacji',
+ 'OptionsDisplayArticlesGroup' => 'Rodzajniki',
+ 'OptionsImagesDisplayGroup' => 'Wyświetlanie',
+ 'OptionsImagesStyleGroup' => 'Styl',
+ 'OptionsDetailedPreferencesGroup' => 'Ustawienia',
+ 'OptionsFeaturesConveniencesGroup' => 'UÅ‚atwienia',
+ 'OptionsPicturesFormat' => 'Prefiks dla obrazów:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Tytuł lub nazwa odpowiedniej pozycji',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% lub . będzie zastąpione katalogiem Zbioru (stosuj tylko na początku ścieżki)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% będzie zastąpione nazwą pliku Zbioru bez rozszerzenia (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% może być stosowane wyłącznie na początku ścieżki dla obrazów',
+ 'OptionsConfigureMailers' => 'Skonfiguruj programy pocztowe',
+
+ 'ImagesOptionsButton' => 'Ustawienia',
+ 'ImagesOptionsTitle' => 'Ustawienia listy obrazków',
+ 'ImagesOptionsSelectColor' => 'Wybierz kolor',
+ 'ImagesOptionsUseOverlays' => 'Zastosuj nakładki',
+ 'ImagesOptionsBg' => 'TÅ‚o',
+ 'ImagesOptionsBgPicture' => 'Obrazek jako tło',
+ 'ImagesOptionsFg'=> 'Zaznaczenie',
+ 'ImagesOptionsBgTooltip' => 'Zmień kolor tła',
+ 'ImagesOptionsFgTooltip'=> 'Zmień kolor zaznaczenia',
+ 'ImagesOptionsResizeImgList' => 'Automatycznie ustal liczbÄ™ kolumn',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Rozmiar',
+ 'ImagesOptionsSizeList' => {0 => 'Bardzo mały', 1 => 'Mały', 2 => 'Średni', 3 => 'Duży', 4 => 'Ogromny'},
+ 'ImagesOptionsSizeTooltip' => 'Wybierz rozmiar obrazka',
+
+ 'DetailedOptionsTitle' => 'Ustawienia dokładnej listy',
+ 'DetailedOptionsImageSize' => 'Rozmiar obrazków',
+ 'DetailedOptionsGroupItems' => 'Grupuj pozycje według',
+ 'DetailedOptionsSecondarySort' => 'Dodatkowo sortuj według',
+ 'DetailedOptionsFields' => 'Wybierz wyświetlane pola',
+ 'DetailedOptionsGroupedFirst' => 'Grupuj pozostałe pozycje',
+ 'DetailedOptionsAddCount' => 'Pokaż liczbę pozycji w grupie',
+
+ 'ExtractButton' => 'Informacje',
+ 'ExtractTitle' => 'Informacja o pliku wideo',
+ 'ExtractImport' => 'Używaj wartości',
+
+ 'FieldsListOpen' => 'Wczytaj listę pól z pliku',
+ 'FieldsListSave' => 'Zapisz listę pól do pliku',
+ 'FieldsListError' => 'Ta lista pól nie może być wykorzystana dla Zbioru tego rodzaju',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Eksportuj listÄ™ pozycji',
+ 'ExportFilter' => 'Eksportuj tylko wyświetlone pozycje',
+ 'ExportFieldsTitle' => 'Pola do wyeksportowania',
+ 'ExportFieldsTip' => 'Wybierz pola, które chcesz wyeksportować',
+ 'ExportWithPictures' => 'Kopiuj obrazy do podkatalogu',
+ 'ExportSortBy' => 'Sortuj według',
+ 'ExportOrder' => 'Kolejność',
+
+ 'ImportListTitle' => 'Importuj listÄ™ pozycji',
+ 'ImportExportData' => 'Dane',
+ 'ImportExportFile' => 'Plik',
+ 'ImportExportFieldsUnused' => 'Nieużywane pola',
+ 'ImportExportFieldsUsed' => 'Używane pola',
+ 'ImportExportFieldsFill' => 'Dodaj wszystkie',
+ 'ImportExportFieldsClear' => 'Usuń wszystkie',
+ 'ImportExportFieldsEmpty' => 'Musisz zaznaczyć chociaż jedno pole',
+ 'ImportExportFileEmpty' => 'Musisz określić nazwę pliku',
+ 'ImportFieldsTitle' => 'Pola do zaimportowania',
+ 'ImportFieldsTip' => 'Wybierz pola, które chcesz zaimportować',
+ 'ImportNewList' => 'Stwórz nowy Zbiór',
+ 'ImportCurrentList' => 'Dodaj do aktualnego Zbioru',
+ 'ImportDropError' => 'Jeden lub więcej z ładowanych plików spowodował błąd. Poprzednia lista zostanie przywrócona.',
+ 'ImportGenerateId' => 'Utwórz identyfikator dla każdej z pozycji',
+
+ 'FileChooserOpenFile' => 'Wybierz plik, który chcesz użyć',
+ 'FileChooserDirectory' => 'Katalog',
+ 'FileChooserOpenDirectory' => 'Wybierz katalog',
+ 'FileChooserOverwrite' => 'Plik już istnieje. Czy chcesz go zastąpić?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Kompaktowy',
+ 'PanelReadOnly' => 'Tylko do odczytu',
+ 'PanelForm' => 'Zakładki',
+
+ 'PanelSearchButton' => 'Pobierz informacje',
+ 'PanelSearchTip' => 'Szukaj w internecie informacji o tym tytule',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Kliknij na zdjęciu aby wybrać inne.',
+ 'PanelImageTipView' => 'Kliknij na zdjęciu aby obejrzeć go w naturalnym rozmiarze.',
+ 'PanelImageTipMenu' => ' Prawy przycisk myszy - więcej opcji.',
+ 'PanelImageTitle' => 'Wybierz zdjęcie',
+ 'PanelImageNoImage' => 'Brak zdjęcia',
+ 'PanelSelectFileTitle' => 'Wybierz plik',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Przywróć domyślne',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Od',
+ 'PanelTo' =>'Do',
+
+ 'PanelWeb' => 'Sprawdź informacje',
+ 'PanelWebTip' => 'Sprawdź w sieci informacje o tej pozycji', # Accepts model codes
+ 'PanelRemoveTip' => 'Usuń bieżącą pozycję', # Accepts model codes
+
+ 'PanelDateSelect' => 'Wybierz datÄ™',
+ 'PanelNobody' => 'Nikt',
+ 'PanelUnknown' => 'Nieznany',
+ 'PanelAdded' => 'Dodano',
+ 'PanelRating' => 'Ocena',
+ 'PanelPressRating' => 'Ocena prasy',
+ 'PanelLocation' => 'Lokalizacja',
+
+ 'PanelLending' => 'Pożyczanie',
+ 'PanelBorrower' => 'Dłużnik',
+ 'PanelLendDate' => 'Data pożyczenia',
+ 'PanelHistory' => 'Historia wypożyczania',
+ 'PanelReturned' => 'Pozycja zwrócona', # Accepts model codes
+ 'PanelReturnDate' => 'Data zwrotu',
+ 'PanelLendedYes' => 'Pożyczone',
+ 'PanelLendedNo' => 'Dostępne',
+
+ 'PanelTags' => 'Znaczniki',
+ 'PanelFavourite' => 'Ulubione',
+ 'TagsAssigned' => 'Znaczniki przydzielone',
+
+ 'PanelUser' => 'Pola użytkownika',
+
+ 'CheckUndef' => 'Oba',
+ 'CheckYes' => 'Tak',
+ 'CheckNo' => 'Nie',
+
+ 'ToolbarAll' => 'Zobacz wszystkie',
+ 'ToolbarAllTooltip' => 'Zobacz wszystkie pozycje',
+ 'ToolbarGroupBy' => 'Grupuj według',
+ 'ToolbarGroupByTooltip' => 'Wybierz pole, według którego będą grupowane pozycje z listy',
+ 'ToolbarQuickSearch' => 'Szybkie wyszukiwanie',
+ 'ToolbarQuickSearchLabel' => 'Znajdź',
+ 'ToolbarQuickSearchTooltip' => 'Wybierz pole do przeszukania. Wprowadź wyrażenie i naciśnij Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Wyszukiwanie',
+ 'PluginsQuery' => 'Szukaj',
+ 'PluginsFrame' => 'PrzeglÄ…dane witryny',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nazwa',
+ 'PluginsSearchFields' => 'PrzeglÄ…dane pola',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Język',
+ 'PluginsUseSite' => 'Używaj wybranej witryny w kolejnych wyszukiwaniach',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Konfiguracja dłużnika',
+ 'BorrowersList' => 'Dłużnicy',
+ 'BorrowersName' => 'Nazwa',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Dodaj',
+ 'BorrowersRemove' => 'Usuń',
+ 'BorrowersEdit' => 'Edytuj',
+ 'BorrowersTemplate' => 'Kopia e-mail',
+ 'BorrowersSubject' => 'Temat e-mail',
+ 'BorrowersNotice1' => '%1 - nazwa dłużnika',
+ 'BorrowersNotice2' => '%2 - tytuł pozycji',
+ 'BorrowersNotice3' => '%3 - data wypożyczenia',
+
+ 'BorrowersImportTitle' => 'Import informacji o dłużnikach',
+ 'BorrowersImportType' => 'Format pliku:',
+ 'BorrowersImportFile' => 'Plik:',
+
+ 'BorrowedTitle' => 'Pożyczone pozycje', # Accepts model codes
+ 'BorrowedDate' => 'Od',
+ 'BorrowedDisplayInPanel' => 'Pokaż tą pozycję w głównym oknie', # Accepts model codes
+
+ 'MailTitle' => 'Wyślij e-mail',
+ 'MailFrom' => 'Od: ',
+ 'MailTo' => 'Do: ',
+ 'MailSubject' => 'Temat: ',
+ 'MailSmtpError' => 'Problem z serwerem SMTP',
+ 'MailSendmailError' => 'Błąd załadowania funkcji sendmail',
+
+ 'SearchTooltip' => 'Szukaj we wszystkich pozycjach', # Accepts model codes
+ 'SearchTitle' => 'Wyszukiwanie', # Accepts model codes
+ 'SearchNoField' => 'Nie wybrano żadnego pola dla wyszukiwania.
+Dodaj kilka w zakładce Filtry okienka ustawień Zbioru.',
+
+ 'QueryReplaceField' => 'Zamień w polu:',
+ 'QueryReplaceOld' => 'Znajdź',
+ 'QueryReplaceNew' => 'ZastÄ…p',
+ 'QueryReplaceLaunch' => 'ZastÄ…p',
+
+ 'ImportWindowTitle' => 'Wybierz pola do importu',
+ 'ImportViewPicture' => 'Zobacz obraz',
+ 'ImportSelectAll' => 'Zaznacz wszystkie',
+ 'ImportSelectNone' => 'Odznacz wszystkie',
+
+ 'MultiSiteTitle' => 'Witryny używane do wyszukiwania',
+ 'MultiSiteUnused' => 'Nieużywane wtyczki',
+ 'MultiSiteUsed' => 'Używane wtyczki',
+ 'MultiSiteLang' => 'Wypełnij listę polskimi wtyczkami',
+ 'MultiSiteEmptyError' => 'Twoja lista witryn jest pusta',
+ 'MultiSiteClear' => 'Wyczyść listę',
+
+ 'DisplayOptionsTitle' => 'Pozycje do wyświetlenia',
+ 'DisplayOptionsAll' => 'Zaznacz wszystkie',
+ 'DisplayOptionsSearch' => 'Przycisk Szukania',
+
+ 'GenresTitle' => 'Konwersja gatunków',
+ 'GenresCategoryName' => 'Użyj gatunku',
+ 'GenresCategoryMembers' => 'ZastÄ…p gatunek',
+ 'GenresLoad' => 'Załaduj listę',
+ 'GenresExport' => 'Zapisz listÄ™ do pliku',
+ 'GenresModify' => 'Edytuj konwersje',
+
+ 'PropertiesName' => 'Nazwa Zbioru',
+ 'PropertiesLang' => 'Kod języka',
+ 'PropertiesOwner' => 'Właściciel',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Opis',
+ 'PropertiesFile' => 'Informacje o pliku',
+ 'PropertiesFilePath' => 'Pełna ścieżka',
+ 'PropertiesItemsNumber' => 'Ilość pozycji', # Accepts model codes
+ 'PropertiesFileSize' => 'Rozmiar',
+ 'PropertiesFileSizeSymbols' => ['Bajtów', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Właściwości Zbioru',
+ 'PropertiesDefaultPicture' => 'Zdjęcie domyślne',
+
+ 'MailProgramsTitle' => 'Programy pocztowe',
+ 'MailProgramsName' => 'Nazwa',
+ 'MailProgramsCommand' => 'Polecenie',
+ 'MailProgramsRestore' => 'Przywróć domyślne',
+ 'MailProgramsAdd' => 'Dodaj program',
+ 'MailProgramsInstructions' => 'W linii poleceń mogą występować poniższe symbole:
+ %f będzie zastąpione adresem e-mail użytkownika.
+ %t będzie zastąpione adresem odbiorcy.
+ %s będzie zastąpione tematem wiadomości.
+ %b będzie zastąpione tekstem wiadomości.',
+
+ 'BookmarksBookmarks' => 'Zakładki',
+ 'BookmarksFolder' => 'Katalog',
+ 'BookmarksLabel' => 'Etykieta',
+ 'BookmarksPath' => 'Ścieżka',
+ 'BookmarksNewFolder' => 'Nowy katalog',
+
+ 'AdvancedSearchType' => 'Typ wyszukiwania',
+ 'AdvancedSearchTypeAnd' => 'Pozycje spełniające wszystkie warunki', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Pozycje spełniające co najmniej jeden z warunków', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Warunki',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Zapisz wyszukiwanie',
+ 'AdvancedSearchSaveName' => 'Nazwa',
+ 'AdvancedSearchSaveOverwrite' => 'Wyszukiwanie o tej nazwie już istnieje. Proszę użyć innej nazwy.',
+ 'AdvancedSearchUseCase' => 'Uwzględniaj wielkość liter',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignoruj znaki diakrytyczne',
+
+ 'BugReportSubject' => 'Zgłoszenie błędu wygenerowane z programu GCstar',
+ 'BugReportVersion' => 'Wersja',
+ 'BugReportPlatform' => 'System operacyjny',
+ 'BugReportMessage' => 'Treść zgłoszenia',
+ 'BugReportInformation' => 'Informacje dodatkowe',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..baa74c3
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PT::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Incluir nomes de campo no topo',
+ 'Separator' => 'Separador',
+ 'Replacement' => 'Substitua o separador por',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..beaa61d
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PT::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..3664f14
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::PT::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Usar Javascript',
+ 'FileTemplate' => 'Modelo:',
+ 'Preview' => 'Prévia',
+ 'NoPreview' => 'Nenhuma prévia disponível',
+ 'Title' => 'Título da página',
+ 'InfoFile' => 'Arquivo de lista de filmes: ',
+ 'InfoDir' => 'Pasta de imagens: ',
+ 'HeightImg' => 'Altura (em pixels) da imagem exportada: ',
+ 'OpenFileInBrowser' => 'Abrir arquivo gerado no navegador',
+ 'Note' => 'Lista generada por <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduza texto de busca',
+ 'SearchType1' => 'Apenas título',
+ 'SearchType2' => 'Toda informação',
+ 'SearchButton' => 'Procurar',
+ 'SearchTitle' => 'Mostrar apenas filmes coincidentes com o critérios anteriores',
+ 'AllButton' => 'Todos',
+ 'AllTitle' => 'Mostrar todos os filmes',
+ 'Expand' => 'Expandir tudo',
+ 'ExpandTitle' => 'Motrar informação de todos os filmes',
+ 'Collapse' => 'Contrair tudo',
+ 'CollapseTitle' => 'Ocultar a informação de todos os filmes',
+ 'Borrowed' => 'Emprestado por: ',
+ 'NotBorrowed' => 'Disponível',
+ 'Top' => 'Topo',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b77aba3
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::PT::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..615cde3
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::PT::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Incluir uma instrução DROP',
+ 'WithCreate' => 'Incluir uma instrução CREATE',
+ 'TableName' => 'Nome da tabela',
+ 'InfoFile' => 'Arquivo SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..2743c46
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PT::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'O arquivo .tar.gz se encontra em: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..0d5493b
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::PT::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Modelo do arquivo',
+ 'ModelText' => 'Modelo do texto',
+ 'Models' => 'Usar modelo: ',
+ 'UseFile' => 'Usar arquivo',
+ 'UseModel' => 'Usar área de texto',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..8db0227
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::PT::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Onde deve-se efetuar a busca',
+ 'Default' => 'Diretório padrão do Alexandria',
+ 'Specified' => 'Diretório especificado abaixo',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..8620e98
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PT::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignorar primeira linha',
+ 'Separator' => 'Separador',
+ 'Plugin' => 'Utilizar o site',
+ 'UseFirst' => 'Selecionar o primeiro se houver muitos resultados',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..8924a5b
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::PT::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..c472253
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PT::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiar imagens',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportList.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportList.pm
new file mode 100644
index 0000000..d0c28c1
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PT::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista de títulos',
+ 'Plugin' => 'Utilizar o site',
+ 'UseFirst' => 'Selecionar o primeiro se houver muitos resultados',
+ 'CommentAuto' => 'Item importado automaticamente.',
+ 'CommentSite' => 'Website: ',
+ 'CommentTitle' => 'Título: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..2eb7aba
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::PT::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..5b5c67e
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::PT::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'O arquivo não é uma coleção Tellico válida',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..beaa947
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::PT::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..31f5e57
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::PT::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..e488fb9
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::PT::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCbooks.pm b/lib/gcstar/GCLang/PT/GCModels/GCbooks.pm
new file mode 100644
index 0000000..caedcae
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::PT::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de livros',
+ Items => 'Livros',
+ NewItem => 'Novo livro',
+
+ Isbn => 'ISBN',
+ Title => 'Título',
+ Cover => 'Capa',
+ Authors => 'Autores',
+ Publisher => 'Editora',
+ Publication => 'Data de publicação',
+ Language => 'Língua',
+ Genre => 'Gênero',
+ Serie => 'Série',
+ Rank => 'Ranking',
+ Bookdescription => 'Descrição',
+ Pages => 'Páginas',
+ Read => 'Lido',
+ Acquisition => 'Data de aquisição',
+ Edition => 'Edição',
+ Format => 'Formato',
+ Comments => 'Comentários',
+ Url => 'Página da web',
+ Translator => 'Tradutor',
+ Artist => 'Artista',
+ DigitalFile => 'Digital version',
+
+ General => 'Geral',
+ Details => 'Detalhes',
+
+ ReadNo => 'Não lido',
+ ReadYes => 'Lido',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCcoins.pm b/lib/gcstar/GCLang/PT/GCModels/GCcoins.pm
new file mode 100644
index 0000000..bb6188a
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::PT::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção numismatica',
+ Items => 'Moedas',
+ NewItem => 'Nova moeda',
+
+ Name => 'Nome',
+ Country => 'País',
+ Year => 'Ano',
+ Currency => 'Moeda corrente',
+ Value => 'Valor',
+ Picture => 'Figura principal',
+ Diameter => 'Diametro',
+ Metal => 'Metal',
+ Edge => 'Borda',
+ Edge1 => 'Borda 1',
+ Edge2 => 'Borda 2',
+ Edge3 => 'Borda 3',
+ Edge4 => 'Borda 4',
+ Head => 'Cara',
+ Tail => 'Coroa',
+ Comments => 'Comentários',
+ History => 'História',
+ Website => 'Página da web',
+ Estimate => 'Estimativa',
+ References => 'Referências',
+ Type => 'Tipo',
+ Coin => 'Moeda',
+ Banknote => 'Nota do banco',
+
+ Main => 'Principal',
+ Description => 'Descrição',
+ Other => 'Outras informações',
+ Pictures => 'Imagens',
+
+ Condition => 'Condição (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCcomics.pm b/lib/gcstar/GCLang/PT/GCModels/GCcomics.pm
new file mode 100644
index 0000000..f436260
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::PT::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCfilms.pm b/lib/gcstar/GCLang/PT/GCModels/GCfilms.pm
new file mode 100644
index 0000000..699434e
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCfilms.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::PT::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de filmes',
+ Items => 'Filmes',
+ NewItem => 'Novo filme',
+
+
+ Id => 'Id',
+ Title => 'Título',
+ Date => 'Data',
+ Time => 'Duração',
+ Director => 'Diretor',
+ Country => 'País',
+ MinimumAge => 'Censura',
+ Genre => 'Gênero',
+ Image => 'Imagem',
+ Original => 'Título original',
+ Actors => 'Elenco',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Comentários',
+ Synopsis => 'Sinopse',
+ Seen => 'Visto',
+ Number => 'N° da mídia',
+ Format => 'Formato',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Página da Web',
+ Audio => 'Ãudio',
+ Video => 'Formato do vídeo',
+ Trailer => 'Arquivo de vídeo',
+ Serie => 'Série',
+ Rank => 'Ranking',
+ Subtitles => 'Lengendas',
+
+ SeenYes => 'Visto',
+ SeenNo => 'Não visto',
+
+ AgeUnrated => 'Desconhecida',
+ AgeAll => 'Livre',
+ AgeParent => 'Controle dos pais',
+
+ Main => 'Itens principais',
+ General => 'Geral',
+ Details => 'Detalhes',
+ Lending => 'Empréstimo',
+
+ Information => 'Informação',
+ Languages => 'Línguas',
+ Encoding => 'Codificação',
+
+ FilterAudienceAge => 'Idade mínima',
+ FilterSeenNo => '_Não visto ainda',
+ FilterSeenYes => '_Já visto',
+ FilterRatingSelect => 'Nota _mínima...',
+
+ ExtractSize => 'Tamanho',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCgames.pm b/lib/gcstar/GCLang/PT/GCModels/GCgames.pm
new file mode 100644
index 0000000..5f359e8
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::PT::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de jogos',
+ Items => 'Jogos',
+ NewItem => 'Novo jogo',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nome',
+ Platform => 'Plataforma',
+ Players => 'Número de jogadores',
+ Released => 'Data de lançamento',
+ Editor => 'Editor',
+ Developer => 'Desenvolvedor',
+ Genre => 'Gênero',
+ Box => 'Imagem da capa',
+ Case => 'Capa',
+ Manual => 'Manual de instruções',
+ Completion => 'Completado (%)',
+ Executable => 'Executable',
+ Description => 'Descrição',
+ Codes => 'Códigos',
+ Code => 'Código',
+ Effect => 'Efeito',
+ Secrets => 'Segredos',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'Primeiro screenshot',
+ Screenshot2 => 'Segundo screenshot',
+ Comments => 'Comentários',
+ Url => 'Página da web',
+ Unlockables => 'Desbloqueados',
+ Unlockable => 'Desbloqueado',
+ Howto => 'Como desbloquear',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Geral',
+ Details => 'Detalhes',
+ Tips => 'Tipos',
+ Information => 'Informação',
+
+ FilterRatingSelect => 'Nota _mínima...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..757f21f
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::PT::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCminicars.pm b/lib/gcstar/GCLang/PT/GCModels/GCminicars.pm
new file mode 100644
index 0000000..07b9617
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::PT::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCmusics.pm b/lib/gcstar/GCLang/PT/GCModels/GCmusics.pm
new file mode 100644
index 0000000..309582e
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::PT::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Coleção de músicas',
+ Items => 'Albuns',
+ NewItem => 'Novo album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Título',
+ Cover => 'Capa',
+ Artist => 'Artista',
+ Format => 'Formato',
+ Running => 'Tempo de execução',
+ Release => 'Data de lançamento',
+ Genre => 'Gênero',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Faixas',
+ Number => 'Número',
+ Track => 'Título',
+ Time => 'Tempo',
+
+ Composer => 'Compositor',
+ Producer => 'Produtor',
+ Playlist => 'Lista de reprodução',
+ Comments => 'Comentários',
+ Label => 'Nome',
+ Url => 'Página da web',
+
+ General => 'Geral',
+ Details => 'Detalhes',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..2386b93
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::PT::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..1fa815f
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::PT::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..9067f04
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::PT::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCstamps.pm b/lib/gcstar/GCLang/PT/GCModels/GCstamps.pm
new file mode 100644
index 0000000..79c8da4
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::PT::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCModels/GCwines.pm b/lib/gcstar/GCLang/PT/GCModels/GCwines.pm
new file mode 100644
index 0000000..a60fe81
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::PT::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => {0 => 'Wine',
+ 1 => 'Wine',
+ X => 'Wines'},
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/PT/GCstar.pm b/lib/gcstar/GCLang/PT/GCstar.pm
new file mode 100644
index 0000000..0a5ec94
--- /dev/null
+++ b/lib/gcstar/GCLang/PT/GCstar.pm
@@ -0,0 +1,673 @@
+{
+ package GCLang::PT;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Português',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Aviso</b>:
+
+A informação baixada de sites da internet (através
+dos plugins de busca) é para <b>uso pessoal apenas</b>.
+
+Qualquer redistribuição é proibida <b>permissão explicita</b>
+do site.
+
+Para escolher em qual site deseja buscar a informação, você
+pode usar o <b>botão abaixo dos detalhes do item</b>.',
+
+ 'AllItemsFiltered' => 'Nenhum item cumpre com os critérios do filtro', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalar em ',
+ 'InstallMandatory' => 'Componente obrigatórios',
+ 'InstallOptional' => 'Componentes opcionais',
+ 'InstallErrorMissing' => 'Error: os componentes seguintes devem ser instalados: ',
+ 'InstallPrompt' => 'Pasta predeterminado para a instalação [/usr/local]: ',
+ 'InstallEnd' => 'Fim da instalação',
+ 'InstallNoError' => 'Nenhum erro',
+ 'InstallLaunch' => 'Para utilizar a aplicação, execute ',
+ 'InstallDirectory' => 'Pasta de instalação',
+ 'InstallTitle' => 'Instalação do GCstar',
+ 'InstallDependencies' => 'Dependências',
+ 'InstallPath' => 'Caminho',
+ 'InstallOptions' => 'Opções',
+ 'InstallSelectDirectory' => 'Escolha a pasta para instalação',
+ 'InstallWithClean' => 'Apagar arquivos das pastas de instalação.',
+ 'InstallWithMenu' => 'Adicionar GCstar ao menu de Aplicações',
+ 'InstallNoPermission' => 'Error : Você não tem permissões para instalar na pasta selecionada',
+ 'InstallMissingMandatory' => 'Algumas dependências obrigatórias não estão disponíveis. Não poderá instalar GCstar até que se instalem no sistema.',
+ 'InstallMissingOptional' => 'Algumas dependências opcionais não estão disponíveis (lista abaixo). GCstar será instalado com algumas funções desabilitadas.',
+ 'InstallMissingNone' => 'Dependências satisfeitas. Pode continuar e instalar GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Não disponível',
+ 'InstallMissingFor' => 'Não disponível por',
+ 'InstallCleanDirectory' => 'Apagar arquivos de GCstar na pasta: ',
+ 'InstallCopyDirectory' => 'Copiando arquivos na pasta: ',
+ 'InstallCopyDesktop' => 'Copiando os arquivos da área de trabalho em: ',
+
+#Update
+ 'UpdateUseProxy' => 'Usar o Proxy (se não usa nenhum pressione Enter): ',
+ 'UpdateNoPermission' => 'Permissão de escrita negada para esta pasta: ',
+ 'UpdateNone' => 'Nenhuma atualização encontrada',
+ 'UpdateFileNotFound' => 'Arquivo não encontrado',
+
+#Splash
+ 'SplashInit' => 'Inicialização',
+ 'SplashLoad' => 'Carregando coleção',
+ 'SplashDisplay' => 'Mostrando Coleção',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Pronto',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Parece que você usava GCfilms antes. Quer importar do GCfilms para o GCstar? (Não afetará o GCfilms, se você quiser seguir usando-o)',
+ 'GCfilmsImportOptions' => 'Preferências',
+ 'GCfilmsImportData' => 'Lista de filmes',
+
+#Menus
+ 'MenuFile' => '_Arquivo',
+ 'MenuNewList' => '_Nova coleção',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Coleções _recentes',
+ 'MenuLend' => '_Ver itens emprestados', # Accepts model codes
+ 'MenuImport' => '_Importar',
+ 'MenuExport' => '_Exportar',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Editar',
+ 'MenuDuplicate' => '_Duplicar item', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Apagar item', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Trocar campos da coleção',
+ 'MenuEditLockItems' => '_Bloquear coleção',
+
+ 'MenuDisplay' => '_Filtros',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'Busca _avançada',
+ 'MenuViewAllItems' => '_Ver todos os itens', # Accepts model codes
+ 'MenuNoFilter' => '_Todos',
+
+ 'MenuConfiguration' => '_Configurações',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Informações exibidas',
+ 'MenuBorrowers' => '_Devedores',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Conversão de _gêneros',
+
+ 'MenuBookmarks' => 'Minhas _Coleções',
+ 'MenuBookmarksAdd' => '_Adicionar coleção atual',
+ 'MenuBookmarksEdit' => '_Editar coleções favoritas',
+
+ 'MenuHelp' => 'Aj_uda?',
+ 'MenuHelpContent' => '_Conteúdo?',
+ 'MenuAllPlugins' => 'Ver _plugins',
+ 'MenuBugReport' => '_Reportar um problema',
+ 'MenuAbout' => '_Sobre',
+
+ 'MenuNewWindow' => 'Mostrar item em uma nova janela', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandir tudo',
+ 'ContextCollapseAll' => 'Contrair todo',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Por favor, introduza um valor',
+
+ 'RemoveConfirm' => 'Tem certeza que quer apagar este item?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Novo item', # Accepts model codes
+ 'NewItemTooltip' => 'Adicionar um novo item', # Accepts model codes
+ 'NoItemFound' => 'Nada foi encontrado. Deseja tentar a busca em outro site?',
+ 'OpenList' => 'Por favor, selecione uma coleção',
+ 'SaveList' => 'Selecione onde deseja salvar a coleção',
+ 'SaveListTooltip' => 'Salvar coleção atual',
+ 'SaveUnsavedChanges' => 'Existe mudanças na coleção atual. Deseja salvá-las',
+ 'SaveDontSave' => 'Não salvar',
+ 'PreferencesTooltip' => 'Selecionar preferências',
+ 'ViewTooltip' => 'Trocar o tipo de coleção',
+ 'PlayTooltip' => 'Reproduzir arquivo de vídeo associado ao item', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Salvando...',
+ 'StatusLoad' => 'Carregando...',
+ 'StatusSearch' => 'Busca em progresso...',
+ 'StatusGetInfo' => 'Baixando a informação...',
+ 'StatusGetImage' => 'Baixando imagem...',
+
+ 'SaveError' => 'Impossível salvar a coleção. Por favor, verifique as permissões de acesso e o espaço livre.',
+ 'OpenError' => 'Impossível abrir a coleção. Por favor, verifique as permissões de acesso.',
+ 'OpenFormatError' => 'Impossível abrir a coleção. O formato pode estar incorreto',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'O diretório de imagens está incorreto. Por favor, selecione outro.',
+ 'OptionsCreationError'=> 'Impossível criar um arquivo de opções: ',
+ 'OptionsOpenError'=> 'Impossível abrir um arquivo de opções: ',
+ 'OptionsSaveError'=> 'Impossível salvar um arquivo de opções: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'O que quer ver esta noite?',
+ 'RandomError'=> 'Você não possui itens selecionáveis', # Accepts model codes
+ 'RandomEnd'=> 'Não tem mais itens', # Accepts model codes
+ 'RandomNextTip'=> 'Segunda sugestão',
+ 'RandomOkTip'=> 'Aceitar este item',
+
+ 'AboutTitle' => 'Sobre GCstar',
+ 'AboutDesc' => 'Gerenciador de coleções',
+ 'AboutVersion' => 'Versão',
+ 'AboutTeam' => 'Equipe',
+ 'AboutWho' => 'Christian Jodar (Tian) : Gerente de projeto, Programador
+Nyall Dawson (Zombiepig) : Programador
+TPF : Programador
+Adolfo González : Programador
+',
+ 'AboutLicense' => 'Distribuído segundo os termos da GNU GPL
+Logos Copyright le Spektre',
+ 'AboutTranslation' => 'Tradução para português (Brasil): Daniel Valença',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo e webdesign por le Spektre',
+
+ 'ToolbarRandom' => 'Esta noite',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Selecionar um tipo de coleção',
+ 'ModelsPersonal' => 'Modelos pessoais',
+ 'ModelsDefault' => 'Modelos padrões',
+ 'ModelsList' => 'Definições da coleção',
+ 'ModelSettings' => 'Configurações da coleção',
+ 'ModelNewType' => 'Novo tipo de coleção',
+ 'ModelName' => 'Nome do tipo de coleção:',
+ 'ModelFields' => 'Campos',
+ 'ModelOptions' => 'Opções',
+ 'ModelFilters' => 'Filtros',
+ 'ModelNewField' => 'Novo campo',
+ 'ModelFieldInformation' => 'Informação',
+ 'ModelFieldName' => 'Nome:',
+ 'ModelFieldType' => 'Tipo:',
+ 'ModelFieldGroup' => 'Grupo:',
+ 'ModelFieldValues' => 'Valores',
+ 'ModelFieldInit' => 'Padrões:',
+ 'ModelFieldMin' => 'Mínimo:',
+ 'ModelFieldMax' => 'Máximo:',
+ 'ModelFieldList' => 'Lista de valores:',
+ 'ModelFieldListLegend' => '<i>Separados por vírgulas</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Texto curto',
+ 'ModelFieldTypeLongText' => 'Texto longo',
+ 'ModelFieldTypeYesNo' => 'Sim/Não',
+ 'ModelFieldTypeNumber' => 'Número',
+ 'ModelFieldTypeDate' => 'Data',
+ 'ModelFieldTypeOptions' => 'Lista de valores predefinidos',
+ 'ModelFieldTypeImage' => 'Imagem',
+ 'ModelFieldTypeSingleList' => 'Lista simples',
+ 'ModelFieldTypeFile' => 'Arquivo',
+ 'ModelFieldTypeFormatted' => 'Dependente em outros campos',
+ 'ModelFieldParameters' => 'Parâmetros',
+ 'ModelFieldHasHistory' => 'Usar um histórico',
+ 'ModelFieldFlat' => 'Exibir uma linha',
+ 'ModelFieldStep' => 'Tamanho do incremento:',
+ 'ModelFieldFileFormat' => 'Formato do arquivo:',
+ 'ModelFieldFileFile' => 'Arquivo simples',
+ 'ModelFieldFileImage' => 'Imagem',
+ 'ModelFieldFileVideo' => 'Vídeo',
+ 'ModelFieldFileAudio' => 'Ãudio',
+ 'ModelFieldFileProgram' => 'Programa',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Campos a usar',
+ 'ModelOptionsFieldsAuto' => 'Automático',
+ 'ModelOptionsFieldsNone' => 'Nenhum',
+ 'ModelOptionsFieldsTitle' => 'Como título',
+ 'ModelOptionsFieldsId' => 'Como identificador',
+ 'ModelOptionsFieldsCover' => 'Como capa',
+ 'ModelOptionsFieldsPlay' => 'Como botão de Reproduzir',
+ 'ModelCollectionSettings' => 'Preferências da coleção',
+ 'ModelCollectionSettingsLending' => 'Elementos que podem ser emprestados',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Deve aparecer na caixa de busca',
+ 'ModelFilterComparison' => 'Comparação',
+ 'ModelFilterContain' => 'Contém',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Escopo',
+ 'ModelFilterNumeric' => 'Comparação numérica',
+ 'ModelFilterQuick' => 'Criar um filtro rápido',
+ 'ModelTooltipName' => 'Usar um nome para reutilizar este modelo para outras coleções. Se vazio, as preferências serão salvas na própria coleção',
+ 'ModelTooltipLabel' => 'Nome do campo como será mostrado',
+ 'ModelTooltipGroup' => 'Usado para agrupar os campos. Itens sem valor serão atribuídos ao grupo padrão',
+ 'ModelTooltipHistory' => 'Os valores introduzidos anteriormente devem ser armazenados em uma lista associada ao campo?',
+ 'ModelTooltipFormat' => 'O formato se usa para determinar a ação para abrir o arquivo com o botão Reproduzir',
+ 'ModelTooltipLending' => 'Isto irá adicionar campos para o gerenciamento dos empréstimos',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Os valores devem ser considerados como números para comparação?',
+ 'ModelTooltipQuick' => 'Isto irá adicionar um sub-menu dentro do menu de Filtros',
+
+ 'ResultsTitle' => 'Selecione um item', # Accepts model codes
+ 'ResultsNextTip' => 'Buscar no próximo site',
+ 'ResultsPreview' => 'Prévia',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferências',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Navegador de Internet',
+ 'OptionsPlayer' => 'Reprodutor de vídeo',
+ 'OptionsAudio' => 'Reprodutor de áudio',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Pasta de imagens',
+ 'OptionsUseRelativePaths' => 'Usar rotas relativas para as imagens',
+ 'OptionsLayout' => 'Disposição',
+ 'OptionsStatus' => 'Barra de status',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Atenção: As mudanças efetuadas nesta aba não terão efeito até que o aplicativo seja reiniciado.',
+ 'OptionsRemoveConfirm' => 'Pedir confirmação antes de apagar',
+ 'OptionsAutoSave' => 'Salvar coleção automaticamente',
+ 'OptionsAutoLoad' => 'Carregar a coleção anterior ao início',
+ 'OptionsSplash' => 'Exibir tela de início',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Escolha que programa a utilizar',
+ 'OptionsPlugins' => 'Site para baixar informações',
+ 'OptionsAskPlugins' => 'Perguntar (Todos os sites)',
+ 'OptionsPluginsMulti' => 'Vários sites',
+ 'OptionsPluginsMultiAsk' => 'Perguntar (Alguns sites)',
+ 'OptionsPluginsMultiPerField' => 'Vários sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Definir lista',
+ 'OptionsAskImport' => 'Escolher os campos a importar',
+ 'OptionsProxy' => 'Utilizar um proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsMain' => 'Principal',
+ 'OptionsLang' => 'Idioma',
+ 'OptionsPaths' => 'Pastas',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Opções',
+ 'OptionsDisplay' => 'Visualização',
+ 'OptionsToolbar' => 'Barra de ferramentas',
+ 'OptionsToolbars' => {0 => 'Nenhuma', 1 => 'Pequena', 2 => 'Grande', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Posição',
+ 'OptionsToolbarPositions' => {0 => 'Acima', 1 => 'Abaixo', 2 => 'Esquerda', 3 => 'Direita'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Tipo de coleção',
+ 'OptionsViews' => {0 => 'Texto', 1 => 'Imagem', 2 => 'Detalhada'},
+ 'OptionsColumns' => 'Colunas',
+ 'OptionsMailer' => 'Método de envio',
+ 'OptionsSMTP' => 'Servidor',
+ 'OptionsFrom' => 'Seu e-mail',
+ 'OptionsTransform' => 'Colocar artigos ao final dos títulos',
+ 'OptionsArticles' => 'Artigos (separados por vírgula)',
+ 'OptionsSearchStop' => 'O usuário pode cancelar a busca',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Usar título principal como o original se não encontrar nenhum',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Tamanho do histórico',
+ 'OptionsClearHistory' => 'Limpar histórico',
+ 'OptionsStyle' => 'Skin',
+ 'OptionsDontAsk' => 'Não perguntar mais',
+ 'OptionsPathProgramsGroup' => 'Aplicações',
+ 'OptionsProgramsSystem' => 'Usar programas definidos pelo sistema',
+ 'OptionsProgramsUser' => 'Usar programas especificados',
+ 'OptionsProgramsSet' => 'Escolher programas',
+ 'OptionsPathImagesGroup' => 'Imagens',
+ 'OptionsInternetDataGroup' => 'Importar dados',
+ 'OptionsInternetSettingsGroup' => 'Configurações',
+ 'OptionsDisplayInformationGroup' => 'Mostrar informação',
+ 'OptionsDisplayArticlesGroup' => 'Artigos',
+ 'OptionsImagesDisplayGroup' => 'Exibir',
+ 'OptionsImagesStyleGroup' => 'Estilo',
+ 'OptionsDetailedPreferencesGroup' => 'Preferências',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniências',
+ 'OptionsPicturesFormat' => 'Prefixo para usar nas imagens:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Título ou nome do item associado',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% ou . será substituído com a pasta da coleção (usar apenas no começo da pasta)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% será substituído pelo nome do arquivo da coleção sem o sufixo (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% pode ser usado apenas no começo da pasta de imagens',
+ 'OptionsConfigureMailers' => 'Configurar programas de e-mail',
+
+ 'ImagesOptionsButton' => 'Configurações',
+ 'ImagesOptionsTitle' => 'Configurações para lista de imagens',
+ 'ImagesOptionsSelectColor' => 'Escolha uma cor',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Fundo',
+ 'ImagesOptionsBgPicture' => 'Usar uma imagem de fundo',
+ 'ImagesOptionsFg'=> 'Seleção',
+ 'ImagesOptionsBgTooltip' => 'Trocar cor de fundo',
+ 'ImagesOptionsFgTooltip'=> 'Trocar cor de seleção',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Tamanho',
+ 'ImagesOptionsSizeList' => {0 => 'Muito Pequeno', 1 => 'Pequeno', 2 => 'Médio', 3 => 'Grande', 4 => 'Muito Grande'},
+ 'ImagesOptionsSizeTooltip' => 'Selecione um tamanho de imagem',
+
+ 'DetailedOptionsTitle' => 'Configuração para lista detalhada',
+ 'DetailedOptionsImageSize' => 'Tamanho da imagem',
+ 'DetailedOptionsGroupItems' => 'Agrupar itens por',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Selecione os campos a exibir',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Informação',
+ 'ExtractTitle' => 'Informação do arquivo',
+ 'ExtractImport' => 'Usar valores',
+
+ 'FieldsListOpen' => 'Ler os campos da lista de um arquivo',
+ 'FieldsListSave' => 'Salvar os campos da lista em outro arquivo',
+ 'FieldsListError' => 'Estes campos não podem ser usados com este tipo de coleção',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exportar itens',
+ 'ExportFilter' => 'Exportar apenas itens exibidos',
+ 'ExportFieldsTitle' => 'Campos a exportar',
+ 'ExportFieldsTip' => 'Escolha os campos para exportar',
+ 'ExportWithPictures' => 'Copiar as imagens de uma sub-pasta',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Importar outra lista de itens',
+ 'ImportExportData' => 'Informação',
+ 'ImportExportFile' => 'Arquivo',
+ 'ImportExportFieldsUnused' => 'Campos inutilizados',
+ 'ImportExportFieldsUsed' => 'Campos utilizados',
+ 'ImportExportFieldsFill' => 'Todos os campos',
+ 'ImportExportFieldsClear' => 'Nenhum campo',
+ 'ImportExportFieldsEmpty' => 'Deve assinalar ao menos um campo',
+ 'ImportExportFileEmpty' => 'Especifique um nome para o arquivo',
+ 'ImportFieldsTitle' => 'Campos a importar',
+ 'ImportFieldsTip' => 'Escolha os campos para importar',
+ 'ImportNewList' => 'Criar uma nova coleção',
+ 'ImportCurrentList' => 'Adicionar para coleção atual',
+ 'ImportDropError' => 'Ocorreu um erro ao abrir em pelo menos um arquivo. A lista anterior será recarregada.',
+ 'ImportGenerateId' => 'Gerar identificador para cada item',
+
+ 'FileChooserOpenFile' => 'Por favor, selecione um arquivo',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Escolha uma pasta',
+ 'FileChooserOverwrite' => 'Este arquivo já existe. Deseja sobrescrevê-lo?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Compacto',
+ 'PanelReadOnly' => 'Somente leitura',
+ 'PanelForm' => 'Abas',
+
+ 'PanelSearchButton' => 'Baixar informação',
+ 'PanelSearchTip' => 'Buscar informação na Internet para este nome',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Click na imagem para selecionar outra',
+ 'PanelImageTipView' => 'Click na imagem para vê-la em tamanho real...',
+ 'PanelImageTipMenu' => 'Click com o botão direito para mais opções.',
+ 'PanelImageTitle' => 'Selecionar uma imagem',
+ 'PanelImageNoImage' => 'Sem imagem',
+ 'PanelSelectFileTitle' => 'Selecione um arquivo',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurar padrões',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'De',
+ 'PanelTo' =>'Para',
+
+ 'PanelWeb' => 'Ver informação',
+ 'PanelWebTip' => 'Ver informação na Internet sobre este item', # Accepts model codes
+ 'PanelRemoveTip' => 'Apagar item atual', # Accepts model codes
+
+ 'PanelDateSelect' => 'Selecionar',
+ 'PanelNobody' => 'Ninguém',
+ 'PanelUnknown' => 'Desconhecido',
+ 'PanelAdded' => 'Adicionar data',
+ 'PanelRating' => 'Nota',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Localidade',
+
+ 'PanelLending' => 'Emprestar',
+ 'PanelBorrower' => 'Devedor',
+ 'PanelLendDate' => 'Fora desde',
+ 'PanelHistory' => 'Histórico',
+ 'PanelReturned' => 'Item devolvido', # Accepts model codes
+ 'PanelReturnDate' => 'Data de devolução',
+ 'PanelLendedYes' => 'Emprestada',
+ 'PanelLendedNo' => 'Disponível',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Qualquer',
+ 'CheckYes' => 'Sim',
+ 'CheckNo' => 'Não',
+
+ 'ToolbarAll' => 'Ver todas',
+ 'ToolbarAllTooltip' => 'Ver todos os itens',
+ 'ToolbarGroupBy' => 'Agrupar por',
+ 'ToolbarGroupByTooltip' => 'Selecionar o campo para usar nos itens agrupados na lista',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Buscar um item',
+ 'PluginsQuery' => 'Pergunta',
+ 'PluginsFrame' => 'Site de busca',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nome',
+ 'PluginsSearchFields' => 'Campos de busca',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Idioma',
+ 'PluginsUseSite' => 'Usar site selecionado para futuras buscas',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configuração dos devedores',
+ 'BorrowersList' => 'Devedores',
+ 'BorrowersName' => 'Nome',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Adicionar',
+ 'BorrowersRemove' => 'Apagar',
+ 'BorrowersEdit' => 'Modificar',
+ 'BorrowersTemplate' => 'Modelo do e-mail',
+ 'BorrowersSubject' => 'Assunto do e-mail',
+ 'BorrowersNotice1' => '%1 será substituído pelo nome do devedor',
+ 'BorrowersNotice2' => '%2 será substituído pelo título do item',
+ 'BorrowersNotice3' => '%3 será substituído pela data do empréstimo',
+
+ 'BorrowersImportTitle' => 'Importar informação dos devedores',
+ 'BorrowersImportType' => 'Formato do arquivo:',
+ 'BorrowersImportFile' => 'Arquivo:',
+
+ 'BorrowedTitle' => 'Itens emprestados', # Accepts model codes
+ 'BorrowedDate' => 'Desde',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Enviar um e-mail',
+ 'MailFrom' => 'De: ',
+ 'MailTo' => 'Para: ',
+ 'MailSubject' => 'Assunto: ',
+ 'MailSmtpError' => 'Problema de conexão com o servidor SMTP',
+ 'MailSendmailError' => 'Problema na execução do sendmail',
+
+ 'SearchTooltip' => 'Buscar em todos itens', # Accepts model codes
+ 'SearchTitle' => 'Busca de itens', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Campo para substituição',
+ 'QueryReplaceOld' => 'Nome atual',
+ 'QueryReplaceNew' => 'Novo nome',
+ 'QueryReplaceLaunch' => 'Substituir',
+
+ 'ImportWindowTitle' => 'Escolher os campos para importar',
+ 'ImportViewPicture' => 'Ver a imagem',
+ 'ImportSelectAll' => 'Selecionar todos',
+ 'ImportSelectNone' => 'Selecionar nenhum',
+
+ 'MultiSiteTitle' => 'Sites de busca',
+ 'MultiSiteUnused' => 'Plugins inutilizados',
+ 'MultiSiteUsed' => 'Plugins para usar',
+ 'MultiSiteLang' => 'Selecionar plugins em português',
+ 'MultiSiteEmptyError' => 'A lista de sites está vazia',
+ 'MultiSiteClear' => 'Limpar lista',
+
+ 'DisplayOptionsTitle' => 'Elementos a exibir',
+ 'DisplayOptionsAll' => 'Selecionar todos',
+ 'DisplayOptionsSearch' => 'Buscar',
+
+ 'GenresTitle' => 'Conversão de Gêneros',
+ 'GenresCategoryName' => 'Gênero a usar',
+ 'GenresCategoryMembers' => 'Gêneros a substituir',
+ 'GenresLoad' => 'Carregar uma lista',
+ 'GenresExport' => 'Exportar lista para arquivo',
+ 'GenresModify' => 'Editar conversão',
+
+ 'PropertiesName' => 'Nome da coleção',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Dono',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'Descrição',
+ 'PropertiesFile' => 'Informação do arquivo',
+ 'PropertiesFilePath' => 'Caminho completo',
+ 'PropertiesItemsNumber' => 'Número de itens', # Accepts model codes
+ 'PropertiesFileSize' => 'Tamanho',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Propriedades da coleção',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programas para enviar e-mails',
+ 'MailProgramsName' => 'Nome',
+ 'MailProgramsCommand' => 'Linha de comando',
+ 'MailProgramsRestore' => 'Restaurar padrões',
+ 'MailProgramsAdd' => 'Adicionar um programa',
+ 'MailProgramsInstructions' => 'Na linha de comandos, algumas substituições são feitas:
+ %f será sustituído pelo e-mail do usuário.
+ %t será sustituído pelo e-mail do destinatario.
+ %s será sustituído pelo assunto da mensagem.
+ %b será sustituído pelo corpo da mensagem.',
+
+ 'BookmarksBookmarks' => 'Favoritos',
+ 'BookmarksFolder' => 'Pastas',
+ 'BookmarksLabel' => 'Nome',
+ 'BookmarksPath' => 'Caminho',
+ 'BookmarksNewFolder' => 'Nova pasta',
+
+ 'AdvancedSearchType' => 'Tipo de busca',
+ 'AdvancedSearchTypeAnd' => 'Itens que cumpram todos os critérios', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Itens que cumpram pelo menos um critério', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Critério',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/README b/lib/gcstar/GCLang/README
new file mode 100644
index 0000000..13c4fb3
--- /dev/null
+++ b/lib/gcstar/GCLang/README
@@ -0,0 +1,42 @@
+About Translations
+------------------
+
+GCstar translations are stored in seperate folders off the lib/gcstar/GCLang folder. Inside each language folder should be a file named GCstar.pm, and three subfolders: GCExport, GCImport and GCModels. The file GCstar.pm stores most of the common translations for the program. GCExport and GCImport are used for translations for the export and import plugins respectively, and GCModels stores translations for each individual model type (together with a file GCgeneric.pm, which is used for user-created collections types).
+
+Since version 1.5.0, a system for model-dependant strings was introduced. Some of the language strings are modified run-time to include the model-specific item type. Inside these strings, any strings contained in {}'s will be replaced by the corresponding string from the Item collection in the model language file. A good example is in the english translations, where each file in the GCModels folder contains an item collection similar to:
+ Items => {0 => 'Movie',
+ 1 => 'Movie',
+ X => 'Movies',
+ lowercase1 => 'movie',
+ lowercaseX => 'movies'
+ },
+
+Within model-dependant strings, gcstar will replace any instances of strings like {lowercase1} with the corresponding string from the model file. For example,
+'MenuLend' => 'Display _Borrowed {X}', will be converted to 'Display _Borrowed Movies' when a GCfilms model is loaded.
+'NewItemTooltip' => 'Add a new {lowercase1}', will be converted to 'Add a new movie'.
+
+A more complex example is the spanish language translation, where the items collection follows the pattern:
+ Items => {0 => 'Libro',
+ 1 => 'Libro',
+ lowercase1 => 'libro',
+ X => 'Libros',
+ lowercaseX => 'libros',
+ P1 => 'El Libro',
+ lowercaseP1 => 'el libro',
+ U1 => 'Un Libro',
+ lowercaseU1 => 'un libro',
+ AP1 => 'Al Libro',
+ lowercaseAP1 => 'al libro',
+ DP1 => 'Del Libro',
+ lowercaseDP1 => 'del libro',
+ PX => 'Los Libros',
+ lowercasePX => 'los libros',
+ E1 => 'Este Libro',
+ lowercaseE1 => 'este libro',
+ EX => 'Estos Libros',
+ lowercaseEX => 'estos libros'
+ },
+
+In this case, the string 'RemoveConfirm' => '¿Realmente quiere eliminar {lowercaseE1}?' will be converted to '¿Realmente quiere eliminar este libro?'.
+
+You can use these model-specific codes in any string marked by a "Accepts model codes" comment.
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..3753e8c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RO::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Include numele câmpurilor în partea superioară',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'ÃŽnlocuieÅŸte separatorul cu',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9dccf1d
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RO::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..4a62051
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::RO::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'FoloseÅŸte Javascript',
+ 'FileTemplate' => 'Åžablon :',
+ 'Preview' => 'Previzualizare',
+ 'NoPreview' => 'Previzualizare nedisponibilă',
+ 'Title' => 'Titlu pagină',
+ 'InfoFile' => 'Lista de filme este în fişierul: ',
+ 'InfoDir' => 'Imaginile sunt în: ',
+ 'HeightImg' => 'Înălţimea (în pixeli) a imaginilor exportate: ',
+ 'OpenFileInBrowser' => 'Deschide fişierul generat într-un navigator web',
+ 'Note' => 'Listă generată de către <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Introduceţi textul pentru căutare',
+ 'SearchType1' => 'Doar titlul',
+ 'SearchType2' => 'Informaţii complete',
+ 'SearchButton' => 'Caută',
+ 'SearchTitle' => 'Afişează doar filmele ce se potrivesc criteriului precedent',
+ 'AllButton' => 'Toate',
+ 'AllTitle' => 'Afişează toate filmele',
+ 'Expand' => 'Extinde tot',
+ 'ExpandTitle' => 'Afişează toate informaţiile filmelor',
+ 'Collapse' => 'Restrânge tot',
+ 'CollapseTitle' => 'Ascunde informaţiile filmelor',
+ 'Borrowed' => 'Împrumutat de către: ',
+ 'NotBorrowed' => 'Disponibil',
+ 'Top' => 'Sus',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..2571c5a
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RO::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..fa65f3c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RO::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Include instrucţiuni DROP',
+ 'WithCreate' => 'Include instrucţiuni CREATE',
+ 'TableName' => 'Nume tabel',
+ 'InfoFile' => 'FiÅŸier SQL: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..ea231aa
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RO::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Arhiva este în fişierul: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..b4fe21e
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::RO::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'FiÅŸier ÅŸablon',
+ 'ModelText' => 'Åžablon text',
+ 'Models' => 'Åžablonul folosit',
+ 'UseFile' => 'FoloseÅŸte fiÅŸier',
+ 'UseModel' => 'FoloseÅŸte zona de text',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..37b47cf
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::RO::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Unde ar trebui să caute',
+ 'Default' => 'Directorul implicit pentru Alexandria',
+ 'Specified' => 'Directorul specificat mai jos',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d912392
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RO::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignoră prima linie',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Situl folosit',
+ 'UseFirst' => 'Selectaţi primul în caz de prea multe rezultate',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..a83715c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RO::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..4ac4341
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RO::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copiază imaginile',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportList.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportList.pm
new file mode 100644
index 0000000..591cf2f
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RO::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Listă titluri',
+ 'Plugin' => 'Situl folosit',
+ 'UseFirst' => 'Selectaţi primul în caz de prea multe rezultate',
+ 'CommentAuto' => 'Film importat automat.',
+ 'CommentSite' => 'Sit web: ',
+ 'CommentTitle' => 'Titlu: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..9d5155f
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RO::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..8a39d84
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RO::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Fişierul nu este o colecţie video Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..199d288
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::RO::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..735a4f3
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RO::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..ea32d12
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::RO::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de jocuri de masă',
+ Items => {0 => 'Joc',
+ 1 => 'Joc',
+ X => 'Jocuri'},
+ NewItem => 'Joc nou',
+
+ Id => 'Id',
+ Name => 'Nume',
+ Original => 'Nume original',
+ Box => 'Imagine cutie',
+ DesignedBy => 'Conceput de',
+ PublishedBy => 'Publicat de',
+ Players => 'Număr de jucători',
+ PlayingTime => 'Durată joc',
+ SuggestedAge => 'Vârstă sugerată',
+ Released => 'Lansat',
+ Description => 'Descriere',
+ Category => 'Categorie',
+ Mechanics => 'Mecanică',
+ ExpandedBy => 'Extins de',
+ ExpansionFor => 'Extindere la',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Pagină web',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Conţinut complet',
+ Copies => 'No. of copies',
+ Condition => 'Condiţie',
+ Photos => 'Imagini',
+ Photo1 => 'Prima imagine',
+ Photo2 => 'A doua imagine',
+ Photo3 => 'A treia imagine',
+ Photo4 => 'A patra imagine',
+ Comments => 'Comentarii',
+
+ Perfect => 'Perfect',
+ Good => 'Bun',
+ Average => 'Mediu',
+ Poor => 'Slab',
+
+ CompleteYes => 'Conţinut complet',
+ CompleteNo => 'Piese lipsă',
+
+ General => 'General',
+ Details => 'Detalii',
+ Personal => 'Personal',
+ Information => 'Informaţii',
+
+ FilterRatingSelect => 'Evaluat la cel _puţin...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCbooks.pm b/lib/gcstar/GCLang/RO/GCModels/GCbooks.pm
new file mode 100644
index 0000000..d8a5ff3
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RO::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de cărţi',
+ Items => 'Cărţi',
+ NewItem => 'Carte nouă',
+
+ Isbn => 'ISBN',
+ Title => 'Tilu',
+ Cover => 'Copertă',
+ Authors => 'Autori',
+ Publisher => 'Editură',
+ Publication => 'Dată editare',
+ Language => 'Limbă',
+ Genre => 'Gen',
+ Serie => 'Colecţie',
+ Rank => 'Poziţie',
+ Bookdescription => 'Descriere',
+ Pages => 'Pagini',
+ Read => 'Citită',
+ Acquisition => 'Dată cumpărare',
+ Edition => 'Ediţie',
+ Format => 'Format',
+ Comments => 'Comentarii',
+ Url => 'Pagina web',
+ Translator => 'Traducător',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Detalii',
+
+ ReadNo => 'Necitită',
+ ReadYes => 'Citită',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCcoins.pm b/lib/gcstar/GCLang/RO/GCModels/GCcoins.pm
new file mode 100644
index 0000000..5800e6a
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCcoins.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::RO::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie numismatică',
+ Items => 'Monezi',
+ NewItem => 'Monedă nouă',
+
+ Name => 'Nume',
+ Country => 'Ţară',
+ Year => 'An',
+ Currency => 'Monedă',
+ Value => 'Valoare',
+ Picture => 'Imagine principală',
+ Diameter => 'Diametru',
+ Metal => 'Metal',
+ Edge => 'Muchie',
+ Edge1 => 'Muchie 1',
+ Edge2 => 'Muchie 2',
+ Edge3 => 'Muchie 3',
+ Edge4 => 'Muchie 4',
+ Head => 'Cap',
+ Tail => 'Pajură',
+ Comments => 'Comentarii',
+ History => 'Istoric',
+ Website => 'Sit web',
+ Estimate => 'Estimare',
+ References => 'Referinţe',
+ Type => 'Tip',
+ Coin => 'Monedă',
+ Banknote => 'Bancnotă',
+
+ Main => 'Principal',
+ Description => 'Descriere',
+ Other => 'Alte informaţii',
+ Pictures => 'Imagini',
+
+ Condition => 'Condiţie (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCcomics.pm b/lib/gcstar/GCLang/RO/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d7fee2c
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::RO::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCfilms.pm b/lib/gcstar/GCLang/RO/GCModels/GCfilms.pm
new file mode 100644
index 0000000..6503f40
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::RO::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie filme',
+ Items => 'Filme',
+ NewItem => 'Film nou',
+
+
+ Id => 'Id',
+ Title => 'Titlu',
+ Date => 'Dată',
+ Time => 'Durată',
+ Director => 'Regizor',
+ Country => 'Ţară',
+ MinimumAge => 'Vârstă minimă',
+ Genre => 'Gen',
+ Image => 'Imagine',
+ Original => 'Titlu original',
+ Actors => 'Distribuţie',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Comentarii',
+ Synopsis => 'Rezumat',
+ Seen => 'Vizionat',
+ Number => 'Numărul',
+ Format => 'Mediu',
+ Region => 'Region',
+ Identifier => 'Identificator',
+ Url => 'Web',
+ Audio => 'Audio',
+ Video => 'Format video',
+ Trailer => 'FiÅŸier video',
+ Serie => 'Colecţie',
+ Rank => 'Poziţie',
+ Subtitles => 'Subtitrări',
+
+ SeenYes => 'Vizionat',
+ SeenNo => 'Nevizionat',
+
+ AgeUnrated => 'Neevaluat',
+ AgeAll => 'Toate vârstele',
+ AgeParent => 'Acord parental',
+
+ Main => 'Elemente principale',
+ General => 'General',
+ Details => 'Detalii',
+
+ Information => 'Informaţii',
+ Languages => 'Limbi',
+ Encoding => 'Codare',
+
+ FilterAudienceAge => 'Vârstă public',
+ FilterSeenNo => '_Nevizionat',
+ FilterSeenYes => '_Deja vizionat',
+ FilterRatingSelect => 'Evaluat la cel _puţin...',
+
+ ExtractSize => 'Mărime',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCgames.pm b/lib/gcstar/GCLang/RO/GCModels/GCgames.pm
new file mode 100644
index 0000000..13d0a40
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::RO::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de jocuri video',
+ Items => 'Jocuri',
+ NewItem => 'Joc nou',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Nume',
+ Platform => 'Platformă',
+ Players => 'Număr de jucători',
+ Released => 'Dată lansare',
+ Editor => 'Editor',
+ Developer => 'Dezvoltator',
+ Genre => 'Gen',
+ Box => 'Imagine cutie',
+ Case => 'Carcasă',
+ Manual => 'Manual de instrucţiuni',
+ Completion => 'Completat (%)',
+ Executable => 'Executabil',
+ Description => 'Descriere',
+ Codes => 'Coduri',
+ Code => 'Cod',
+ Effect => 'Efecte',
+ Secrets => 'Secrete',
+ Screenshots => 'Capturi ecran',
+ Screenshot1 => 'Prima captura de ecran',
+ Screenshot2 => 'A doua captură de ecran',
+ Comments => 'Comentarii',
+ Url => 'Pagină web',
+ Unlockables => 'Deblocări',
+ Unlockable => 'Nu poate fi deblocat',
+ Howto => 'Cum se deblochează',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Detalii',
+ Tips => 'Ponturi',
+ Information => 'Informaţii',
+
+ FilterRatingSelect => 'Evaluat la cel _puţin...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..3b46b2b
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RO::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCminicars.pm b/lib/gcstar/GCLang/RO/GCModels/GCminicars.pm
new file mode 100644
index 0000000..84f9c85
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::RO::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCmusics.pm b/lib/gcstar/GCLang/RO/GCModels/GCmusics.pm
new file mode 100644
index 0000000..55da50e
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::RO::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de muzică',
+ Items => 'Albume',
+ NewItem => 'Album nou',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titlu',
+ Cover => 'Copertă',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Durată',
+ Release => 'Dată lansare',
+ Genre => 'Gen',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Listă piese',
+ Number => 'Număr',
+ Track => 'Titlu',
+ Time => 'Durată',
+
+ Composer => 'Compozitor',
+ Producer => 'Producător',
+ Playlist => 'Listă de redare',
+ Comments => 'Comentarii',
+ Label => 'Etichetă',
+ Url => 'Pagină web',
+
+ General => 'General',
+ Details => 'Detalii',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..b9297d7
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::RO::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..f0196bd
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::RO::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..30638f3
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::RO::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCstamps.pm b/lib/gcstar/GCLang/RO/GCModels/GCstamps.pm
new file mode 100644
index 0000000..3968651
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::RO::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCModels/GCwines.pm b/lib/gcstar/GCLang/RO/GCModels/GCwines.pm
new file mode 100644
index 0000000..2b9c37d
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::RO::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Colecţie de vinuri',
+ Items => 'Vinuri',
+ NewItem => 'Vin nou',
+
+ Name => 'Nume',
+ Designation => 'Destinaţie',
+ Vintage => 'Recoltă',
+ Vineyard => 'Podgorie',
+ Type => 'Tip',
+ Grapes => 'Struguri',
+ Soil => 'Sol',
+ Producer => 'Producător',
+ Country => 'Ţară',
+ Volume => 'Volum (ml)',
+ Alcohol => 'Alcool (%)',
+ Medal => 'Medalii/Premii',
+
+ Storage => 'Depozitare',
+ Location => 'Locaţie',
+ ShelfIndex => 'Index',
+ Quantity => 'Cantitate',
+ Acquisition => 'Achiziţie',
+ PurchaseDate => 'Dată cumpărare',
+ PurchasePrice => 'Preţ cumpărare',
+ Gift => 'Cadou',
+ BottleLabel => 'Etichetă sticlă',
+ Website => 'Referinţe pe web',
+
+ Tasted => 'Degustat',
+ Comments => 'Comentarii',
+ Serving => 'Porţie',
+ TastingField => 'Note testare',
+
+ General => 'General',
+ Details => 'Detalii',
+ Tasting => 'Degustare',
+
+ TastedNo => 'Nu a fost degustat',
+ TastedYes => 'Degustat',
+
+ FilterRange => 'Limite',
+ FilterTastedNo => '_Nu a fost încă degustat',
+ FilterTastedYes => 'Deja _degustat',
+ FilterRatingSelect => 'Evaluat la cel _puţin...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RO/GCstar.pm b/lib/gcstar/GCLang/RO/GCstar.pm
new file mode 100644
index 0000000..94fbb4a
--- /dev/null
+++ b/lib/gcstar/GCLang/RO/GCstar.pm
@@ -0,0 +1,672 @@
+{
+ package GCLang::RO;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Română',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Atenţie</b>:
+
+Informaţiile transferate de pe siturile web (prin intermediul
+modulelor de căutare) sunt <b>doar pentru uz personal</b>.
+
+Orice redistribuire este interzisă fără <b>autorizarea
+explicită</b> a sitului web.
+
+Pentru a determina ce sit web este proprietarul informaţiei,
+puteţi folosi <b>butonul aflat sub detaliile filmului</b>.',
+
+ 'AllItemsFiltered' => 'Nici un element nu se potriveşte criteriilor dumneavoastră de filtrare', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instalare în ',
+ 'InstallMandatory' => 'Componente obligatorii',
+ 'InstallOptional' => 'Componente opţionale',
+ 'InstallErrorMissing' => 'Eroare : Următoarele componente Perl trebuie instalate: ',
+ 'InstallPrompt' => 'Directorul principal pentru instalare [/usr/local]: ',
+ 'InstallEnd' => 'Sfârşitul instalării',
+ 'InstallNoError' => 'Nici o eroare',
+ 'InstallLaunch' => 'Pentru a folosi acestă aplicaţie, se poate porni ',
+ 'InstallDirectory' => 'Directorul principal',
+ 'InstallTitle' => 'Instalare GCstar',
+ 'InstallDependencies' => 'Dependinţe',
+ 'InstallPath' => 'Cale',
+ 'InstallOptions' => 'Opţiuni',
+ 'InstallSelectDirectory' => 'Selectaţi directorul principal pentru instalare',
+ 'InstallWithClean' => 'Şterge fişierele aflate în directorul de instalare',
+ 'InstallWithMenu' => 'Adaugă GCstar la meniul Aplicaţii',
+ 'InstallNoPermission' => 'Eroare: Nu aveţi permisiunile necesare pentru a scrie în directorul selectat',
+ 'InstallMissingMandatory' => 'Dependinţe esenţiale lipsesc. Nu veţi putea instala GCstar până când acestea nu vor fi prezente pe sistemul dumneavoastră.',
+ 'InstallMissingOptional' => 'Unele dependinţe opţionale lipsesc. Acestea sunt listate mai jos. GCstar poate fi instalat dar unele facilităţi ar putea să nu fie disponibile.',
+ 'InstallMissingNone' => 'Toate dependinţele sunt satisfăcute. Puteţi continua cu instalarea GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Lipsă',
+ 'InstallMissingFor' => 'Lipsă pentru',
+ 'InstallCleanDirectory' => 'Åžterg fiÅŸierele GCstar din directorul: ',
+ 'InstallCopyDirectory' => 'Copiez fişierele în directorul: ',
+ 'InstallCopyDesktop' => 'Copiez fişierul desktop ‪în: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy-ul folosit (apăsaţi enter dacă nu e nevoie de unul): ',
+ 'UpdateNoPermission' => 'Nu există permsiuni pentru scriere în acest director: ',
+ 'UpdateNone' => 'Nici o actualizare nu a fost găsită',
+ 'UpdateFileNotFound' => 'Fişierul nu a fost găsit',
+
+#Splash
+ 'SplashInit' => 'Iniţializare',
+ 'SplashLoad' => 'Încărcare colecţie',
+ 'SplashDisplay' => 'Afişare colecţie',
+ 'SplashSort' => 'Sortare colecţie',
+ 'SplashDone' => 'Gata',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Se pare că foloseaţi GCfilms anterior. Ce doriţi să importaţi din GCfilms în GCstar (nu va influeţa GCfilms în cazul în care încă îl mai folosiţi)?',
+ 'GCfilmsImportOptions' => 'Setări',
+ 'GCfilmsImportData' => 'Listă filme',
+
+#Menus
+ 'MenuFile' => '_FiÅŸier',
+ 'MenuNewList' => 'Colecţie _nouă',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => 'Colecţii _recente',
+ 'MenuLend' => 'Afişează elementele î_mprumutate', # Accepts model codes
+ 'MenuImport' => '_Importă',
+ 'MenuExport' => '_Exportă',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Editare',
+ 'MenuDuplicate' => '_Duplică element', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => 'Åž_terge element', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => 'S_chimbă câmpurile colecţiei',
+ 'MenuEditLockItems' => 'B_lochează colecţia',
+
+ 'MenuDisplay' => 'F_iltrare',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'Căutare a_vansată',
+ 'MenuViewAllItems' => 'Afişează to_ate elementele', # Accepts model codes
+ 'MenuNoFilter' => '_Oricare',
+
+ 'MenuConfiguration' => '_Setări',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Informaţii afişate',
+ 'MenuBorrowers' => '_Persoane care au împrumutat',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Conversie gen',
+
+ 'MenuBookmarks' => '_Colecţiile mele',
+ 'MenuBookmarksAdd' => '_Adaugă colecţia curentă',
+ 'MenuBookmarksEdit' => '_Editează colecţiile favorite',
+
+ 'MenuHelp' => '_Ajutor',
+ 'MenuHelpContent' => '_Ajutor',
+ 'MenuAllPlugins' => 'Arată _modulele',
+ 'MenuBugReport' => 'Raportează un _bug',
+ 'MenuAbout' => '_Despre GCstar',
+
+ 'MenuNewWindow' => 'Afişează elementul în fereastră _nouă', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Desfă tot',
+ 'ContextCollapseAll' => 'Strânge tot',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Vă rugăm introduceţi o valoare',
+
+ 'RemoveConfirm' => 'Sunteţi sigur că doriţi să ştergeţi acest element?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Element nou', # Accepts model codes
+ 'NewItemTooltip' => 'Adaugă un element nou', # Accepts model codes
+ 'NoItemFound' => 'Nu a fost găsit nimic. Doriţi să căutaţi pe alt sit?',
+ 'OpenList' => 'Vă rugăm selectaţi colecţia',
+ 'SaveList' => 'Vă rugăm alegeţi unde să salvaţi colecţia',
+ 'SaveListTooltip' => 'Salvează colecţia curentă',
+ 'SaveUnsavedChanges' => 'Aveţi modificări nesalvate în colecţia dumneavoastră. Doriţi să le salvaţi?',
+ 'SaveDontSave' => 'Nu salva',
+ 'PreferencesTooltip' => 'Setaţi preferinţele dumneavoastră',
+ 'ViewTooltip' => 'Schimbă afişarea colecţiei',
+ 'PlayTooltip' => 'Redă fişierul video asociat acestui element', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Salvez...',
+ 'StatusLoad' => 'ÃŽncarc...',
+ 'StatusSearch' => 'Căutare în curs...',
+ 'StatusGetInfo' => 'Obţin informaţiile...',
+ 'StatusGetImage' => 'Obţin imaginea...',
+
+ 'SaveError' => 'Nu am putut salva lista de elemente. Vă rugăm verificaţi drepturile de acces şi spaţiul liber pe disc.',
+ 'OpenError' => 'Nu am putut deschide lista de elemente. Vă rugăm verificaţi drepturile de acces.',
+ 'OpenFormatError' => 'Nu am putut deschide lista de elemente.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Directorul selectat pentru a salva imaginile nu este corect. Vă rugăm selectaţi alt director.',
+ 'OptionsCreationError'=> 'Nu pot crea fişierul de opţiuni: ',
+ 'OptionsOpenError'=> 'Nu pot deschide fişierul de opţiuni: ',
+ 'OptionsSaveError'=> 'Nu pot salva fişierul de opţiuni: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Ce să vedem în acestă seară?',
+ 'RandomError'=> 'Nu aveţi nici un element care să poate fi selectat', # Accepts model codes
+ 'RandomEnd'=> 'Nu mai sunt alte elemente', # Accepts model codes
+ 'RandomNextTip'=> 'Următoarea sugestie',
+ 'RandomOkTip'=> 'Acceptă acest element',
+
+ 'AboutTitle' => 'Despre GCstar',
+ 'AboutDesc' => 'Manager de colecţii',
+ 'AboutVersion' => 'Versiune',
+ 'AboutTeam' => 'Echipa',
+ 'AboutWho' => 'Christian Jodar (Tian): Manager de proiect, programator
+Nyall Dawson (Zombiepig) : Programator
+TPF : Programator
+Adolfo González : Programator
+',
+ 'AboutLicense' => 'Distribuit în termenii licenţei GNU GPL
+Copyright logo le Spektre',
+ 'AboutTranslation' => 'Traducerea în română de către Mugurel Tudor',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo şi design web de către le Spektre',
+
+ 'ToolbarRandom' => 'ÃŽn seara asta',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Selectaţi un tip de colecţie',
+ 'ModelsPersonal' => 'Modele personale',
+ 'ModelsDefault' => 'Modele implicite',
+ 'ModelsList' => 'Definire colecţie',
+ 'ModelSettings' => 'Setări colecţie',
+ 'ModelNewType' => 'Nou tip de colecţie',
+ 'ModelName' => 'Numele tipului de colecţie:',
+ 'ModelFields' => 'Câmpuri',
+ 'ModelOptions' => 'Opţiuni',
+ 'ModelFilters' => 'Filtre',
+ 'ModelNewField' => 'Câmp nou',
+ 'ModelFieldInformation' => 'Informaţii',
+ 'ModelFieldName' => 'Etichetă:',
+ 'ModelFieldType' => 'Tip:',
+ 'ModelFieldGroup' => 'Grup:',
+ 'ModelFieldValues' => 'Valori',
+ 'ModelFieldInit' => 'Implicit:',
+ 'ModelFieldMin' => 'Minim:',
+ 'ModelFieldMax' => 'Maxim:',
+ 'ModelFieldList' => 'Listă valori:',
+ 'ModelFieldListLegend' => '<i>Separare prin virgulă</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Text scurt',
+ 'ModelFieldTypeLongText' => 'Text lung',
+ 'ModelFieldTypeYesNo' => 'Da/Nu',
+ 'ModelFieldTypeNumber' => 'Număr',
+ 'ModelFieldTypeDate' => 'Dată',
+ 'ModelFieldTypeOptions' => 'Listă predefinită de valori',
+ 'ModelFieldTypeImage' => 'Imagine',
+ 'ModelFieldTypeSingleList' => 'Listă simplă',
+ 'ModelFieldTypeFile' => 'FiÅŸier',
+ 'ModelFieldTypeFormatted' => 'Depinde de alte câmpuri',
+ 'ModelFieldParameters' => 'Parametri',
+ 'ModelFieldHasHistory' => 'FoloseÅŸte un istoric',
+ 'ModelFieldFlat' => 'AfiÅŸare pe o linie',
+ 'ModelFieldStep' => 'Pas de incrementare:',
+ 'ModelFieldFileFormat' => 'Format fiÅŸier:',
+ 'ModelFieldFileFile' => 'FiÅŸier simplu',
+ 'ModelFieldFileImage' => 'Imagine',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Câmpuri folosite',
+ 'ModelOptionsFieldsAuto' => 'Automat',
+ 'ModelOptionsFieldsNone' => 'Nici unul',
+ 'ModelOptionsFieldsTitle' => 'Ca titlu',
+ 'ModelOptionsFieldsId' => 'Ca identificator',
+ 'ModelOptionsFieldsCover' => 'Ca şi copertă',
+ 'ModelOptionsFieldsPlay' => 'Pentru butonul de redare',
+ 'ModelCollectionSettings' => 'Setări colecţie',
+ 'ModelCollectionSettingsLending' => 'Elementele pot fi împrumutate',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Ar trebui să apară în fereastra de căutare',
+ 'ModelFilterComparison' => 'Comparaţie',
+ 'ModelFilterContain' => 'Conţine',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Domeniu',
+ 'ModelFilterNumeric' => 'Comparaţia e numerică',
+ 'ModelFilterQuick' => 'Creaţi un filtru rapid',
+ 'ModelTooltipName' => 'Folosiţi un nume pentru a reutiliza acest model pentru mai multe colecţii. Dacă este gol, setările vor fi stocate direct în colecţie',
+ 'ModelTooltipLabel' => 'Numele câmpului aşa cum va fi afişat',
+ 'ModelTooltipGroup' => 'Folosit pentru a grupa câmpurile. Elementele care nu au o valoare aici vor fi într-un grup implicit',
+ 'ModelTooltipHistory' => 'Dacă elementele introduse anterior vor fi stocate într-o listă asociată acestui câmp',
+ 'ModelTooltipFormat' => 'Acest format este folosit pentru a determina acţiunea de a deschide un fişier cu butonul de Redare',
+ 'ModelTooltipLending' => 'Aceasta va adăuga unele câmpuri pentru a gestiona împrumuturile',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Dacă valorile trebuie considerate ca numere în comparaţii',
+ 'ModelTooltipQuick' => 'Aceasta va adăuga un submeniu la Filtre',
+
+ 'ResultsTitle' => 'Selectaţi un element', # Accepts model codes
+ 'ResultsNextTip' => 'Caută pe următorul sit',
+ 'ResultsPreview' => 'Previzualizare',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Preferinţe',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Navigator web',
+ 'OptionsPlayer' => 'Player video',
+ 'OptionsAudio' => 'Player audio',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Director de imagini',
+ 'OptionsUseRelativePaths' => 'Foloseşte căi relative pentru imagini',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Afişează bara de status',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Atenţie: Modificările din acest tab nu vor avea efect decât după repornirea aplicaţiei.',
+ 'OptionsRemoveConfirm' => 'Cere o confirmare înainte de ştergerea elementului',
+ 'OptionsAutoSave' => 'Salvează colecţia automat',
+ 'OptionsAutoLoad' => 'Încarcă colecţia anterioară la pornire',
+ 'OptionsSplash' => 'Afişează ecranul de pornire',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Selectaţi programul ce va fi folosit',
+ 'OptionsPlugins' => 'Situl de la care se vor obţine informaţiile',
+ 'OptionsAskPlugins' => 'Întreabă (toate siturile)',
+ 'OptionsPluginsMulti' => 'Multe situri',
+ 'OptionsPluginsMultiAsk' => 'Întreabă (multe situri)',
+ 'OptionsPluginsMultiPerField' => 'Multe situri (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Setează lista',
+ 'OptionsAskImport' => 'Selectează câmpurile ce vor fi importate',
+ 'OptionsProxy' => 'FoloseÅŸte un proxy',
+ 'OptionsCookieJar' => 'FoloseÅŸte acest fiÅŸier cookie',
+ 'OptionsLang' => 'Limbă',
+ 'OptionsMain' => 'Principal',
+ 'OptionsPaths' => 'Căi',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Facilităţi',
+ 'OptionsDisplay' => 'AfiÅŸare',
+ 'OptionsToolbar' => 'Bară de unelte',
+ 'OptionsToolbars' => {0 => 'Fără', 1 => 'Mică', 2 => 'Mare', 3 => 'Setări sistem'},
+ 'OptionsToolbarPosition' => 'Poziţie',
+ 'OptionsToolbarPositions' => {0 => 'Sus', 1 => 'Jos', 2 => 'Stânga', 3 => 'Dreapta'},
+ 'OptionsExpandersMode' => 'Desfăsurători prea lungi',
+ 'OptionsExpandersModes' => {'asis' => 'Ignoră', 'cut' => 'Taie', 'wrap' => 'Rupe linia'},
+ 'OptionsDateFormat' => 'Format dată',
+ 'OptionsDateFormatTooltip' => 'Formatul este cel folosit de strftime(3). Implicit este %d/%m/%Y.',
+ 'OptionsView' => 'AfiÅŸare',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Imagine', 2 => 'Detalii'},
+ 'OptionsColumns' => 'Coloane',
+ 'OptionsMailer' => 'Trimitere email',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Email-ul dumneavoastră',
+ 'OptionsTransform' => 'Plasează articolele la sfârşitul titlurilor',
+ 'OptionsArticles' => 'Articole (separate prin virgulă)',
+ 'OptionsSearchStop' => 'Permite întreruperea căutărilor',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Foloseşte titlul principal ca titlu original în cazul în care acesta nu este prezent',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Mărime istoric',
+ 'OptionsClearHistory' => 'Åžterge istoricul',
+ 'OptionsStyle' => 'Temă',
+ 'OptionsDontAsk' => 'Nu mai întreba din nou',
+ 'OptionsPathProgramsGroup' => 'Aplicaţii',
+ 'OptionsProgramsSystem' => 'FoloseÅŸte programele definite de sistem',
+ 'OptionsProgramsUser' => 'FoloseÅŸte programele specificate',
+ 'OptionsProgramsSet' => 'Setare programe',
+ 'OptionsPathImagesGroup' => 'Imagini',
+ 'OptionsInternetDataGroup' => 'Importare date',
+ 'OptionsInternetSettingsGroup' => 'Setări',
+ 'OptionsDisplayInformationGroup' => 'Afişare informaţii',
+ 'OptionsDisplayArticlesGroup' => 'Articole',
+ 'OptionsImagesDisplayGroup' => 'AfiÅŸare',
+ 'OptionsImagesStyleGroup' => 'Stil',
+ 'OptionsDetailedPreferencesGroup' => 'Preferinţe',
+ 'OptionsFeaturesConveniencesGroup' => 'Convenţii',
+ 'OptionsPicturesFormat' => 'Prefix folosit pentru imagini:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titlul sau numele elementului asociat',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% sau . va fi înlocuit cu directorul colecţiei (folosiţi doar pentru începutul căilor)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% va fi înlocuit de numele fişierului de colecţie fără sufix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% poate fi folosit doar la începutul căii pentru imagini',
+ 'OptionsConfigureMailers' => 'Configurează aplicaţiile pentru mail',
+
+ 'ImagesOptionsButton' => 'Setări',
+ 'ImagesOptionsTitle' => 'Setări pentru lista de imagini',
+ 'ImagesOptionsSelectColor' => 'Selectaţi o culoare',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Fundal',
+ 'ImagesOptionsBgPicture' => 'FoloseÅŸte o imagine de fundal',
+ 'ImagesOptionsFg'=> 'Selecţie',
+ 'ImagesOptionsBgTooltip' => 'Schimbă culoarea pentru fundal',
+ 'ImagesOptionsFgTooltip'=> 'Schimbă culoarea pentru selecţie',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Mărime',
+ 'ImagesOptionsSizeList' => {0 => 'Foarte mică', 1 => 'Mică', 2 => 'Medie', 3 => 'Mare', 4 => 'Foarte mare'},
+ 'ImagesOptionsSizeTooltip' => 'Selectaţi mărimea imaginii',
+
+ 'DetailedOptionsTitle' => 'Setări pentru lista detaliată',
+ 'DetailedOptionsImageSize' => 'Mărime imagini',
+ 'DetailedOptionsGroupItems' => 'Grupează elementele după',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Selectează câmpurile afişate',
+ 'DetailedOptionsGroupedFirst' => 'Păstrează împreună elementele orfane',
+ 'DetailedOptionsAddCount' => 'Adaugă numărul elementelor la categorii',
+
+ 'ExtractButton' => 'Informaţii',
+ 'ExtractTitle' => 'Informaţii fişier video',
+ 'ExtractImport' => 'FoloseÅŸte valorile',
+
+ 'FieldsListOpen' => 'Încarcă o listă de câmpuri dintr-un fişier',
+ 'FieldsListSave' => 'Salvează lista de câmpuri într-un fişier',
+ 'FieldsListError' => 'Această listă de fişiere nu poate fi folosită cu acest tip de colecţie',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exportă lista de elemente',
+ 'ExportFilter' => 'Exportă doar elementele afişate',
+ 'ExportFieldsTitle' => 'Câmpurile ce vor fi exportate',
+ 'ExportFieldsTip' => 'Selectaţi câmpurile pe care doriţi să le exportaţi',
+ 'ExportWithPictures' => 'Copiază imaginile într-un subdirector',
+ 'ExportSortBy' => 'Sortare după',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Importă altă listă de elemente',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'FiÅŸier',
+ 'ImportExportFieldsUnused' => 'Câmpuri nefolosite',
+ 'ImportExportFieldsUsed' => 'Câmpuri folosite',
+ 'ImportExportFieldsFill' => 'Adaugă toate',
+ 'ImportExportFieldsClear' => 'Åžterge toate',
+ 'ImportExportFieldsEmpty' => 'Trebuie să alegeţi cel puţin un câmp',
+ 'ImportExportFileEmpty' => 'Trebuie să specificaţi un nume de fişier',
+ 'ImportFieldsTitle' => 'Câmpurile ce vor fi importate',
+ 'ImportFieldsTip' => 'Selectaţi câmpurile pe care le doriţi importate',
+ 'ImportNewList' => 'Creează o nouă colecţie',
+ 'ImportCurrentList' => 'Adaugă la colecţia curentă',
+ 'ImportDropError' => 'A intervenit o eroare la deschiderea a cel puţin unui fişier. Listă precedentă va fi reîncărcată.',
+ 'ImportGenerateId' => 'Generează identificator pentru fiecare element',
+
+ 'FileChooserOpenFile' => 'Vă rugăm selectaţi fişierul pentru folosire',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Selectaţi un director',
+ 'FileChooserOverwrite' => 'Acest fişier deja există. Doriţi să îl suprascrieţi?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Compact',
+ 'PanelReadOnly' => 'Doar pentru citire',
+ 'PanelForm' => 'Taburi',
+
+ 'PanelSearchButton' => 'Obţine informaţii',
+ 'PanelSearchTip' => 'Caută pe web informaţii despre acest titlu',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Clic pe imagine pentru a selecta alta.',
+ 'PanelImageTipView' => 'Clic pe image pentru a o vedea la dimensiunea originală.',
+ 'PanelImageTipMenu' => ' Clic dreapta pentru mai multe opţiuni.',
+ 'PanelImageTitle' => 'Selectaţi o imagine',
+ 'PanelImageNoImage' => 'Nici o imagine',
+ 'PanelSelectFileTitle' => 'Selectaţi un fişier',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restaurează valorile implicite',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'De la',
+ 'PanelTo' =>'Către',
+
+ 'PanelWeb' => 'Mai multe informaţii',
+ 'PanelWebTip' => 'Afişează informaţii de pe web despre acest element', # Accepts model codes
+ 'PanelRemoveTip' => 'Åžterge elementul curent', # Accepts model codes
+
+ 'PanelDateSelect' => 'Selectaţi o dată',
+ 'PanelNobody' => 'Nimeni',
+ 'PanelUnknown' => 'Necunoscut',
+ 'PanelAdded' => 'Adaugă dată',
+ 'PanelRating' => 'Evaluare',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Locaţie',
+
+ 'PanelLending' => 'ÃŽmprumuturi',
+ 'PanelBorrower' => 'ÃŽmprumutat',
+ 'PanelLendDate' => 'Din data',
+ 'PanelHistory' => 'Istoric împrumuturi',
+ 'PanelReturned' => 'Element returnat', # Accepts model codes
+ 'PanelReturnDate' => 'Data returnării',
+ 'PanelLendedYes' => 'ÃŽmprumutat',
+ 'PanelLendedNo' => 'Disponibil',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Nu contează',
+ 'CheckYes' => 'Da',
+ 'CheckNo' => 'Nu',
+
+ 'ToolbarAll' => 'Afişează tot',
+ 'ToolbarAllTooltip' => 'Afişează toate elementele',
+ 'ToolbarGroupBy' => 'Grupează după',
+ 'ToolbarGroupByTooltip' => 'Selectaţi câmpul folosit pentru a grupa elementele din listă',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Cautare elemente',
+ 'PluginsQuery' => 'Interogare',
+ 'PluginsFrame' => 'Sit pentru căutare',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Nume',
+ 'PluginsSearchFields' => 'Câmpuri căutate',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Limbă',
+ 'PluginsUseSite' => 'Foloseşte situl selectat pentru viitoarele căutări',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Configurare împrumuturi',
+ 'BorrowersList' => 'Persoane care au împrumutat',
+ 'BorrowersName' => 'Nume',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Adaugă',
+ 'BorrowersRemove' => 'Åžterge',
+ 'BorrowersEdit' => 'Editează',
+ 'BorrowersTemplate' => 'Åžablon mail',
+ 'BorrowersSubject' => 'Subiect mail',
+ 'BorrowersNotice1' => '%1 va fi înlocuit cu numele celui care a împrumutat',
+ 'BorrowersNotice2' => '%2 va fi înlocuit cu numele filmului',
+ 'BorrowersNotice3' => '%3 va fi înlocuit cu data împrumutului',
+
+ 'BorrowersImportTitle' => 'Importă informaţiile despre cel care a împrumutat',
+ 'BorrowersImportType' => 'Format fiÅŸier:',
+ 'BorrowersImportFile' => 'FiÅŸier:',
+
+ 'BorrowedTitle' => 'Elemente împrumutate', # Accepts model codes
+ 'BorrowedDate' => 'Din data de',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Trimite un email',
+ 'MailFrom' => 'De la: ',
+ 'MailTo' => 'Către: ',
+ 'MailSubject' => 'Subiect: ',
+ 'MailSmtpError' => 'Problemă la conectarea la serverul SMTP',
+ 'MailSendmailError' => 'Problemă la lansarea sendmail',
+
+ 'SearchTooltip' => 'Caută toate elementele', # Accepts model codes
+ 'SearchTitle' => 'Căutare element', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Câmp pentru înlocuire',
+ 'QueryReplaceOld' => 'Numele actual',
+ 'QueryReplaceNew' => 'Noul nume',
+ 'QueryReplaceLaunch' => 'ÃŽnlocuieÅŸte',
+
+ 'ImportWindowTitle' => 'Selectaţi câmpurile pentru import',
+ 'ImportViewPicture' => 'Afişează imaginea',
+ 'ImportSelectAll' => 'Selectează tot',
+ 'ImportSelectNone' => 'Nu selecta nimic',
+
+ 'MultiSiteTitle' => 'Siturile folosite pentru căutări',
+ 'MultiSiteUnused' => 'Module nefolosite',
+ 'MultiSiteUsed' => 'Module ce vor fi folosite',
+ 'MultiSiteLang' => 'Umple lista cu module pentru limba engleză',
+ 'MultiSiteEmptyError' => 'Lista de situri este goală',
+ 'MultiSiteClear' => 'Åžterge lista',
+
+ 'DisplayOptionsTitle' => 'Elemente afiÅŸate',
+ 'DisplayOptionsAll' => 'Selectează tot',
+ 'DisplayOptionsSearch' => 'Buton căutare',
+
+ 'GenresTitle' => 'Conversie gen',
+ 'GenresCategoryName' => 'Genul de folosit',
+ 'GenresCategoryMembers' => 'Genul de înlocuit',
+ 'GenresLoad' => 'Încarcă o listă',
+ 'GenresExport' => 'Salvează lista într-un fişier',
+ 'GenresModify' => 'Editează conversia',
+
+ 'PropertiesName' => 'Nume colecţie',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Proprietar',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Descriere',
+ 'PropertiesFile' => 'Informaţii fişier',
+ 'PropertiesFilePath' => 'Cale completă',
+ 'PropertiesItemsNumber' => 'Număr de elemente', # Accepts model codes
+ 'PropertiesFileSize' => 'Mărime',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Proprietăţi colecţie',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programe pentru trimis mailuri',
+ 'MailProgramsName' => 'Nume',
+ 'MailProgramsCommand' => 'Linie de comandă',
+ 'MailProgramsRestore' => 'Restaurează valorile implicite',
+ 'MailProgramsAdd' => 'Adaugă un progra,',
+ 'MailProgramsInstructions' => 'În linia de comandă, unele înlocuiri sunt făcute:
+ %f este înlocuit cu adresa de mail a utilizatorului.
+ %t este înlocuit cu adresa de mail a destinatarului.
+ %s este înlocuit cu subiectul mesajului.
+ %b este înlocuit cu corpul mesajului.',
+
+ 'BookmarksBookmarks' => 'Favorite',
+ 'BookmarksFolder' => 'Director',
+ 'BookmarksLabel' => 'Etichetă',
+ 'BookmarksPath' => 'Cale',
+ 'BookmarksNewFolder' => 'Dosar nou',
+
+ 'AdvancedSearchType' => 'Tipul de căutare',
+ 'AdvancedSearchTypeAnd' => 'Elemente se potrivesc la toate criteriile', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Elementele se potrivesc la cel puţin un criteriu', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteriu',
+ 'AdvancedSearchAnyField' => 'Orice câmp',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Raportare bug generată de GCstar',
+ 'BugReportVersion' => 'Versiune',
+ 'BugReportPlatform' => 'Sistem de operare',
+ 'BugReportMessage' => 'Mesaj de eroare',
+ 'BugReportInformation' => 'Informaţii adiţionale',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..d45fe36
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RU::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Выключить Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÐµÐ¹ вверху',
+ 'Separator' => 'Разделитель',
+ 'Replacement' => 'Заменить разделитель на',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..3f78a04
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RU::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..ee75e3e
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::RU::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'ИÑпользовать Javascript',
+ 'FileTemplate' => 'Шаблон:',
+ 'Preview' => 'Предварительный проÑмотр',
+ 'NoPreview' => 'Предварительный проÑмотр недоÑтупен',
+ 'Title' => 'Заголовок Ñтраницы',
+ 'InfoFile' => 'СпиÑок фильмов в файле: ',
+ 'InfoDir' => 'Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð²: ',
+ 'HeightImg' => 'Ð’Ñ‹Ñота (в пикÑелах) Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑкÑпорта: ',
+ 'OpenFileInBrowser' => 'Открыть Ñозданый файл в вÑб-браузере',
+ 'Note' => 'СпиÑок Ñгенерирован <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Введите текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка',
+ 'SearchType1' => 'Только заголовок',
+ 'SearchType2' => 'Ð¿Ð¾Ð»Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ',
+ 'SearchButton' => 'ИÑкать',
+ 'SearchTitle' => 'Отобразить только фильмы удовлетворÑющие предыдущему критерию',
+ 'AllButton' => 'Ð’Ñе',
+ 'AllTitle' => 'Отобразить вÑе фильмы',
+ 'Expand' => 'РаÑкрыть вÑе',
+ 'ExpandTitle' => 'Показать информацию вÑех фильмов',
+ 'Collapse' => 'Свернуть вÑе',
+ 'CollapseTitle' => 'Свернуть информацию вÑех фильмоы',
+ 'Borrowed' => 'ВзÑл : ',
+ 'NotBorrowed' => 'ДоÑтупен',
+ 'Top' => 'Ðаверх',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..82b06d7
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::RU::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..a5648c6
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::RU::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Включить DROP инÑтрукцию',
+ 'WithCreate' => 'Включить CREATE инÑтрукцию',
+ 'TableName' => 'Ð˜Ð¼Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ‹',
+ 'InfoFile' => 'SQL Файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..ee69aa9
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RU::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Ðрхив в файле: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..fe5b8d8
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::RU::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Файл шаблона',
+ 'ModelText' => 'ТекÑÑ‚ шаблона',
+ 'Models' => 'ИÑпользовать шаблон',
+ 'UseFile' => 'ИÑпользовать файл',
+ 'UseModel' => 'ИÑпользовать облаÑÑ‚ÑŒ текÑта',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..6a4cc68
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::RU::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Где Ñледует иÑкать',
+ 'Default' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Alexandria по-умолчанию',
+ 'Specified' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..7690988
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RU::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Игнорировать первую Ñтроку',
+ 'Separator' => 'Разделитель',
+ 'Plugin' => 'ИÑпользовать Ñайт',
+ 'UseFirst' => 'Выберите первый (еÑли много результатов)',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..1b7c794
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RU::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..f261058
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RU::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Копировать изображениÑ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportList.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportList.pm
new file mode 100644
index 0000000..015346c
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RU::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'СпиÑок названий',
+ 'Plugin' => 'ИÑпользовать Ñайт',
+ 'UseFirst' => 'Выберите первый (еÑли много результатов)',
+ 'CommentAuto' => 'Фильмы импортированы автоматичеÑки.',
+ 'CommentSite' => 'Ð’ÑбÑайт: ',
+ 'CommentTitle' => 'Ðазвание: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..61689bc
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RU::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..252a37e
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::RU::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Это не Ð²Ð¸Ð´ÐµÐ¾ÐºÐ¾Ð»Ð»ÐµÑ†Ð¸Ñ Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..54e042d
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::RU::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7ae4731
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::RU::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..b291885
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::RU::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCbooks.pm b/lib/gcstar/GCLang/RU/GCModels/GCbooks.pm
new file mode 100644
index 0000000..092b77a
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::RU::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ ÐºÐ½Ð¸Ð³',
+ Items => 'Книги',
+ NewItem => 'ÐÐ¾Ð²Ð°Ñ ÐºÐ½Ð¸Ð³Ð°',
+
+ Isbn => 'ISBN',
+ Title => 'Заголовок',
+ Cover => 'Обложка',
+ Authors => 'Ðвторы',
+ Publisher => 'Издатель',
+ Publication => 'Дата изданиÑ',
+ Language => 'Язык',
+ Genre => 'Жанр',
+ Serie => 'КоллециÑ',
+ Rank => 'Ранг',
+ Bookdescription => 'ОпиÑание',
+ Pages => 'Страниц',
+ Read => 'Прочтено?',
+ Acquisition => 'Дата получениÑ',
+ Edition => 'РедакциÑ',
+ Format => 'Формат',
+ Comments => 'Комментарии',
+ Url => 'Узел ВЭБ',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'Общее',
+ Details => 'Детали',
+
+ ReadNo => 'Ðе прочитано',
+ ReadYes => 'Прочитано',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCcoins.pm b/lib/gcstar/GCLang/RU/GCModels/GCcoins.pm
new file mode 100644
index 0000000..bbaf626
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCcoins.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::RU::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCcomics.pm b/lib/gcstar/GCLang/RU/GCModels/GCcomics.pm
new file mode 100644
index 0000000..a06f194
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::RU::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCfilms.pm b/lib/gcstar/GCLang/RU/GCModels/GCfilms.pm
new file mode 100644
index 0000000..89878d2
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCfilms.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::RU::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñ„Ð¸Ð»ÑŒÐ¼Ð¾Ð²',
+ Items => 'Фильмы',
+ NewItem => 'Ðовый фильм',
+
+
+ Id => 'Идентификатор',
+ Title => 'Ðазвание',
+ Date => 'Дата',
+ Time => 'ДлительноÑÑ‚ÑŒ',
+ Director => 'РежиÑÑÑ‘Ñ€',
+ Country => 'Страна',
+ MinimumAge => 'Минимальный возраÑÑ‚',
+ Genre => 'Жанр',
+ Image => 'Картинка',
+ Original => 'Оригинальный заголовок',
+ Actors => 'Ðктеры',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Комментарии',
+ Synopsis => 'ОпиÑание',
+ Seen => 'ПроÑмотрен',
+ Number => '# ноÑителей',
+ Format => 'ÐоÑитель',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'ВЭБ',
+ Audio => 'Ðудио',
+ Video => 'Видео формат',
+ Trailer => 'Видео файл',
+ Serie => 'КоллециÑ',
+ Rank => 'Ранг',
+ Subtitles => 'Субтитры',
+
+ SeenYes => 'Смотрел',
+ SeenNo => 'Ðе Ñмотрел',
+
+ AgeUnrated => 'Без ограничений',
+ AgeAll => 'Ð”Ð»Ñ _Любого возраÑта',
+ AgeParent => 'Под приÑмотром родителей',
+
+ Main => 'ОÑновное',
+ General => 'Общие',
+ Details => 'Детали',
+ Lending => 'Ðа руках',
+
+ Information => 'ИнформациÑ',
+ Languages => 'Языки',
+ Encoding => 'Кодирование',
+
+ FilterAudienceAge => 'ВозраÑÑ‚ аудитории:',
+ FilterSeenNo => 'Ðет',
+ FilterSeenYes => '_Уже проÑмотрено',
+ FilterRatingSelect => 'По Крайней мере...',
+
+ ExtractSize => 'Размер',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCgames.pm b/lib/gcstar/GCLang/RU/GCModels/GCgames.pm
new file mode 100644
index 0000000..1d68b80
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::RU::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾-игр',
+ Items => 'Игры',
+ NewItem => 'ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð°',
+
+ Id => 'Идентификатор',
+ Ean => 'EAN',
+ Name => 'ИмÑ',
+ Platform => 'Платформа',
+ Players => 'КоличеÑтво игроков',
+ Released => 'Дата выпуÑка',
+ Editor => 'Редактор',
+ Developer => 'Developer',
+ Genre => 'Жанр',
+ Box => 'Ð˜Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ñ€Ð¾Ð±ÐºÐ¸',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Пройдено (%)',
+ Executable => 'Executable',
+ Description => 'ОпиÑание',
+ Codes => 'Коды',
+ Code => 'Код',
+ Effect => 'Эффект',
+ Secrets => 'Секреты',
+ Screenshots => 'Снимки Ñкраны',
+ Screenshot1 => 'Первый Ñнимок',
+ Screenshot2 => 'Второй Ñнимок',
+ Comments => 'Comments',
+ Url => 'ВЭБ Ñтраница',
+ Unlockables => 'БонуÑÑ‹',
+ Unlockable => 'БонуÑÑ‹',
+ Howto => 'Как разблокировать',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Общее',
+ Details => 'Детали',
+ Tips => 'ПодÑказки',
+ Information => 'ИнформациÑ',
+
+ FilterRatingSelect => 'По Крайней мере...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..0058c77
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::RU::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCminicars.pm b/lib/gcstar/GCLang/RU/GCModels/GCminicars.pm
new file mode 100644
index 0000000..78706f2
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::RU::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCmusics.pm b/lib/gcstar/GCLang/RU/GCModels/GCmusics.pm
new file mode 100644
index 0000000..44c7d44
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::RU::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸',
+ Items => 'Ðльбомы',
+ NewItem => 'Ðовый альбом',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Ðазвание',
+ Cover => 'Обложка',
+ Artist => 'ИÑполнитель',
+ Format => 'Формат',
+ Running => 'Ð’Ñ€ÐµÐ¼Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ',
+ Release => 'Дата выпуÑка',
+ Genre => 'Жанр',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'СпиÑок композиций',
+ Number => 'Ðомер',
+ Track => 'Ðазвание',
+ Time => 'ВремÑ',
+
+ Composer => 'Композитор',
+ Producer => 'ПродюÑер',
+ Playlist => 'ПлейлиÑÑ‚',
+ Comments => 'Комментарии',
+ Label => 'Label',
+ Url => 'ВЭБ Ñтраница',
+
+ General => 'Общее',
+ Details => 'Дательно',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..94a4d99
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::RU::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..61b2ae0
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::RU::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..eadce6c
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::RU::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCstamps.pm b/lib/gcstar/GCLang/RU/GCModels/GCstamps.pm
new file mode 100644
index 0000000..16f004b
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::RU::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCModels/GCwines.pm b/lib/gcstar/GCLang/RU/GCModels/GCwines.pm
new file mode 100644
index 0000000..92bded9
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::RU::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/RU/GCstar.pm b/lib/gcstar/GCLang/RU/GCstar.pm
new file mode 100644
index 0000000..28c5ea9
--- /dev/null
+++ b/lib/gcstar/GCLang/RU/GCstar.pm
@@ -0,0 +1,672 @@
+{
+ package GCLang::RU;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Russian',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Предупреждение</b>:
+
+Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶ÐµÐ½Ð½Ð°Ñ Ñ Ð²Ñб-Ñайтов (через плагин поиÑка)
+предназначена только Ð´Ð»Ñ <b>перÑонального</b> иÑпользованиÑ.
+
+Любое её раÑпроÑтранение запрещено без
+<b>ÑоответÑвующего разрешениÑ</b> Ñайта.
+
+Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ что определить какой Ñайт ÑвлÑетÑÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ информации
+вы можете иÑпользоватье <b>кнопку на закладке детальной информации о фильме</b>.',
+
+ 'AllItemsFiltered' => 'Ðет фильмов удовлетворÑющих вашим критериÑм', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'ИнÑталлировать в ',
+ 'InstallMandatory' => 'Ðеобходимые компоненты',
+ 'InstallOptional' => 'Допонительные (необÑзательные) компоненты',
+ 'InstallErrorMissing' => 'Ошибка : Следующие Perl-компонеты должны быть уÑтановлены: ',
+ 'InstallPrompt' => 'Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð»Ñ Ð¸Ð½ÑталлÑции [/usr/local]: ',
+ 'InstallEnd' => 'Конец инÑталлÑции',
+ 'InstallNoError' => 'Без ошибок',
+ 'InstallLaunch' => 'Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ что бы иÑпользоватть Ñто приложение вы можете запуÑтить ',
+ 'InstallDirectory' => 'Ð‘Ð°Ð·Ð¾Ð²Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ',
+ 'InstallTitle' => 'ИнÑталлÑÑ†Ð¸Ñ GCstar',
+ 'InstallDependencies' => 'ЗавиÑимоÑти',
+ 'InstallPath' => 'Путь',
+ 'InstallOptions' => 'Опции',
+ 'InstallSelectDirectory' => 'Выберите базовую директорию Ð´Ð»Ñ Ð¸Ð½ÑталлÑции',
+ 'InstallWithClean' => 'Удалить файлы найденные в директории Ð´Ð»Ñ Ð¸Ð½ÑталлÑции',
+ 'InstallWithMenu' => 'Добавить GCstar в меню Приложений',
+ 'InstallNoPermission' => 'Ошибка : У Ð²Ð°Ñ Ð½ÐµÑ‚ прав на запиÑÑŒ в указанную директорию',
+ 'InstallMissingMandatory' => 'Ðеобходимые завиÑмоÑти не удовлетворены. Ð’Ñ‹ не можете проинÑталлировать GCfilms пока не будут уÑтановлены завиÑимые компоненты.',
+ 'InstallMissingOptional' => 'Ðекоторые из дополнительных компонентов отÑутÑтвуют. Они перечиÑлены ниже. GCfilms может быть проинÑталлированн, но некоторые возможноÑти не будут доÑтупны.',
+ 'InstallMissingNone' => 'Ðе неудовлетворённых завиÑимоÑтей. Ð’Ñ‹ можете продолжить инÑталлÑцию GCfilms',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'ОтÑутÑтвует',
+ 'InstallMissingFor' => 'ОтÑутÑтвует',
+ 'InstallCleanDirectory' => 'Удаление файлов GCstar в директории: ',
+ 'InstallCopyDirectory' => 'КопируютÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ в директорию: ',
+ 'InstallCopyDesktop' => 'КопируютÑÑ Ñ„Ð°Ð¹Ð»Ñ‹ рабочего Ñтола в диреткорию: ',
+
+#Update
+ 'UpdateUseProxy' => 'ИÑпользовать прокÑи-Ñервер (или проÑто нажмите Enter еÑли не нужно): ',
+ 'UpdateNoPermission' => 'Права запиÑи в Ñту директорию отÑутÑтвуют : ',
+ 'UpdateNone' => 'Обновлений не найдены',
+ 'UpdateFileNotFound' => 'Файл не найден',
+
+#Splash
+ 'SplashInit' => 'ИнициализациÑ',
+ 'SplashLoad' => 'ЗагружаетÑÑ',
+ 'SplashDisplay' => 'Отображать коллекцию',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Ð’ÑÑ‘ готово',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'КажетÑÑ Ð²Ñ‹ ранее уже иÑпользовали GCFilms. Что вы хотите импортировать из GCfilms в GCstar (Ñто не затронет приложение GCFilms еÑли Ð’Ñ‹ вÑе ещё захотите потом его иÑпользовать)?',
+ 'GCfilmsImportOptions' => 'УÑтановки',
+ 'GCfilmsImportData' => 'СпиÑок фильмов',
+
+#Menus
+ 'MenuFile' => '_Файл',
+ 'MenuNewList' => '_ÐÐ¾Ð²Ð°Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_ПоÑледние коллеции',
+ 'MenuLend' => 'Показать фильмы на _Руках', # Accepts model codes
+ 'MenuImport' => '_Импорт',
+ 'MenuExport' => '_ЭкÑпорт',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Редактирование',
+ 'MenuDuplicate' => '_Дублировать фильм', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Удалить фильм', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Изменить Ð¿Ð¾Ð»Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ð¸',
+ 'MenuEditLockItems' => '_ЗафикÑировать коллекцию',
+
+ 'MenuDisplay' => '_Фильтр',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'РаÑширенный _ПоиÑк',
+ 'MenuViewAllItems' => 'Показать _ВСЕ фильмы', # Accepts model codes
+ 'MenuNoFilter' => '_Любой',
+
+ 'MenuConfiguration' => '_ÐаÑтройки',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_ÐžÑ‚Ð¾Ð±Ñ€Ð°Ð¶Ð°ÐµÐ¼Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ',
+ 'MenuBorrowers' => '_Должники',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Преобразование жанров',
+
+ 'MenuBookmarks' => 'ÐœÐ¾Ñ _КоллекциÑ',
+ 'MenuBookmarksAdd' => 'Добавить _текущую коллекцию',
+ 'MenuBookmarksEdit' => '_Редактировать закладки коллекций',
+
+ 'MenuHelp' => '_Помощь',
+ 'MenuHelpContent' => '_Помощь',
+ 'MenuAllPlugins' => 'Ð’Ñе подключаемые _модули',
+ 'MenuBugReport' => 'Отправить отчёт об _ошибке',
+ 'MenuAbout' => '_О GCstar',
+
+ 'MenuNewWindow' => 'Показать фильм в _Ðовом Окне', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Развернуть вÑÑ‘',
+ 'ContextCollapseAll' => 'Свернуть вÑÑ‘',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'ПожалуйÑта введите занчение',
+
+ 'RemoveConfirm' => 'Ð’Ñ‹ дейÑтвительно хотите удалить Ñтот фильм?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Ðовый Ñлемент', # Accepts model codes
+ 'NewItemTooltip' => 'Добавить новый фильм', # Accepts model codes
+ 'NoItemFound' => 'Фильм не был найде. Хотите поиÑкать на другом Ñайте?',
+ 'OpenList' => 'ПожалуйÑта выберите коллекцию',
+ 'SaveList' => 'ПожалуйÑта выберите куда Ñохранить коллекцию',
+ 'SaveListTooltip' => 'Сохранить текущую коллекцию',
+ 'SaveUnsavedChanges' => 'Ð’ вашей коллекций еÑÑ‚ÑŒ неÑохранённые изменениÑ, хотите их Ñохранить?',
+ 'SaveDontSave' => 'Ðе ÑохранÑÑ‚ÑŒ',
+ 'PreferencesTooltip' => 'УÑтановите Ñвои предпочтениÑ',
+ 'ViewTooltip' => 'Изменить отоюражение коллекции',
+ 'PlayTooltip' => 'ВоÑпроизвеÑти видео аÑÑоциируемое Ñ Ñ„Ð¸Ð»ÑŒÐ¼Ð¾Ð¼', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'СохранÑетÑÑ...',
+ 'StatusLoad' => 'ЗагружаетÑÑ...',
+ 'StatusSearch' => 'Идёт поиÑк...',
+ 'StatusGetInfo' => 'ПолучаетÑÑ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ...',
+ 'StatusGetImage' => 'ПолучаетÑÑ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ...',
+
+ 'SaveError' => 'Ðе могу Ñохранить ÑпиÑок фильмов. ПожалуйÑта проверьте права доÑтупа и Ñвободное мето на диÑке.',
+ 'OpenError' => 'Ðе могу открыть ÑпиÑок фильмо. ПожалуйÑта проверьте права доÑтупа.',
+ 'OpenFormatError' => 'Ðе могу открыть ÑпиÑок фильмо.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Ð’Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð°Ñ Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ðµ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ верна. ПожалуйÑта выберите другую.',
+ 'OptionsCreationError'=> 'Ðе могу Ñоздать файл опций: ',
+ 'OptionsOpenError'=> 'Ðе могу открыть файл опций: ',
+ 'OptionsSaveError'=> 'Ðе могу Ñохранить файл опций: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Чего бы поÑмотреть ÑÐµÐ³Ð¾Ð´Ð½Ñ Ð²ÐµÑ‡ÐµÑ€Ð¾Ð¼ ?',
+ 'RandomError'=> 'У Ð²Ð°Ñ Ð½ÐµÑ‚ непроÑмотренных фильмов', # Accepts model codes
+ 'RandomEnd'=> 'Больше нет фильмов', # Accepts model codes
+ 'RandomNextTip'=> 'Следущее предложение',
+ 'RandomOkTip'=> 'Я ÑоглаÑен на Ñтот фильм',
+
+ 'AboutTitle' => 'О GCstar',
+ 'AboutDesc' => 'Gtk2 Каталог Фиьмов',
+ 'AboutVersion' => 'ВерÑиÑ',
+ 'AboutTeam' => 'Команда',
+ 'AboutWho' => 'Christian Jodar (Tian): Руководитель проекта, ПрограммиÑÑ‚
+Nyall Dawson (Zombiepig): ПрограммиÑÑ‚
+TPF: ПрограммиÑÑ‚
+Adolfo González: ПрограммиÑÑ‚
+',
+ 'AboutLicense' => 'РаÑпроÑтранÑетÑÑ Ð¿Ð¾Ð´ лицензией GNU GPL
+Логотипы Copyright le Spektre',
+ 'AboutTranslation' => 'РуÑÑкий перевод Ðндрей ГуÑелетов',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Логотипы и вÑб-дизайн : le Spektre',
+
+ 'ToolbarRandom' => 'Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²ÐµÑ‡ÐµÑ€Ð¾Ð¼',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Выберите тип коллекции',
+ 'ModelsPersonal' => 'ПерÑональные модели',
+ 'ModelsDefault' => 'По-умолчанию',
+ 'ModelsList' => 'Определение коллекции',
+ 'ModelSettings' => 'наÑтройки коллекции',
+ 'ModelNewType' => 'новый тип коллекции',
+ 'ModelName' => 'Ð˜Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ типа коллекции:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'Ðовое поле',
+ 'ModelFieldInformation' => 'ИнформациÑ',
+ 'ModelFieldName' => 'Метка:',
+ 'ModelFieldType' => 'Тип:',
+ 'ModelFieldGroup' => 'Группа:',
+ 'ModelFieldValues' => 'ЗначениÑ',
+ 'ModelFieldInit' => 'По-умолчанию:',
+ 'ModelFieldMin' => 'Минимум:',
+ 'ModelFieldMax' => 'МакÑимум:',
+ 'ModelFieldList' => 'СпиÑок значений:',
+ 'ModelFieldListLegend' => '<i>Разделённые запÑтой</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Короткое опиÑание текÑÑ‚',
+ 'ModelFieldTypeLongText' => 'Длинное опиÑание',
+ 'ModelFieldTypeYesNo' => 'Да/Ðет',
+ 'ModelFieldTypeNumber' => 'ЧиÑло',
+ 'ModelFieldTypeDate' => 'Дата',
+ 'ModelFieldTypeOptions' => 'Предопределённый ÑпиÑок значений',
+ 'ModelFieldTypeImage' => 'Изображение',
+ 'ModelFieldTypeSingleList' => 'ПроÑтой ÑпиÑок',
+ 'ModelFieldTypeFile' => 'Файл',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Параметры',
+ 'ModelFieldHasHistory' => 'ИÑпользовать иÑторию',
+ 'ModelFieldFlat' => 'Отображать на одной Ñтроке',
+ 'ModelFieldStep' => 'Шаг увеличениÑ:',
+ 'ModelFieldFileFormat' => 'Формат файла:',
+ 'ModelFieldFileFile' => 'ПроÑтой файл',
+ 'ModelFieldFileImage' => 'Изображение',
+ 'ModelFieldFileVideo' => 'Видео',
+ 'ModelFieldFileAudio' => 'Ðудио',
+ 'ModelFieldFileProgram' => 'Программа',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'ИÑпользовать полÑ',
+ 'ModelOptionsFieldsAuto' => 'ÐвтоматичеÑки',
+ 'ModelOptionsFieldsNone' => 'Ðет',
+ 'ModelOptionsFieldsTitle' => 'Как заголовок',
+ 'ModelOptionsFieldsId' => 'Как идентифекатор',
+ 'ModelOptionsFieldsCover' => 'Как обложку',
+ 'ModelOptionsFieldsPlay' => 'Ð”Ð»Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ ВоÑпроизведение',
+ 'ModelCollectionSettings' => 'ÐаÑтройки коллекции',
+ 'ModelCollectionSettingsLending' => 'Предмет может быть дан взаймы',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Должно быть в Ñтроке поиÑка',
+ 'ModelFilterComparison' => 'Сравнение',
+ 'ModelFilterContain' => 'Содержит',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Диапазон',
+ 'ModelFilterNumeric' => 'ИСпользовать цифровое Ñравнение',
+ 'ModelFilterQuick' => 'Создать бытрый фильтр',
+ 'ModelTooltipName' => 'ИÑпользуйте Ð¸Ð¼Ñ Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы потом можно было иÑпользовать Ñту модель в других коллекциÑ. ОÑтавьте значение по-умолчанию, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы Ñохранить модель только в Ñамой коллекции.',
+ 'ModelTooltipLabel' => 'Поле имени так как оно будет отображено',
+ 'ModelTooltipGroup' => 'ИÑпользуетÑÑ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ полей. Элементы без значений здеÑÑŒ будут в группе по-умолчанию.',
+ 'ModelTooltipHistory' => 'Должно ли введенное значение ÑохранÑÑ‚ÑŒÑÑ Ð² ÑпиÑке аÑÑоциированном Ñ Ð¿Ð¾Ð»ÐµÐ¼',
+ 'ModelTooltipFormat' => 'Формат иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ðµ проиÑходит при нажатии кнопки ВоÑпроизведение',
+ 'ModelTooltipLending' => 'Тут будут добавлены некоторые Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¹Ð¼Ð°Ð¼Ð¸',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Должны ли Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑчитатьÑÑ Ñ†Ð¸Ñ„Ñ€Ð°Ð¼Ð¸ при Ñравнении',
+ 'ModelTooltipQuick' => 'Это добавит подменю в фильтры',
+
+ 'ResultsTitle' => 'Выберите фильм', # Accepts model codes
+ 'ResultsNextTip' => 'иÑкать на Ñледующем Ñайте',
+ 'ResultsPreview' => 'ПредпроÑмотр',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'ПредпочтениÑ',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Ð’Ñб браузер',
+ 'OptionsPlayer' => 'Видео проигрыватель',
+ 'OptionsAudio' => 'Ðудио проигрыватель',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Ð”Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ',
+ 'OptionsUseRelativePaths' => 'ИÑпользовать отноÑительные пути Ð´Ð»Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ð¹',
+ 'OptionsLayout' => 'РаÑположение',
+ 'OptionsStatus' => 'Отображать Ñтроку ÑтатуÑа',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Внимание : Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð° Ñтой вкладке не будут применыны до перезагрузки приложениÑ.',
+ 'OptionsRemoveConfirm' => 'Спрашивать подтверждение перед удалением фильма',
+ 'OptionsAutoSave' => 'ÐвтоматичеÑки ÑохранÑÑ‚ÑŒ коллекцию',
+ 'OptionsAutoLoad' => 'Загружать предыдущую коллекцию при Ñтарте',
+ 'OptionsSplash' => 'Показывать Ñтартовый Ñкран',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Выберите программу',
+ 'OptionsPlugins' => 'Сайт Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ нужно получать данные',
+ 'OptionsAskPlugins' => 'Спрашивать (Ð’Ñе Ñайты)',
+ 'OptionsPluginsMulti' => 'ÐеÑколько Ñайтов',
+ 'OptionsPluginsMultiAsk' => 'Спрашивать (ÐеÑколько Ñайтов)',
+ 'OptionsPluginsMultiPerField' => 'ÐеÑколько Ñайтов (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Задать ÑпиÑок',
+ 'OptionsAskImport' => 'Выберите Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ',
+ 'OptionsProxy' => 'ИÑпользовать прокÑи',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Язык',
+ 'OptionsMain' => 'ОÑновные',
+ 'OptionsPaths' => 'Пути',
+ 'OptionsInternet' => 'Интернет',
+ 'OptionsConveniences' => 'ВозможноÑти',
+ 'OptionsDisplay' => 'Отображение',
+ 'OptionsToolbar' => 'Панель инÑтрументов',
+ 'OptionsToolbars' => {0 => 'Ðет', 1 => 'МаленькаÑ', 2 => 'БольшаÑ', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'ПозициÑ',
+ 'OptionsToolbarPositions' => {0 => 'Вверху', 1 => 'Внизу', 2 => 'Слева', 3 => 'Справа'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Вид',
+ 'OptionsViews' => {0 => 'ТекÑÑ‚', 1 => 'Картинка', 2 => 'Детально'},
+ 'OptionsColumns' => 'Колонки',
+ 'OptionsMailer' => 'Почтовый Ñервер',
+ 'OptionsSMTP' => 'Сервер',
+ 'OptionsFrom' => 'Ваш e-mail',
+ 'OptionsTransform' => 'Помещать артикли в конце названиÑ',
+ 'OptionsArticles' => 'Ðртикли (разделённые запÑтой)',
+ 'OptionsSearchStop' => 'Разрешить прерывать поиÑк',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'ИÑпользовать оÑновной заголовок вмеÑто оригинального, еÑли он отÑутÑтвует',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Размер иÑтории',
+ 'OptionsClearHistory' => 'ОчиÑтить иÑторию',
+ 'OptionsStyle' => 'Шкура',
+ 'OptionsDontAsk' => 'Больше не Ñпрашивать',
+ 'OptionsPathProgramsGroup' => 'ПриложениÑ',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'ИзображениÑ',
+ 'OptionsInternetDataGroup' => 'Импорт данных',
+ 'OptionsInternetSettingsGroup' => 'ÐаÑтройки',
+ 'OptionsDisplayInformationGroup' => 'ИнформациÑ',
+ 'OptionsDisplayArticlesGroup' => 'Статьи',
+ 'OptionsImagesDisplayGroup' => 'Отобразить',
+ 'OptionsImagesStyleGroup' => 'Стиль',
+ 'OptionsDetailedPreferencesGroup' => 'ПредпочтениÑ',
+ 'OptionsFeaturesConveniencesGroup' => 'СоглашениÑ',
+ 'OptionsPicturesFormat' => 'ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² изображениÑÑ…:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Заголовок или Ð¸Ð¼Ñ Ð°ÑÑоциированного Ñлемента ',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'ÐаÑтройка почтовой программы',
+
+ 'ImagesOptionsButton' => 'ÐаÑтройки',
+ 'ImagesOptionsTitle' => 'ÐаÑтройки Ð´Ð»Ñ ÑпиÑка изображений',
+ 'ImagesOptionsSelectColor' => 'Выберите цвет',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Фон',
+ 'ImagesOptionsBgPicture' => 'Выберите фоновое изображение',
+ 'ImagesOptionsFg'=> 'Выделение',
+ 'ImagesOptionsBgTooltip' => 'Изменить цвет фона',
+ 'ImagesOptionsFgTooltip'=> 'Изменить цвет выделениÑ',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Размер',
+ 'ImagesOptionsSizeList' => {0 => 'Очень маленькое', 1 => 'Маленькое', 2 => 'Среднее', 3 => 'Большое', 4 => 'Очень большое'},
+ 'ImagesOptionsSizeTooltip' => 'Выберите размер изображенÑ',
+
+ 'DetailedOptionsTitle' => 'ÐаÑтройки Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»Ð¸Ð·Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑпиÑка',
+ 'DetailedOptionsImageSize' => 'Размер изображениÑ',
+ 'DetailedOptionsGroupItems' => 'Группировать Ñлементы по',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Выберите Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'ИнформациÑ',
+ 'ExtractTitle' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð· видеофайла',
+ 'ExtractImport' => 'ИÑпользовать значениÑ',
+
+ 'FieldsListOpen' => 'Загрузить ÑпиÑок полей из файла',
+ 'FieldsListSave' => 'Сохранить ÑпиÑок полей в файл',
+ 'FieldsListError' => 'Этот ÑпиÑок полей не может быть иÑпользован Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ типом коллекции',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'ЭкÑпортировать ÑпиÑок фильмов',
+ 'ExportFilter' => 'ЭкÑпортировать только показанные фильмы',
+ 'ExportFieldsTitle' => 'ÐŸÐ¾Ð»Ñ Ð´Ð»Ñ ÑкÑпорта',
+ 'ExportFieldsTip' => 'Выберите Ð¿Ð¾Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ вы хотите ÑкÑпортировать',
+ 'ExportWithPictures' => 'Скопировать Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² под-директорию',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Импортировать другой ÑпиÑок фильмоа',
+ 'ImportExportData' => 'Данные',
+ 'ImportExportFile' => 'Файл',
+ 'ImportExportFieldsUnused' => 'ÐеиÑпользуемые полÑ',
+ 'ImportExportFieldsUsed' => 'ИÑпользуемые полÑ',
+ 'ImportExportFieldsFill' => 'Добавить вÑе',
+ 'ImportExportFieldsClear' => 'Удалить вÑе',
+ 'ImportExportFieldsEmpty' => 'Вы должны выбрать по карйней мере одно поле',
+ 'ImportExportFileEmpty' => 'Ð’Ñ‹ должны указать Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð°',
+ 'ImportFieldsTitle' => 'ÐŸÐ¾Ð»Ñ Ð´Ð»Ñ ÑкÑпорта',
+ 'ImportFieldsTip' => 'Выберите Ð¿Ð¾Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ вы хотите ÑкÑпортировать',
+ 'ImportNewList' => 'Создать новую коллекцию',
+ 'ImportCurrentList' => 'Добавить к текущей коллекции',
+ 'ImportDropError' => 'Произошла ошибка в процеÑÑе открытиÑ, по крайней мере в одном файле. Будет загружен предыдущий ÑпиÑок.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'ПожалуйÑта, выберите файл',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Выберите директорию',
+ 'FileChooserOverwrite' => 'Такой файл уже ÑущеÑтвует. Ð’Ñ‹ хотите перезапиÑать его?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Компактно',
+ 'PanelReadOnly' => 'Только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ',
+ 'PanelForm' => 'Вкладки',
+
+ 'PanelSearchButton' => 'Получить информацию',
+ 'PanelSearchTip' => 'ИÑкать в Инетрнет информацию по Ñтому заголовку',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Щёлкните на картинке Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° другой.',
+ 'PanelImageTipView' => 'Ðажмите на картинке Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра её в оригинальном размере.',
+ 'PanelImageTipMenu' => ' Правый щелчок - еще опции',
+ 'PanelImageTitle' => 'Выберите картинку',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Выберите файл',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'От',
+ 'PanelTo' =>'Куда',
+
+ 'PanelWeb' => 'Смотреть информацию',
+ 'PanelWebTip' => 'ПоÑмотреть информацию в Интернет об Ñтом фильме', # Accepts model codes
+ 'PanelRemoveTip' => 'Удалить текущий фильм', # Accepts model codes
+
+ 'PanelDateSelect' => 'Выберите дату',
+ 'PanelNobody' => 'Ðикто',
+ 'PanelUnknown' => 'ÐеизвеÑтно',
+ 'PanelAdded' => 'Добавить дату',
+ 'PanelRating' => 'Рейтинг',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Размещение',
+
+ 'PanelLending' => 'Ðа руках',
+ 'PanelBorrower' => 'Должник',
+ 'PanelLendDate' => 'С ',
+ 'PanelHistory' => 'ИÑториÑ',
+ 'PanelReturned' => 'Фильм возвращён', # Accepts model codes
+ 'PanelReturnDate' => 'Дата возврата',
+ 'PanelLendedYes' => 'ВзÑто напрокат',
+ 'PanelLendedNo' => 'ДоÑтупно',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Или',
+ 'CheckYes' => 'Да',
+ 'CheckNo' => 'Ðет',
+
+ 'ToolbarAll' => 'Показать вÑе',
+ 'ToolbarAllTooltip' => 'Показать вÑе фильмы',
+ 'ToolbarGroupBy' => 'Группировать по',
+ 'ToolbarGroupByTooltip' => 'Выберите Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ Ñлементов в ÑпиÑке',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'ИÑкать фильм',
+ 'PluginsQuery' => 'ЗапроÑ',
+ 'PluginsFrame' => 'ИÑкать Ñайт',
+ 'PluginsLogo' => 'Лого',
+ 'PluginsName' => 'ИмÑ',
+ 'PluginsSearchFields' => 'ÐŸÐ¾Ð»Ñ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка',
+ 'PluginsAuthor' => 'Ðвтор',
+ 'PluginsLang' => 'Язык',
+ 'PluginsUseSite' => 'ИÑпользовать выбранный Ñайт Ð´Ð»Ñ Ð¿Ð¾Ñледующего поиÑка',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¸ÐºÐ°',
+ 'BorrowersList' => 'Должники',
+ 'BorrowersName' => 'ИмÑ',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Добавить',
+ 'BorrowersRemove' => 'Удалить',
+ 'BorrowersEdit' => 'Редактировать',
+ 'BorrowersTemplate' => 'Шаблон Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ñ‚Ñ‹',
+ 'BorrowersSubject' => 'Тема пиÑьма',
+ 'BorrowersNotice1' => '%1 будет заменено именем должника',
+ 'BorrowersNotice2' => '%2 будет заменено названием фильма',
+ 'BorrowersNotice3' => '%3 будет заменено датой',
+
+ 'BorrowersImportTitle' => 'Импорт информации о должниках',
+ 'BorrowersImportType' => 'Формат файла:',
+ 'BorrowersImportFile' => 'Файл:',
+
+ 'BorrowedTitle' => 'Ðа руках', # Accepts model codes
+ 'BorrowedDate' => 'С ',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'ПоÑлать e-mail',
+ 'MailFrom' => 'От: ',
+ 'MailTo' => 'Кому: ',
+ 'MailSubject' => 'Тема: ',
+ 'MailSmtpError' => 'Проблемы в процеÑÑе приÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ðº SMTP Ñерверу',
+ 'MailSendmailError' => 'Проблемы при запуÑке sendmail',
+
+ 'SearchTooltip' => 'ИÑкать вÑе фильмы', # Accepts model codes
+ 'SearchTitle' => 'ПоиÑк фильмов', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Поле Ð´Ð»Ñ Ð·Ð°Ð¼ÐµÐ½Ñ‹',
+ 'QueryReplaceOld' => 'Текущее имÑ',
+ 'QueryReplaceNew' => 'Ðовое имÑ',
+ 'QueryReplaceLaunch' => 'Заменить',
+
+ 'ImportWindowTitle' => 'Выберите Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ',
+ 'ImportViewPicture' => 'ПоÑмотреть картинку',
+ 'ImportSelectAll' => 'Выбрать вÑе',
+ 'ImportSelectNone' => 'СброÑить выбор',
+
+ 'MultiSiteTitle' => 'ИÑпользовать Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка Ñайты',
+ 'MultiSiteUnused' => 'ÐеиÑпользуемые плагины',
+ 'MultiSiteUsed' => 'ИÑпользовать плагины',
+ 'MultiSiteLang' => 'Заполнить ÑпиÑок ÐнглийÑкими плагинами',
+ 'MultiSiteEmptyError' => 'У Ð²Ð°Ñ Ð¿ÑƒÑтой ÑпиÑок Ñайтов',
+ 'MultiSiteClear' => 'ОчиÑтить ÑпиÑок',
+
+ 'DisplayOptionsTitle' => 'Отображать',
+ 'DisplayOptionsAll' => 'Выбрать вÑе',
+ 'DisplayOptionsSearch' => 'Кнопки поиÑка',
+
+ 'GenresTitle' => 'ÐšÐ¾Ð½Ð²ÐµÑ€Ñ‚Ð°Ñ†Ð¸Ñ Ð¶Ð°Ð½Ñ€Ð¾Ð²',
+ 'GenresCategoryName' => 'ИÑпользовать жанр',
+ 'GenresCategoryMembers' => 'Заменить на',
+ 'GenresLoad' => 'Загрузить ÑпиÑок',
+ 'GenresExport' => 'Сохранить ÑпиÑок жанров в файл',
+ 'GenresModify' => 'Редактировать конвертацию',
+
+ 'PropertiesName' => 'Ð˜Ð¼Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ð¸',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Владелец',
+ 'PropertiesEmail' => 'E-mail',
+ 'PropertiesDescription' => 'ОпиÑание',
+ 'PropertiesFile' => 'Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ файле',
+ 'PropertiesFilePath' => 'Полный путь',
+ 'PropertiesItemsNumber' => 'КоличеÑтво Ñлементов', # Accepts model codes
+ 'PropertiesFileSize' => 'Размер',
+ 'PropertiesFileSizeSymbols' => ['Байт', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'СвойÑтва коллекции',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Программы Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ почты',
+ 'MailProgramsName' => 'ИмÑ',
+ 'MailProgramsCommand' => 'ÐšÐ¾Ð¼Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока',
+ 'MailProgramsRestore' => 'ВоÑÑтановить Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾-умолчанию',
+ 'MailProgramsAdd' => 'Добавить программу',
+ 'MailProgramsInstructions' => 'Ð’ коммандной Ñтроке делаютÑÑ Ñ‚Ð°ÐºÐ¸Ðµ подÑтановки:
+ %f заменÑетÑÑ e-mail адреÑом пользователÑ.
+ %t заменÑетÑÑ Ð°Ð´Ñ€ÐµÑом получателÑ.
+ %s заменÑетÑÑ Ñ‚ÐµÐ¼Ð¾Ð¹ ÑообщениÑ.
+ %b заменÑетÑÑ Ñ‚ÐµÐ»Ð¾Ð¼ ÑообщениÑ.',
+
+ 'BookmarksBookmarks' => 'Закладки',
+ 'BookmarksFolder' => 'ДиректориÑ',
+ 'BookmarksLabel' => 'Метка',
+ 'BookmarksPath' => 'Путь',
+ 'BookmarksNewFolder' => 'ÐÐ¾Ð²Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°',
+
+ 'AdvancedSearchType' => 'Тип поиÑка',
+ 'AdvancedSearchTypeAnd' => 'Элементы удовлетворÑющие вÑем критериÑм', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Элементы удовлетворÑющие по крайней мере одному критерию', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Критерий',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..cdab08e
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'UkljuÄi imena polja na vrhu',
+ 'Separator' => 'GraniÄnik',
+ 'Replacement' => 'Zameni graniÄnik sa',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9e88357
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..2aa34c9
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::SR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Koristi Javascript',
+ 'FileTemplate' => 'Å abloni :',
+ 'Preview' => 'Vidi kako izgleda',
+ 'NoPreview' => 'Za ovaj Å¡ablon ne postoji slika',
+ 'Title' => 'Ime strane',
+ 'InfoFile' => 'Lista filmova je u fajlu: ',
+ 'InfoDir' => 'Slike su u: ',
+ 'HeightImg' => 'Visina (u pikselima) na koju će slika biti smanjena: ',
+ 'OpenFileInBrowser' => 'Otvori nastali fajl u internet brauzeru',
+ 'Note' => 'Lista napravljena pomoću <a href="http://www.gcstar.org/">GCstar</a>-a',
+ 'InputTitle' => 'Unesite reÄi koje tražite',
+ 'SearchType1' => 'Samo po naslovu',
+ 'SearchType2' => 'U svim podacima',
+ 'SearchButton' => 'Traži',
+ 'SearchTitle' => 'Prikaži samo filmove koji odgovaraju prošlom kriterijumu',
+ 'AllButton' => 'Svi',
+ 'AllTitle' => 'Pokaži sve filmove',
+ 'Expand' => 'Otvori sve',
+ 'ExpandTitle' => 'Prikaži informacije za sve filmove',
+ 'Collapse' => 'Zatvori sve',
+ 'CollapseTitle' => 'Zatvori informacije za sve filmove',
+ 'Borrowed' => 'Pozajmljen: ',
+ 'NotBorrowed' => 'Ovde',
+ 'Top' => 'Na vrh',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..b7a31a5
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..ee6ef07
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'UkljuÄi DROP instrukciju',
+ 'WithCreate' => 'UkljuÄi CREATE instrukciju',
+ 'TableName' => 'Ime tabele',
+ 'InfoFile' => 'SQL fajl: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..483d75b
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Arhiva je u fajlu: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..0a1b7dc
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::SR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Fajl Å¡ablona',
+ 'ModelText' => 'Tekst Å¡ablona',
+ 'Models' => 'Koristi Å¡ablon',
+ 'UseFile' => 'Koristi fajl',
+ 'UseModel' => 'Koristi tekst polje',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..41925a2
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::SR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..191d187
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ignoriši prvu liniju',
+ 'Separator' => 'GraniÄnik',
+ 'Plugin' => 'Sajt koji će da se koristi',
+ 'UseFirst' => 'Ako ima više rezultata, odaberi prvi',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..74ecdc1
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..312f014
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..4aed91c
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Lista naslova',
+ 'Plugin' => 'Sajt koji će da se koristi',
+ 'UseFirst' => 'Ako ima više rezultata, odaberi prvi',
+ 'CommentAuto' => 'Filmovi automatski ubaÄeni.',
+ 'CommentSite' => 'Internet stranica: ',
+ 'CommentTitle' => 'Naslov: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..8e5e493
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::SR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..7d766d4
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Fajl nije Tellico video kolekcija',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..580c2c5
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::SR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..c3df78c
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::SR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..7cb7f2f
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::SR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/SR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..4f6bbf3
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => 'Books',
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'Kolekcija',
+ Rank => 'Ocena',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/SR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..ce6f1e5
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::SR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/SR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..d9d9811
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::SR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/SR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..dc9a576
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::SR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Movies collection',
+ Items => 'Filmovi',
+ NewItem => 'Novi film',
+
+
+ Id => 'Redni broj',
+ Title => 'Naslov',
+ Date => 'Datum',
+ Time => 'Trajanje',
+ Director => 'Režiser',
+ Country => 'Zemlja',
+ MinimumAge => 'Ne za mlađe od',
+ Genre => 'Žanr',
+ Image => 'Slika',
+ Original => 'Naslov originala',
+ Actors => 'Uloge',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Komentari',
+ Synopsis => 'Radnja',
+ Seen => 'Pogledan',
+ Number => '# medija',
+ Format => 'Medij',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Internet',
+ Audio => 'Zvuk',
+ Video => 'Video format',
+ Trailer => 'Video fajl',
+ Serie => 'Kolekcija',
+ Rank => 'Ocena',
+ Subtitles => 'Prevod',
+
+ SeenYes => 'Gledao',
+ SeenNo => 'Neodgledan',
+
+ AgeUnrated => 'Neocenjen',
+ AgeAll => 'Svi Uzrasti',
+ AgeParent => 'Roditeljska Pratnja',
+
+ Main => 'Main items',
+ General => 'Opšte',
+ Details => 'Detalji',
+
+ Information => 'Informacije',
+ Languages => 'Jezici',
+ Encoding => 'Kodna strana',
+
+ FilterAudienceAge => 'Uzrast publike',
+ FilterSeenNo => '_Negledani',
+ FilterSeenYes => '_Already Viewed',
+ FilterRatingSelect => 'Ocena _Najmanje...',
+
+ ExtractSize => 'VeliÄina',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCgames.pm b/lib/gcstar/GCLang/SR/GCModels/GCgames.pm
new file mode 100644
index 0000000..cdb1d58
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::SR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Video games collection',
+ Items => 'Games',
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Players => 'Number of players',
+ Released => 'Release Date',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Genre => 'Genre',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Completion (%)',
+ Executable => 'Executable',
+ Description => 'Description',
+ Codes => 'Codes',
+ Code => 'Code',
+ Effect => 'Effect',
+ Secrets => 'Secrets',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Unlockables => 'Unlockables',
+ Unlockable => 'Unlockable',
+ Howto => 'How to unlock',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'General',
+ Details => 'Details',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..5dd19d9
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/SR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..53bad12
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::SR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/SR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..48a7aa9
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::SR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => 'Albums',
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..a73e38e
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::SR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..d79165c
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::SR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..528e096
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::SR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/SR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..7c7ee61
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::SR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCModels/GCwines.pm b/lib/gcstar/GCLang/SR/GCModels/GCwines.pm
new file mode 100644
index 0000000..8ce352b
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::SR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SR/GCstar.pm b/lib/gcstar/GCLang/SR/GCstar.pm
new file mode 100644
index 0000000..4d6498b
--- /dev/null
+++ b/lib/gcstar/GCLang/SR/GCstar.pm
@@ -0,0 +1,669 @@
+{
+ package GCLang::SR;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more Details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Srpski',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Upozorenje</b>:
+
+Informacije skinute sa web sajtova (putem modula za pretragu) su <b>samo za liÄnu upotrebu</b>.
+
+Svaka daljna distribucija je zabranjena bez <b>jasne dozvole</b> sajta.
+
+Da biste odredili koji sajt je vlasnik informacija, možete da koristite <b>dugme ispod podataka o filmu</b>.',
+
+ 'AllItemsFiltered' => 'Nijedan film ne odgovara zadatom kriterijumu', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Instaliraj u',
+ 'InstallMandatory' => 'Obavezne komponente',
+ 'InstallOptional' => 'Opcione komponente',
+ 'InstallErrorMissing' => 'Greška : Sledeće Perl komponente moraju prethodno da budu instalirane: ',
+ 'InstallPrompt' => 'Osnovni direktorijum za instalaciju [/usr/local]: ',
+ 'InstallEnd' => 'Kraj instalacije',
+ 'InstallNoError' => 'Bez grešaka',
+ 'InstallLaunch' => 'Da biste koristili ovaj program, možete pokrenuti ',
+ 'InstallDirectory' => 'Osnovni direktorijum',
+ 'InstallTitle' => 'GCstar instalacija',
+ 'InstallDependencies' => 'Zavisnosti',
+ 'InstallPath' => 'Putanja',
+ 'InstallOptions' => 'Opcije',
+ 'InstallSelectDirectory' => 'Izaberite osnovni direktorijum za instalaciju',
+ 'InstallWithClean' => 'Obriš fajlove koji se nalaze u instalacionom direktorijumu',
+ 'InstallWithMenu' => 'Dodaj GCstar u listu programa',
+ 'InstallNoPermission' => 'Greška: Nemate dozvolu za pisanje u direktorijum koji ste odabrali',
+ 'InstallMissingMandatory' => 'Nedostaju obavezne zavisne komponente. Nećete moći da instalirate GCstar dok ih ne dodate u sistem.',
+ 'InstallMissingOptional' => 'Nedostaju neke obavezne zavisne komponente. Imena su im izlistana ispod. GCstar se može instalirati, ali neke funkcije vam neće raditi.',
+ 'InstallMissingNone' => 'Sve zavisnosti su u redu. Možete da nastavite sa GCstar instalacijom.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Nedostaju',
+ 'InstallMissingFor' => 'Nedostaju',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Koristi proxy (pritisnite enter ako ih nema): ',
+ 'UpdateNoPermission' => 'Odbijena dozvola za pisanje u ovom direktorijumu: ',
+ 'UpdateNone' => 'Novija verzija nije pronađena',
+ 'UpdateFileNotFound' => 'Fajl nije pronađen',
+
+#Splash
+ 'SplashInit' => 'Startovanje',
+ 'SplashLoad' => 'UÄitavam kolekciju',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Spremno',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'It seems you were using GCfilms before. What do you want to import from GCfilms to GCstar (it won\'t impact GCfilms if you still want to use it)?',
+ 'GCfilmsImportOptions' => 'Settings',
+ 'GCfilmsImportData' => 'Movies list',
+
+#Menus
+ 'MenuFile' => '_Fajl',
+ 'MenuNewList' => '_Nova Kolekcija',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Poslednje Kolekcije',
+ 'MenuLend' => 'Prikaži Po_zajmljene Filmove', # Accepts model codes
+ 'MenuImport' => '_Uvezi',
+ 'MenuExport' => '_Izvezi',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Izmeni',
+ 'MenuDuplicate' => '_Dupliraj Film', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Obriši Film', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_ZakljuÄaj Kolekciju',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Prikaži _Sve Filmove', # Accepts model codes
+ 'MenuNoFilter' => '_Bilo Koji',
+
+ 'MenuConfiguration' => '_Podešavanja',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Prikazane Informacije',
+ 'MenuBorrowers' => '_PozajmljivaÄi',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Prebacivanje _Žanra',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Pomoć',
+ 'MenuHelpContent' => '_Pomoć',
+ 'MenuAllPlugins' => 'View _plugins',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => '_O GCstar',
+
+ 'MenuNewWindow' => 'Prikaži Film U _Novom Prozoru', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expand all',
+ 'ContextCollapseAll' => 'Collapse all',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Please enter value',
+
+ 'RemoveConfirm' => 'Da listvarno želite da obrišete ovaj film?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'Dodaj novi film', # Accepts model codes
+ 'NoItemFound' => 'Film nije pronađen. Da li želite da pretražite drugi sajt?',
+ 'OpenList' => 'Odaberite kolekciju',
+ 'SaveList' => 'Odaberite gde ćete da saÄuvate kolekciju',
+ 'SaveListTooltip' => 'SaÄuvaj trenutnu kolekciju',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'Podesite svoje parametre',
+ 'ViewTooltip' => 'Promenite prikaz kolekcije',
+ 'PlayTooltip' => 'Pustite film', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Pretraga u toku...',
+ 'StatusGetInfo' => 'Prikupljanje informacija u toku...',
+ 'StatusGetImage' => 'Snimanje slike u toku...',
+
+ 'SaveError' => 'Ne mogu da saÄuvam listu filmova. Proverite prava pristupa i slobodan prostor na disku.',
+ 'OpenError' => 'Ne mogu da otvorim listu filmova. Proverite prava pristupa.',
+ 'OpenFormatError' => 'Cannot open items list. Format may be incorrect.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Odabrani direktorijum za Äuvanje slika nije ispravan. Odaberite drugi.',
+ 'OptionsCreationError'=> 'Ne mogu da napravim fajl sa opcijama: ',
+ 'OptionsOpenError'=> 'Ne mogu da otvorim fajl sa opcijama: ',
+ 'OptionsSaveError'=> 'Ne mogu da saÄuvam fajl sa opcijama: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Å ta gledati veÄeras ?',
+ 'RandomError'=> 'Nemate neodgledanih filmova', # Accepts model codes
+ 'RandomEnd'=> 'Nemate više filmova', # Accepts model codes
+ 'RandomNextTip'=> 'Sledeći predlog',
+ 'RandomOkTip'=> 'Biram ovaj film',
+
+ 'AboutTitle' => 'O GCstar',
+ 'AboutDesc' => 'Gtk2 Katalog Filmova',
+ 'AboutVersion' => 'Verzija',
+ 'AboutTeam' => 'Tim',
+ 'AboutWho' => 'Christian Jodar (Tian): Vođa projekta, Programer
+Nyall Dawson (Zombiepig): Programer
+TPF: Programer
+Adolfo González: Programer
+',
+ 'AboutLicense' => 'Distribuirano pod GNU GPL uslovima
+Logo Copyright le Spektre',
+ 'AboutTranslation' => 'Prevod na srpski Mario Tomić (http://www.mariotomic.com)',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo i web dizajn le Spektre',
+
+ 'ToolbarRandom' => 'VeÄeras',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Select a collection type',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Collection definition',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Odaberite film', # Accepts model codes
+ 'ResultsNextTip' => 'Pretraži sledeći sajt',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Podešavanja',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Web brauzer',
+ 'OptionsPlayer' => 'Video plejer',
+ 'OptionsAudio' => 'Audio player',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Direktorijum sa slikama',
+ 'OptionsUseRelativePaths' => 'Koristi relativnu putanju do slika',
+ 'OptionsLayout' => 'Izgled',
+ 'OptionsStatus' => 'Pokaži statusnu liniju',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Upozorenje: Izmene sa ove kartice se neće videti dok se program ponovo ne pokrene.',
+ 'OptionsRemoveConfirm' => 'Traži potvrdu pre nego što obrišeš film',
+ 'OptionsAutoSave' => 'Automatski saÄuvaj kolekciju',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Prikaži uvodni ekran (splash screen)',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Odaberite koji program želite da koristite',
+ 'OptionsPlugins' => 'Sajt sa kog želite da preuzmete podatke',
+ 'OptionsAskPlugins' => 'Pitaj me (Svi sajtovi)',
+ 'OptionsPluginsMulti' => 'Neki sajtovi',
+ 'OptionsPluginsMultiAsk' => 'Pitaj me (Neki sajtovi)',
+ 'OptionsPluginsMultiPerField' => 'Neki sajtovi (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Zadaj listu',
+ 'OptionsAskImport' => 'Odaberite polja za uvoženje',
+ 'OptionsProxy' => 'Koristi proxy',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Jezik',
+ 'OptionsMain' => 'Glavni',
+ 'OptionsPaths' => 'Putanje',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Funkcije',
+ 'OptionsDisplay' => 'Prikaz',
+ 'OptionsToolbar' => 'Alati',
+ 'OptionsToolbars' => {0 => 'Bez', 1 => 'Mali', 2 => 'Veliki', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Pozicija',
+ 'OptionsToolbarPositions' => {0 => 'Vrh', 1 => 'Dno', 2 => 'Levo', 3 => 'Desno'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Prikaz',
+ 'OptionsViews' => {0 => 'Tekst', 1 => 'Slika', 2 => 'Detaljno'},
+ 'OptionsColumns' => 'Kolone',
+ 'OptionsMailer' => 'E-mail servis',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Vaš e-mail',
+ 'OptionsTransform' => 'Stavi Älanove posle naslova filma',
+ 'OptionsArticles' => 'ÄŒlanovi (Odvojeni zarezom)',
+ 'OptionsSearchStop' => 'Dozvoli da pretraga bude prekinuta',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Koristi glavni naslov kao originalni ukoliko originalnog nema',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'VeliÄina istorije',
+ 'OptionsClearHistory' => 'Obriši istoriju',
+ 'OptionsStyle' => 'Promena izgleda',
+ 'OptionsDontAsk' => 'Ne pitaj više',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Images',
+ 'OptionsInternetDataGroup' => 'Data import',
+ 'OptionsInternetSettingsGroup' => 'Settings',
+ 'OptionsDisplayInformationGroup' => 'Information display',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Display',
+ 'OptionsImagesStyleGroup' => 'Style',
+ 'OptionsDetailedPreferencesGroup' => 'Preferences',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'Podešavanja',
+ 'ImagesOptionsTitle' => 'Podešavanja za liste slika',
+ 'ImagesOptionsSelectColor' => 'Odaberi boju',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Pozadina',
+ 'ImagesOptionsBgPicture' => 'Upotrebi pozadisku sliku',
+ 'ImagesOptionsFg'=> 'Selekcija',
+ 'ImagesOptionsBgTooltip' => 'Promeni boju pozadine',
+ 'ImagesOptionsFgTooltip'=> 'Promeni boju selekcije',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'VeliÄina',
+ 'ImagesOptionsSizeList' => {0 => 'Vrlo mali', 1 => 'Mali', 2 => 'Srednji', 3 => 'Veliki', 4 => 'Vrlo veliki'},
+ 'ImagesOptionsSizeTooltip' => 'Odaberi veliÄinu slike',
+
+ 'DetailedOptionsTitle' => 'Podešavanja za detaljnu listu',
+ 'DetailedOptionsImageSize' => 'VeliÄina slike',
+ 'DetailedOptionsGroupItems' => 'Grupiši filmove prema kolekciji',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Odaberi polja za prikaz',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Informacije',
+ 'ExtractTitle' => 'Informacije o video fajlu',
+ 'ExtractImport' => 'Koristi vrednosti',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Izvezi listu filmova',
+ 'ExportFilter' => 'Izvezi samo prikazane filmove',
+ 'ExportFieldsTitle' => 'Polja za izvoženje',
+ 'ExportFieldsTip' => 'Odaberi polja koja želiš da izvezeš',
+ 'ExportWithPictures' => 'Kopiraj slike u pod-direktorijum',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Uvezi drugu listu filmova',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Fajl',
+ 'ImportExportFieldsUnused' => 'Neiskorišćena polja',
+ 'ImportExportFieldsUsed' => 'Iskorišćena polja',
+ 'ImportExportFieldsFill' => 'Dodaj sva',
+ 'ImportExportFieldsClear' => 'Ukloni sva',
+ 'ImportExportFieldsEmpty' => 'Moraš da izabereš barem jedno polje',
+ 'ImportExportFileEmpty' => 'Moraš da navedeš ime fajla',
+ 'ImportFieldsTitle' => 'Polja za uvoženje',
+ 'ImportFieldsTip' => 'Odaberi polja koja želiš da uvezeš',
+ 'ImportNewList' => 'Napravi novu kolekciju',
+ 'ImportCurrentList' => 'Dodaj u trenutnu kolekciju',
+ 'ImportDropError' => 'DoÅ¡lo je do greÅ¡ke pri otvaranju najmanje jednog fajla. UÄitaće se prethodna lista.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Odaberi fajl koji ?eš da koristiš',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Odaberite direktorijum',
+ 'FileChooserOverwrite' => 'Ovaj fajl već postoji. Da li želite da ga zamenite novim fajlom?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ 'PanelCompact' => 'Sažeti',
+ 'PanelReadOnly' => 'Samo Za Äitanje',
+ 'PanelForm' => 'Kartice',
+
+ 'PanelSearchButton' => 'Prikupi informacije',
+ 'PanelSearchTip' => 'Pretraži internet za informacije o ovom filmu',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Klikni na sliku da odabereš neku drugu.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Desni klik za više opcija.',
+ 'PanelImageTitle' => 'Odaberi sliku',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Odaberi fajl',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'Pogledaj Informacije',
+ 'PanelWebTip' => 'Pogledaj Informacije o ovom filmu na internetu', # Accepts model codes
+ 'PanelRemoveTip' => 'Obriši ovaj film', # Accepts model codes
+
+ 'PanelDateSelect' => 'Odaberi datum',
+ 'PanelNobody' => 'Niko',
+ 'PanelUnknown' => 'Nepoznat',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Ocena',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Lokacija',
+
+ 'PanelLending' => 'Pozajmljivanje',
+ 'PanelBorrower' => 'Pozajmio',
+ 'PanelLendDate' => 'Pozajmljen Od',
+ 'PanelHistory' => 'Istorija Pozajmljivanja',
+ 'PanelReturned' => 'Vraćen Film', # Accepts model codes
+ 'PanelReturnDate' => 'Datum vraćanja',
+ 'PanelLendedYes' => 'Pozajmljen',
+ 'PanelLendedNo' => 'Ovde',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Ili',
+ 'CheckYes' => 'Da',
+ 'CheckNo' => 'Ne',
+
+ 'ToolbarAll' => 'Vidi sve',
+ 'ToolbarAllTooltip' => 'Vidi sve filmove',
+ 'ToolbarGroupBy' => 'Group by',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Traži po filmovima',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Traži po internet sajtu',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Ime',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Autor',
+ 'PluginsLang' => 'Jezik',
+ 'PluginsUseSite' => 'Koristi odabrani sajt za sledeće pretrage',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Opcije za pozajmljivaÄe',
+ 'BorrowersList' => 'PozajmljivaÄi',
+ 'BorrowersName' => 'Ime',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Dodaj',
+ 'BorrowersRemove' => 'Obriši',
+ 'BorrowersEdit' => 'Promeni',
+ 'BorrowersTemplate' => 'Predefinisani mail Å¡ablon',
+ 'BorrowersSubject' => 'Naslov maila',
+ 'BorrowersNotice1' => '%1 će biti zamenjeno imenom onog kome pozajmljuješ',
+ 'BorrowersNotice2' => '%2 će biti zamenjeno imenom filma',
+ 'BorrowersNotice3' => '%3 će biti zamenjeno datumom pozajmice',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Pozajmljeni filmovi', # Accepts model codes
+ 'BorrowedDate' => 'Od',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'Pošalji mu e-mail',
+ 'MailFrom' => 'Od: ',
+ 'MailTo' => 'Za: ',
+ 'MailSubject' => 'Naslov: ',
+ 'MailSmtpError' => 'Problem sa povezivanjem na server za slanje maila (SMTP server)',
+ 'MailSendmailError' => 'Problem sa startovanjem mail servera (sendmail)',
+
+ 'SearchTooltip' => 'Pretraži sve filmove', # Accepts model codes
+ 'SearchTitle' => 'Traži film', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'Field to replace',
+ 'QueryReplaceOld' => 'Trenutno ime',
+ 'QueryReplaceNew' => 'Novo ime',
+ 'QueryReplaceLaunch' => 'Replace',
+
+ 'ImportWindowTitle' => 'Odaberi polja koja će se uvesti',
+ 'ImportViewPicture' => 'Vidi sliku',
+ 'ImportSelectAll' => 'Odaberi sve',
+ 'ImportSelectNone' => 'Poništi odabrano',
+
+ 'MultiSiteTitle' => 'Za pretragu koristi ove sajtove',
+ 'MultiSiteUnused' => 'Nekorišćeni dodaci',
+ 'MultiSiteUsed' => 'Koristi ove dodatke',
+ 'MultiSiteLang' => 'Ubaci u listu dodatke na engleskom',
+ 'MultiSiteEmptyError' => 'Lista sajtova je prazna',
+ 'MultiSiteClear' => 'Obriši listu',
+
+ 'DisplayOptionsTitle' => 'Prikaži sledeće',
+ 'DisplayOptionsAll' => 'Odaberi sve',
+ 'DisplayOptionsSearch' => 'Taster pretrage',
+
+ 'GenresTitle' => 'Menjanje Žanrova',
+ 'GenresCategoryName' => 'Žanr',
+ 'GenresCategoryMembers' => 'Umesto žanra',
+ 'GenresLoad' => 'UÄitaj listu',
+ 'GenresExport' => 'SaÄuvaj listu kao fajl',
+ 'GenresModify' => 'Izmeni menjanje žanrova',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..e3173da
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SV::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Inkludera fältens namn på toppen',
+ 'Separator' => 'Separator',
+ 'Replacement' => 'Ersätt separatorn med',
+ 'Charset' => 'Teckenkodning',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..7a19023
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SV::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..7640c9a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::SV::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Ogiltig mall-fil',
+ 'UseFile' => 'Använd nedanstående specificerade fil',
+ 'TemplateExternalFile' => 'Mall-fil',
+ 'WithJS' => 'Använd Javascript',
+ 'FileTemplate' => 'Mall:',
+ 'Preview' => 'Förhandsgranskning',
+ 'NoPreview' => 'Ingen förhandsgranskning tillgänglig',
+ 'Title' => 'Sidans titel',
+ 'InfoFile' => 'Filmlistan är i filen: ',
+ 'InfoDir' => 'Bilder är i: ',
+ 'HeightImg' => 'Höjd (i pixlar) på bilderna som kommer exporteras: ',
+ 'OpenFileInBrowser' => 'Öppna genererad fil i webbläsaren',
+ 'Note' => 'Lista genererad med <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Ange söktext',
+ 'SearchType1' => 'Endast titel',
+ 'SearchType2' => 'Full information',
+ 'SearchButton' => 'Sök',
+ 'SearchTitle' => 'Visa endast filmer som matchar föregående kriterium',
+ 'AllButton' => 'Alla',
+ 'AllTitle' => 'Visa alla filmer',
+ 'Expand' => 'Expandera alla',
+ 'ExpandTitle' => 'Visa information om alla filmer',
+ 'Collapse' => 'Fäll ihop alla',
+ 'CollapseTitle' => 'Fäll ihop information om alla filmer',
+ 'Borrowed' => 'LÃ¥nad av: ',
+ 'NotBorrowed' => 'Tillgänglig',
+ 'Top' => 'Topp',
+ 'Bottom' => 'Botten',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..49fe4bb
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::SV::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..2d80b7a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::SV::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Inkludera DROP instruktionen',
+ 'WithCreate' => 'Inkludera CREATE instruktionen',
+ 'TableName' => 'Tabellnamn',
+ 'InfoFile' => 'SQL fil: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..33e5e4f
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SV::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Arkivet finns i filen: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..b41258f
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::SV::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Mallfil',
+ 'ModelText' => 'Malltext',
+ 'Models' => 'Mall att använda',
+ 'UseFile' => 'Använd filen',
+ 'UseModel' => 'Använd textarea',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..2f3af6b
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::SV::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Var bör sökning ske',
+ 'Default' => 'Förvälj Alexandria\'s katalog',
+ 'Specified' => 'Katalog specifierad nedan',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..e4d3a17
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SV::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Teckenkodning',
+ 'Header' => 'Ignorera första raden',
+ 'Separator' => 'Separator',
+ 'Plugin' => 'Hemsida att använda',
+ 'UseFirst' => 'Välj först en av många resultat',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..112abb1
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SV::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Mapp',
+ 'Recursive' => 'Bläddra undermappar',
+ 'Suffixes' => 'Suffix eller filändelser',
+ 'SuffixesTooltip' => 'En komma-separerad lista av suffix eller filändelser att betrakta',
+ 'Remove' => 'Att ta bort från namn',
+ 'RemoveTooltip' => 'En komma-separerad lista av ord som bör tas bort från filnamn för att skapa de hämtade filnamnen från',
+ 'Ask'=> 'Fråga',
+ 'AskEnd'=> 'Fråga alla vid slute',
+ 'AddWithoutInfo'=> 'Lägg till utan info',
+ 'DontAdd'=> 'Lägg inte till',
+ 'TakeFirst' => 'Välj först',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Ta enbart bort hela ord',
+ 'NoResult'=> 'Inga resultat',
+ 'NoResultTooltip'=> 'Vad skall vi göra när inga sökresultat returneras av plugin:et',
+ 'RemoveTooltipWholeWord' => 'Ord kommer enbart tas bort ifall de förekommer som ett helt ord',
+ 'RemoveRegularExpr' => 'Reguljärt uttryck',
+ 'RemoveTooltipRegularExpr' => 'Tänk på att \'Ta bort från namn\' är ett reguljärt uttryck i perl',
+ 'SkipFileAlreadyInCollection' => 'Lägg enbart till nya filer',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Lägg enbart till filer som inte redan finns i samlingen',
+ 'SkipFileNo' => 'Nej',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'baserad på filnamnet (men uppdatera sökväg i samlingen)',
+ 'InfoFromFileNameRegExp' => 'Parsa filnamn med reguljärt uttryck',
+ 'InfoFromFileNameRegExpTooltip' => 'Använd detta för att införskaffa info från filnamn (tillämpat efter borttagning av ändelse). Lämna tomt ifall ej nödvändig. Kända fält: $T:Titel, $A:Alfabetisk titel, $Y:Releasedatum, $S:Säsong, $E:Episod, $N:Alfabetiskt serienamn, $x:Avsnittsnummer, $y:Totalt antal avsnitt',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..aeeb60a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SV::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Kopiera bilder',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportList.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportList.pm
new file mode 100644
index 0000000..21079f3
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SV::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Namnlista',
+ 'Plugin' => 'Hemsida att använda',
+ 'UseFirst' => 'Välj först en av många resultat',
+ 'CommentAuto' => 'Artikel automatiskt importerad.',
+ 'CommentSite' => 'Hemsida: ',
+ 'CommentTitle' => 'Titel: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..826765a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::SV::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..3ac54f2
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::SV::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Filen är ingen Tellico samling som stöds',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..2ba74e6
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCTVepisodes.pm
@@ -0,0 +1,45 @@
+{
+ package GCLang::SV::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'TV-episod samling',
+ Items => 'Episoder',
+ NewItem => 'Ny episod',
+ NewSeries => 'Nya serier',
+ Episode => 'Episod',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7647402
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCTVseries.pm
@@ -0,0 +1,49 @@
+{
+ package GCLang::SV::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ CollectionDescription => 'TV-serie samling',
+ Items => 'Serier',
+ NewItem => 'Nya serier',
+ Name => 'Namn',
+ Season => 'Säsong',
+ Part => 'Del',
+ Episodes => 'Episod',
+ FirstAired => 'Lanserad',
+ Time => 'Ep. Längd',
+ Producer => 'Producent',
+ Music => 'Musik',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..9ec109b
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::SV::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Brädspelssamling',
+ Items => {0 => 'Spel',
+ 1 => 'Spel',
+ X => 'Spel'},
+ NewItem => 'Nytt spel',
+
+ Id => 'Id',
+ Name => 'Namn',
+ Original => 'Original namn',
+ Box => 'Omslagsbild',
+ DesignedBy => 'Designad av',
+ PublishedBy => 'Utgiven av',
+ Players => 'Antal spelare',
+ PlayingTime => 'Speltid',
+ SuggestedAge => 'Rekommenderad ålder',
+ Released => 'Utgiven',
+ Description => 'Beskrivning',
+ Category => 'Kategori',
+ Mechanics => 'Mekanik',
+ ExpandedBy => 'Expanderad av',
+ ExpansionFor => 'Expansion för',
+ GameFamily => 'Spelfamilj',
+ IllustratedBy => 'Illustrerad av',
+ Url => 'Hemsida',
+ TimesPlayed => 'Antal spelade sessioner',
+ CompleteContents => 'Komplett innehåll',
+ Copies => 'Antal exemplar',
+ Condition => 'Skick',
+ Photos => 'Bilder',
+ Photo1 => 'Första bild',
+ Photo2 => 'Andra bild',
+ Photo3 => 'Tredje bild',
+ Photo4 => 'Fjärde bild',
+ Comments => 'Kommentarer',
+
+ Perfect => 'Perfekt',
+ Good => 'Bra',
+ Average => 'Medel',
+ Poor => 'Undermålig',
+
+ CompleteYes => 'Komplett innehåll',
+ CompleteNo => 'Saknade delar',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+ Personal => 'Personligt',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Betyg _Ã…tminstone...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCbooks.pm b/lib/gcstar/GCLang/SV/GCModels/GCbooks.pm
new file mode 100644
index 0000000..f91e0f1
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::SV::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Boksamling',
+ Items => 'Böcker',
+ NewItem => 'Ny bok',
+
+ Isbn => 'ISBN',
+ Title => 'Titel',
+ Cover => 'Omslag',
+ Authors => 'Författare',
+ Publisher => 'Utgivare',
+ Publication => 'Utgivningsdatum',
+ Language => 'Språk',
+ Genre => 'Genre',
+ Serie => 'Serie',
+ Rank => 'Grad',
+ Bookdescription => 'Beskrivning',
+ Pages => 'Antal sidor',
+ Read => 'Läst',
+ Acquisition => 'Förvärvsdatum',
+ Edition => 'Utgåva',
+ Format => 'Format',
+ Comments => 'Kommentarer',
+ Url => 'Hemsida',
+ Translator => 'Översättare',
+ Artist => 'Illustratör',
+ DigitalFile => 'Digital version',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+
+ ReadNo => 'Ej läst',
+ ReadYes => 'Läst',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCcoins.pm b/lib/gcstar/GCLang/SV/GCModels/GCcoins.pm
new file mode 100644
index 0000000..54027c8
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::SV::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Myntsamling',
+ Items => 'Mynt',
+ NewItem => 'Nytt mynt',
+
+ Name => 'Namn',
+ Country => 'Land',
+ Year => 'Ã…r',
+ Currency => 'Valuta',
+ Value => 'Värde',
+ Picture => 'Huvudbild',
+ Diameter => 'Diameter',
+ Metal => 'Metall',
+ Edge => 'Kant',
+ Edge1 => 'Kant 1',
+ Edge2 => 'Kant 2',
+ Edge3 => 'Kant 3',
+ Edge4 => 'Kant 4',
+ Head => 'Huvud',
+ Tail => 'Baksida',
+ Comments => 'Kommentarer',
+ History => 'Historik',
+ Website => 'Hemsida',
+ Estimate => 'Bedömning',
+ References => 'Referenser',
+ Type => 'Typ',
+ Coin => 'Mynt',
+ Banknote => 'Banknotering',
+
+ Main => 'Huvud',
+ Description => 'Beskrivning',
+ Other => 'Övrig information',
+ Pictures => 'Bilder',
+
+ Condition => 'Tillstånd (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCcomics.pm b/lib/gcstar/GCLang/SV/GCModels/GCcomics.pm
new file mode 100644
index 0000000..f01bb23
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::SV::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCfilms.pm b/lib/gcstar/GCLang/SV/GCModels/GCfilms.pm
new file mode 100644
index 0000000..7075d79
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::SV::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Filmsamling',
+ Items => 'Filmer',
+ NewItem => 'Ny film',
+
+
+ Id => 'Id',
+ Title => 'Titel',
+ Date => 'Datum',
+ Time => 'Längd',
+ Director => 'Regissör',
+ Country => 'Land',
+ MinimumAge => 'Åldersgräns',
+ Genre => 'Genre',
+ Image => 'Bild',
+ Original => 'Original titel',
+ Actors => 'Roller',
+ Actor => 'Skådespelare',
+ Role => 'Roll',
+ Comment => 'Kommentarer',
+ Synopsis => 'Synopsis',
+ Seen => 'Visad',
+ Number => '# av Media',
+ Format => 'Media',
+ Region => 'Region',
+ Identifier => 'Identifierare',
+ Url => 'Hemsida',
+ Audio => 'Ljud',
+ Video => 'Videoformat',
+ Trailer => 'Videofil',
+ Serie => 'Serie',
+ Rank => 'Grad',
+ Subtitles => 'Undertexter',
+
+ SeenYes => 'Visad',
+ SeenNo => 'Ej visad',
+
+ AgeUnrated => 'Ej betygsatt',
+ AgeAll => 'Alla Ã…ldrar',
+ AgeParent => 'Åldersgräns',
+
+ Main => 'Huvudartiklar',
+ General => 'Allmänt',
+ Details => 'Detaljer',
+
+ Information => 'Information',
+ Languages => 'Språk',
+ Encoding => 'Kodning',
+
+ FilterAudienceAge => 'Publik ålder',
+ FilterSeenNo => '_Ännu ej visad',
+ FilterSeenYes => '_Redan visad',
+ FilterRatingSelect => 'Betyg _Ã…tminstone...',
+
+ ExtractSize => 'Storlek',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCgames.pm b/lib/gcstar/GCLang/SV/GCModels/GCgames.pm
new file mode 100644
index 0000000..f708e93
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::SV::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Videospelsamling',
+ Items => 'Spel',
+ NewItem => 'Nytt spel',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Namn',
+ Platform => 'Plattform',
+ Players => 'Antal spelare',
+ Released => 'Releasedatum',
+ Editor => 'Utgivare',
+ Developer => 'Utvecklare',
+ Genre => 'Genre',
+ Box => 'Omslagsbild',
+ Case => 'Fodral',
+ Manual => 'Instruktionsmanual',
+ Completion => 'Fullständighet (%)',
+ Executable => 'Startfil',
+ Description => 'Beskrivning',
+ Codes => 'Koder',
+ Code => 'Kod',
+ Effect => 'Effekt',
+ Secrets => 'Hemligheter',
+ Screenshots => 'Bilder',
+ Screenshot1 => 'Första bild',
+ Screenshot2 => 'Andra screenshot',
+ Comments => 'Kommentarer',
+ Url => 'Hemsida',
+ Unlockables => 'Upplåsningar',
+ Unlockable => 'Upplåsningsbar',
+ Howto => 'Hur låsa upp',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+ Tips => 'Tips',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Betyg _Ã…tminstone...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..4d52094
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::SV::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCminicars.pm b/lib/gcstar/GCLang/SV/GCModels/GCminicars.pm
new file mode 100644
index 0000000..16b8ec9
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::SV::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCmusics.pm b/lib/gcstar/GCLang/SV/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f85eca9
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::SV::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Musiksamling',
+ Items => 'Album',
+ NewItem => 'Nytt album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Titel',
+ Cover => 'Omslag',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Speltid',
+ Release => 'Releasedatum',
+ Genre => 'Genre',
+ Origin => 'Ursprung',
+
+#For tracks list
+ Tracks => 'LÃ¥tlista',
+ Number => 'Nummer',
+ Track => 'Titel',
+ Time => 'Tid',
+
+ Composer => 'Kompositör',
+ Producer => 'Producent',
+ Playlist => 'Spellista',
+ Comments => 'Kommentarer',
+ Label => 'Beteckning',
+ Url => 'Hemsida',
+
+ General => 'Allmänt',
+ Details => 'Detaljer',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..e42b68a
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::SV::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Tidsskriftssamling',
+ Items => {0 => 'Tidsskrift',
+ 1 => 'Tidsskrift',
+ X => 'Tidsskrifter'},
+ NewItem => 'Ny Tidsskrift',
+
+ Title => 'Titel',
+ Cover => 'Omslag',
+ Periodical => 'Tidsskrift',
+ Number => 'Nummer',
+ Date => 'Datum',
+ Subject => 'Ämne',
+ Articles => 'Artiklar',
+
+ General => 'Allmänt',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..6cc88b1
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::SV::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..15ce1d0
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::SV::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCstamps.pm b/lib/gcstar/GCLang/SV/GCModels/GCstamps.pm
new file mode 100644
index 0000000..b6e8348
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::SV::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Frimärkssamling',
+ Items => {0 => 'Frimärken',
+ 1 => 'Frimärke',
+ X => 'Frimärken'},
+ NewItem => 'Nytt frimärke',
+
+ General => 'Allmänt',
+ Detail => 'Detaljerat',
+ Value => 'Värde',
+ Notes => 'Noteringar',
+ Views => 'Vyer',
+
+ Name => 'Namn',
+ Country => 'Land',
+ Year => 'Ã…r',
+ Catalog => 'Katalog',
+ Number => 'Nummer',
+ Topic => 'Ämne',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Graverad av',
+ Type => 'Typ',
+ Format => 'Format',
+ Description => 'Beskrivning',
+ Color => 'Färg',
+ Gum => 'Klister',
+ Paper => 'Papper',
+ Perforation => 'Tandning',
+ PerforationSize => 'Tandningens storlek',
+ CancellationType => 'Typ av stämpel',
+ Comments => 'Kommentarer',
+ PrintingVariety => 'Form av tryck',
+ IssueDate => 'Datum för utfärdande',
+ EndOfIssue => 'Slut för utfärdande',
+ Issue => 'Utfärdande',
+ Grade => 'Sortering',
+ Status => 'Status',
+ Adjusted => 'Anpassad',
+ Cancellation => 'Stämpel',
+ CancellationCondition => 'Stämpelns skick',
+ GumCondition => 'Klistrets skick',
+ PerforationCondition => 'Tandningens skick',
+ ConditionNotes => 'Notering av skick',
+ Error => 'Fel',
+ ErrorNotes => 'Notering av fel',
+ FaceValue => 'Ansiktsvärde',
+ MintValue => 'Myntvärde',
+ UsedValue => 'Begagnatvärde',
+ PurchasedDate => 'Införskaffad datum',
+ Quantity => 'Kvantitet',
+ History => 'Historia',
+ Picture1 => 'Bild 1',
+ Picture2 => 'Bild 2',
+ Picture3 => 'Bild 3',
+
+ AirMail => 'Flygpost',
+ MilitaryStamp => 'Militärt frimärke',
+ Official => 'Officiell',
+ PostageDue => 'Postat den',
+ Regular => 'Vanlig',
+ Revenue => 'Intäkt',
+ SpecialDelivery => 'Special leverans',
+ StrikeStamp => 'Strejk frimärke',
+ TelegraphStamp => 'Telegraf frimärke',
+ WarStamp => 'Krigsfrimärke',
+ WarTaxStamp => 'Krigsskattefrimärke',
+
+ Booklet => 'Häfte',
+ BookletPane => 'Panel för häfte',
+ Card => 'Kort',
+ Coil => 'Rulle',
+ Envelope => 'Kuvert',
+ FirstDayCover => 'Första omslag',
+ Sheet => 'Blad',
+ Single => 'Singel',
+
+ Heliogravure => 'Heliogravyr',
+ Lithography => 'Litografi',
+ Offset => 'Utjämning',
+ Photogravure => 'Fotogravyr',
+ RecessPrinting => 'Fördjupningstryck',
+ Typography => 'Typografi',
+
+ OriginalGum => 'Originalklister',
+ Ungummed => 'Oklistrad',
+ Regummed => 'Omklistrad',
+
+ Chalky => 'Kritad',
+ ChinaPaper => 'Kinapapper',
+ Coarsed => 'Ojämn',
+ Glossy => 'Blank',
+ Granite => 'Granit',
+ Laid => 'Dämpad',
+ Manila => 'Manillapapper',
+ Native => 'Naturlig',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Randig',
+ Rice => 'Ris',
+ Silk => 'Silke',
+ Smoothed => 'Jämn',
+ Thick => 'Tjock',
+ Thin => 'Tunn',
+ Wove => 'VÃ¥gig',
+
+ CoarsedPerforation => 'Ojämn tandning',
+ CombPerforation => 'Bruten tandning',
+ CompoundPerforation => 'Sammansatt tandning',
+ DamagedPerforation => 'Skadad tandning',
+ DoublePerforation => 'Dubbeltandning',
+ HarrowPerforation => 'Harvig tandning',
+ LinePerforation => 'Linjerad tandning',
+ NoPerforation => 'Ingen tandning',
+
+ CancellationToOrder => 'Stämpel att beställa',
+ FancyCancellation => 'Dekorerad stämpel',
+ FirstDayCancellation => 'Första stämpeln',
+ NumeralCancellation => 'Numerisk stämpel',
+ PenMarked => 'Pennmarkerad',
+ RailroadCancellation => 'Tågstämpel',
+ SpecialCancellation => 'Specialstämpel',
+
+ Superb => 'Super',
+ ExtraFine => 'Extra Fin',
+ VeryFine => 'Väldigt fin',
+ FineVeryFine => 'Fin/Väldigt fin',
+ Fine => 'Fin',
+ Average => 'Medel',
+ Poor => 'DÃ¥lig',
+
+ Owned => 'Ägd',
+ Ordered => 'Beställd',
+ Sold => 'SÃ¥ld',
+ ToSell => 'Att sälja',
+ Wanted => 'Vill ha',
+
+ LightCancellation => 'Lätt stämplad',
+ HeavyCancellation => 'Hårt stämplad',
+ ModerateCancellation => 'Medelstämplad',
+
+ MintNeverHinged => 'Mynt aldrig fäst',
+ MintLightHinged => 'Mynt lätt fäst',
+ HingedRemnant => 'Lämpligt fäst',
+ HeavilyHinged => 'Väldigt fäst',
+ LargePartOriginalGum => 'Stor del original klister',
+ SmallPartOriginalGum => 'Liten del original klister',
+ NoGum => 'Inget klister',
+
+ Perfect => 'Perfekt',
+ VeryNice => 'Väldigt bra',
+ Nice => 'Bra',
+ Incomplete => 'Ej komplett',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCModels/GCwines.pm b/lib/gcstar/GCLang/SV/GCModels/GCwines.pm
new file mode 100644
index 0000000..96dfae3
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::SV::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/SV/GCstar.pm b/lib/gcstar/GCLang/SV/GCstar.pm
new file mode 100644
index 0000000..6cad462
--- /dev/null
+++ b/lib/gcstar/GCLang/SV/GCstar.pm
@@ -0,0 +1,670 @@
+{
+ package GCLang::SV; # Use the swedish language package
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Svenska',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Varning</b>:
+
+Information nerladdad från hemsidor (genom söktilläggen) är <b>enbart för privat bruk</b>.
+
+Alla nydistribueringar är förbjudna utan respektive hemsidors <b>explicita medgivande</b>.
+
+För att avgöra vilken hemsida som äger informationen, så kan du använda <b>knappen under artikelns detaljer</b>.',
+
+ 'AllItemsFiltered' => 'Inga artiklar matchar ditt filteringskriterium', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Installera i ',
+ 'InstallMandatory' => 'Nödvändiga komponenter',
+ 'InstallOptional' => 'Valfria komponenter',
+ 'InstallErrorMissing' => 'Fel : Följande Perl komponenter måste installeras',
+ 'InstallPrompt' => 'Grundkatalog för installation [/usr/local]: ',
+ 'InstallEnd' => 'Installationen slutförd',
+ 'InstallNoError' => 'Inga fel påträffades',
+ 'InstallLaunch' => 'För att starta programmet, så kan du starta ',
+ 'InstallDirectory' => 'Grundkatalog',
+ 'InstallTitle' => 'GCstar installation',
+ 'InstallDependencies' => 'Beroenden',
+ 'InstallPath' => 'Sökväg',
+ 'InstallOptions' => 'Inställningar',
+ 'InstallSelectDirectory' => 'Välj grundkatalog för installationen',
+ 'InstallWithClean' => 'Ta bort filer som hittats i installationskatalogen',
+ 'InstallWithMenu' => 'Lägg till GCstar till Program-menyn',
+ 'InstallNoPermission' => 'Fel: Du har inte rättighet att skriva till vald katalog',
+ 'InstallMissingMandatory' => 'Nödvändiga beroenden fattas. Du kommer inte kunna installera GCstar förrän de har lagts till i ditt system.',
+ 'InstallMissingOptional' => 'Valfria beroenden fattas. De är listade under. GCstar kommer att installeras men viss funktionalitet kommer inte vara tillgänglig.',
+ 'InstallMissingNone' => 'Inga beroenden fattas. Du bör fortsätta installationen av GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'Fattas',
+ 'InstallMissingFor' => 'Fattas för',
+ 'InstallCleanDirectory' => 'Tar bort GCstar\'s filer i katalogen: ',
+ 'InstallCopyDirectory' => 'Kopiera filer i katalogen: ',
+ 'InstallCopyDesktop' => 'Kopiera skrivbordsfilen i: ',
+
+#Update
+ 'UpdateUseProxy' => 'Proxy att använda (Tryck bara enter om ingen): ',
+ 'UpdateNoPermission' => 'Skrivrättighet nekad i denna katalog: ',
+ 'UpdateNone' => 'Inga updateringar har hittats',
+ 'UpdateFileNotFound' => 'Filen ej hittad',
+
+#Splash
+ 'SplashInit' => 'Initiering',
+ 'SplashLoad' => 'Laddar Samling',
+ 'SplashDisplay' => 'Visar Samling',
+ 'SplashSort' => 'Sorterar samling',
+ 'SplashDone' => 'Färdig',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Det verkar som du använt GCfilms tidigare. Vad vill du importera från GCfilms till GCstar (det kommer inte att påverka GCfilms ifall du fortfarande vill använda det)?',
+ 'GCfilmsImportOptions' => 'Inställningar',
+ 'GCfilmsImportData' => 'Filmlista',
+
+#Menus
+ 'MenuFile' => '_Arkiv',
+ 'MenuNewList' => '_Ny Samling',
+ 'MenuStats' => 'Statistik',
+ 'MenuHistory' => '_Tidigare Samlingar',
+ 'MenuLend' => 'Visa _LÃ¥nade Artiklar', # Accepts model codes
+ 'MenuImport' => '_Importera',
+ 'MenuExport' => '_Exportera',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_Redigera',
+ 'MenuDuplicate' => 'Ko_piera artikel', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Ta bort artikel', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Ändra samlingens fält',
+ 'MenuEditLockItems' => '_LÃ¥s Samling',
+
+ 'MenuDisplay' => 'F_ilter',
+ 'MenuSavedSearches' => 'Sparade sökningar',
+ 'MenuSavedSearchesSave' => 'Spara aktuell sökning',
+ 'MenuSavedSearchesEdit' => 'Modifiera sparade sökningar',
+ 'MenuAdvancedSearch' => 'A_vancerad Sök',
+ 'MenuViewAllItems' => 'Visa _Alla artiklar', # Accepts model codes
+ 'MenuNoFilter' => '_NÃ¥gon',
+
+ 'MenuConfiguration' => '_Inställningar',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Visad Information',
+ 'MenuBorrowers' => '_LÃ¥ntagare',
+ 'MenuToolbarConfiguration' => '_Verktygsfältets kontroller',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Genre _Konvertering',
+
+ 'MenuBookmarks' => 'Mina _Samlingar',
+ 'MenuBookmarksAdd' => '_Lägg till aktuell samling',
+ 'MenuBookmarksEdit' => '_Redigera sparade samlingar',
+
+ 'MenuHelp' => '_Hjälp',
+ 'MenuHelpContent' => '_Innehåll',
+ 'MenuAllPlugins' => 'Visa _tillägg',
+ 'MenuBugReport' => 'Rapportera en _bugg',
+ 'MenuAbout' => '_Om GCstar',
+
+ 'MenuNewWindow' => 'Visa artikel i _Nytt Fönster', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Expandera alla',
+ 'ContextCollapseAll' => 'Komprimera alla',
+ 'ContextChooseImage' => 'Välj _Bild',
+ 'ContextImageEditor' => 'Öppna med Bildredigerare',
+ 'ContextOpenWith' => 'Öppna me_d',
+ 'ContextImgFront' => 'Framsida',
+ 'ContextImgBack' => 'Baksida',
+ 'ContextChooseFile' => 'Välj en Fil',
+ 'ContextChooseFolder' => 'Välj en Mapp',
+
+ 'DialogEnterNumber' => 'Var god ange ett värde',
+
+ 'RemoveConfirm' => 'Är du säker på att du vill ta bort denna artikel?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Ny artikel', # Accepts model codes
+ 'NewItemTooltip' => 'Lägg till en ny artikel', # Accepts model codes
+ 'NoItemFound' => 'Ingenting hittades. Vill du söka på en annan hemsida?',
+ 'OpenList' => 'Var god välj samling',
+ 'SaveList' => 'Var god välj vart du vill spara samlingen',
+ 'SaveListTooltip' => 'Spara aktuell samling',
+ 'SaveUnsavedChanges' => 'Det finns osparade ändringar i din samling. Vill du spara dem?',
+ 'SaveDontSave' => 'Spara inte',
+ 'PreferencesTooltip' => 'Ställ in dina inställningar',
+ 'ViewTooltip' => 'Ändra samlingsvisning',
+ 'PlayTooltip' => 'Spela video associerad med artikel', # Accepts model codes
+ 'PlayFileNotFound' => 'Filen att spela hittades ej på denna platsen:',
+ 'PlayRetry' => 'Försök igen',
+
+ 'StatusSave' => 'Sparar...',
+ 'StatusLoad' => 'Laddar...',
+ 'StatusSearch' => 'Sökning pågår...',
+ 'StatusGetInfo' => 'Hämtar information...',
+ 'StatusGetImage' => 'Hämtar bild...',
+
+ 'SaveError' => 'Artikellistan kunde inte sparas. Var god kontrollera rättigheter och ledigt diskutrymme.',
+ 'OpenError' => 'Artikellistan kunde inte öppnas. Var god kontrollera rättigheter.',
+ 'OpenFormatError' => 'Artikellistan kunde inte öppnas. Formatet kan vara felaktigt.',
+ 'OpenVersionWarning' => 'Samlingen är skapad med en nyare version av GCstar. Om du sparar den, kan dataförlust ske.',
+ 'OpenVersionQuestion' => 'Vill du fortfarande fortsätta?',
+ 'ImageError' => 'Vald katalog att spara bilder till är felaktig. Var god välj en annan.',
+ 'OptionsCreationError'=> 'Kan inte skapa inställningsfil: ',
+ 'OptionsOpenError'=> 'Kan inte öppna inställningsfil: ',
+ 'OptionsSaveError'=> 'Kan inte spara inställningsfil: ',
+ 'ErrorModelNotFound' => 'Modell ej funnen: ',
+ 'ErrorModelUserDir' => 'Användardefinierade modeller finns i: ',
+
+ 'RandomTooltip' => 'Vad ska vi se ikväll ?',
+ 'RandomError'=> 'Du har inga artiklar som kan bli valda', # Accepts model codes
+ 'RandomEnd'=> 'Det finns inga fler artiklar', # Accepts model codes
+ 'RandomNextTip'=> 'Nästa förslag',
+ 'RandomOkTip'=> 'Acceptera denna artikel',
+
+ 'AboutTitle' => 'Om GCstar',
+ 'AboutDesc' => 'Samlingshanterare',
+ 'AboutVersion' => 'Version',
+ 'AboutTeam' => 'Team',
+ 'AboutWho' => 'Christian Jodar (Tian): Projektföreståndare, Programmerare
+Nyall Dawson (Zombiepig): Programmerare
+TPF: Programmerare
+Adolfo González: Programmerare
+',
+ 'AboutLicense' => 'Distribuerad under GNU GPL Licensen, Logotyper Copyright le Spektre',
+ 'AboutTranslation' => 'Svensk översättning av anonym medarbetare',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logotyper och webbdesign skapad av le Spektre',
+
+ 'ToolbarRandom' => 'Ikväll',
+
+ 'UnsavedCollection' => 'Osparad samling',
+ 'ModelsSelect' => 'Välj en samlingstyp',
+ 'ModelsPersonal' => 'Personliga samlingar',
+ 'ModelsDefault' => 'Förvalda samlingar',
+ 'ModelsList' => 'Samlingsdefinition',
+ 'ModelSettings' => 'Samlingsinställningar',
+ 'ModelNewType' => 'Ny samlingstyp',
+ 'ModelName' => 'Namn på samlingstyp:',
+ 'ModelFields' => 'Fält',
+ 'ModelOptions' => 'Inställningar',
+ 'ModelFilters' => 'Filter',
+ 'ModelNewField' => 'Nytt fält',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Beteckning:',
+ 'ModelFieldType' => 'Typ:',
+ 'ModelFieldGroup' => 'Grupp:',
+ 'ModelFieldValues' => 'Värden',
+ 'ModelFieldInit' => 'Förvalt:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Värdelista:',
+ 'ModelFieldListLegend' => '<i>Separerat med komma</i>',
+ 'ModelFieldDisplayAs' => 'Visa som: ',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Värdering',
+ 'ModelFieldTypeShortText' => 'Kort text',
+ 'ModelFieldTypeLongText' => 'LÃ¥ng text',
+ 'ModelFieldTypeYesNo' => 'Ja/Nej',
+ 'ModelFieldTypeNumber' => 'Nummer',
+ 'ModelFieldTypeDate' => 'Datum',
+ 'ModelFieldTypeOptions' => 'Fördefinierad värdelista',
+ 'ModelFieldTypeImage' => 'Bild',
+ 'ModelFieldTypeSingleList' => 'Enkel lista',
+ 'ModelFieldTypeFile' => 'Fil',
+ 'ModelFieldTypeFormatted' => 'Beroende av andra fält',
+ 'ModelFieldParameters' => 'Parametrar',
+ 'ModelFieldHasHistory' => 'Använd historik',
+ 'ModelFieldFlat' => 'Visa på en rad',
+ 'ModelFieldStep' => 'Öka steg:',
+ 'ModelFieldFileFormat' => 'Filformat:',
+ 'ModelFieldFileFile' => 'Enkel fil',
+ 'ModelFieldFileImage' => 'Bild',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Ljud',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'Länk',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fält att använda',
+ 'ModelOptionsFieldsAuto' => 'Automatisk',
+ 'ModelOptionsFieldsNone' => 'Ingen',
+ 'ModelOptionsFieldsTitle' => 'Som titel',
+ 'ModelOptionsFieldsId' => 'Som identifierare',
+ 'ModelOptionsFieldsCover' => 'Som omslag',
+ 'ModelOptionsFieldsPlay' => 'För Spelaknapp',
+ 'ModelCollectionSettings' => 'Samlingsinställningar',
+ 'ModelCollectionSettingsLending' => 'Artiklar kan bli utlånade',
+ 'ModelCollectionSettingsTagging' => 'Produkter kan bli märkta',
+ 'ModelFilterActivated' => 'Bör vara i sökrutan',
+ 'ModelFilterComparison' => 'Jämförelser',
+ 'ModelFilterContain' => 'Innehåller',
+ 'ModelFilterDoesNotContain' => 'Innehåller ej',
+ 'ModelFilterRegexp' => 'Reguljära uttryck',
+ 'ModelFilterRange' => 'Räckvidd',
+ 'ModelFilterNumeric' => 'Jämförelsen är numerisk',
+ 'ModelFilterQuick' => 'Skapa ett snabbt filter',
+ 'ModelTooltipName' => 'Använd ett namn för att återanvända denna modell för många samlingar. Om den är tom, så kommer inställningarna sparas direkt i själva samlingen',
+ 'ModelTooltipLabel' => 'Fältnamnet såsom den kommer visas',
+ 'ModelTooltipGroup' => 'Används för att gruppera fält. Artiklar utan värden här kommer att vara i den förinställda gruppen',
+ 'ModelTooltipHistory' => 'Bör de tidigare angivna värdena sparas i en lista associerad till fältet',
+ 'ModelTooltipFormat' => 'Detta format används för att avgöra hur filen skall öppnas med Spelaknappen',
+ 'ModelTooltipLending' => 'Detta kommer att lägga till några fält för att hantera utlåningar',
+ 'ModelTooltipTagging' => 'Detta kommer lägga till några fält för att hantera märkning',
+ 'ModelTooltipNumeric' => 'Bör värdena anses som nummer för jämförelse',
+ 'ModelTooltipQuick' => 'Detta kommer lägga till en undermeny i Filtermenyn',
+
+ 'ResultsTitle' => 'Välj en artikel', # Accepts model codes
+ 'ResultsNextTip' => 'Sök på nästa hemsida',
+ 'ResultsPreview' => 'Förhandsgranska',
+ 'ResultsInfo' => 'Du kan lägga till flera produkter till en samling genom att hålla ner Ctrl- eller Skift-tangenten för att markera dem', # Accepts model codes
+
+ 'OptionsTitle' => 'Inställningar',
+ 'OptionsExpertMode' => 'Expert Läge',
+ 'OptionsPrograms' => 'Specifiera program att använda med övrig media, lämna tomt för att använda systemets inställningar.',
+ 'OptionsBrowser' => 'Webbläsare',
+ 'OptionsPlayer' => 'Videospelare',
+ 'OptionsAudio' => 'Ljudspelare',
+ 'OptionsImageEditor' => 'Bildredigerare',
+ 'OptionsCdDevice' => 'CD enhet',
+ 'OptionsImages' => 'Bildkatalog',
+ 'OptionsUseRelativePaths' => 'Använd relativa sökvägar för bilder',
+ 'OptionsLayout' => 'Layout',
+ 'OptionsStatus' => 'Visa statusfält',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Varning: Ändringar i denna flik kommer ej ta effekt förrän applikationen startas om.',
+ 'OptionsRemoveConfirm' => 'Fråga efter godkännande innan artikel tas bort',
+ 'OptionsAutoSave' => 'Spara samling automatiskt',
+ 'OptionsAutoLoad' => 'Ladda senast valda samling vid uppstart',
+ 'OptionsSplash' => 'Visa splash screen',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Använd stavningskontroll för långa textfält',
+ 'OptionsProgramTitle' => 'Välj program att använda',
+ 'OptionsPlugins' => 'Hemsida att hämta data från',
+ 'OptionsAskPlugins' => 'Fråga (Alla hemsidor)',
+ 'OptionsPluginsMulti' => 'MÃ¥nga hemsidor',
+ 'OptionsPluginsMultiAsk' => 'Fråga (Många hemsidor)',
+ 'OptionsPluginsMultiPerField' => 'Många sajter (per fält)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Många sajter per ordning av valt fäl',
+ 'OptionsPluginsMultiPerFieldDesc' => 'För varje fält kommer vi fylla i fältet med den första icke-tomma informationen med början från vänster',
+ 'OptionsPluginsMultiPerFieldFirst' => 'Första',
+ 'OptionsPluginsMultiPerFieldLast' => 'Sista',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Ta bort',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Töm valda fältlistor',
+ 'OptionsPluginsList' => 'Välj lista',
+ 'OptionsAskImport' => 'Välj fält som ska importeras',
+ 'OptionsProxy' => 'Använd en proxy',
+ 'OptionsCookieJar' => 'Använd denna kak-jarfil',
+ 'OptionsLang' => 'Språk',
+ 'OptionsMain' => 'Huvud',
+ 'OptionsPaths' => 'Sökväg',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'Funktioner',
+ 'OptionsDisplay' => 'Visning',
+ 'OptionsToolbar' => 'Verktygsfält',
+ 'OptionsToolbars' => {0 => 'Inget', 1 => 'Litet', 2 => 'Stort', 3 => 'Systeminställningar'},
+ 'OptionsToolbarPosition' => 'Position',
+ 'OptionsToolbarPositions' => {0 => 'Topp', 1 => 'Botten', 2 => 'Vänster', 3 => 'Höger'},
+ 'OptionsExpandersMode' => 'För lång expanderare',
+ 'OptionsExpandersModes' => {'asis' => 'Gör ingenting', 'cut' => 'Klipp ut', 'wrap' => 'Radbrytning'},
+ 'OptionsDateFormat' => 'Datumformat',
+ 'OptionsDateFormatTooltip' => 'Formatet är det som används av strftime(3). Standard är %d/%m/%y',
+ 'OptionsView' => 'Artikellista',
+ 'OptionsViews' => {0 => 'Text', 1 => 'Bild', 2 => 'Detaljerat'},
+ 'OptionsColumns' => 'Kolumner',
+ 'OptionsMailer' => 'E-post',
+ 'OptionsSMTP' => 'Server',
+ 'OptionsFrom' => 'Din e-post',
+ 'OptionsTransform' => 'Placera artiklar i slutet av titlarna',
+ 'OptionsArticles' => 'Artiklar (Separerat med komma)',
+ 'OptionsSearchStop' => 'Tillåt att pågående sökning avbryts',
+ 'OptionsBigPics' => 'Använd stora bilder om möjligt',
+ 'OptionsAlwaysOriginal' => 'Använd huvudtitels som förvald titel om ingen finns',
+ 'OptionsRestoreAccelerators' => 'Återställ acceleratorer',
+ 'OptionsHistory' => 'Storlek av histori',
+ 'OptionsClearHistory' => 'Töm historik',
+ 'OptionsStyle' => 'Skal',
+ 'OptionsDontAsk' => 'Fråga inte längre',
+ 'OptionsPathProgramsGroup' => 'Program',
+ 'OptionsProgramsSystem' => 'Använd program som är definierade av systemet',
+ 'OptionsProgramsUser' => 'Använd specificerade program',
+ 'OptionsProgramsSet' => 'Ställ in program',
+ 'OptionsPathImagesGroup' => 'Bilder',
+ 'OptionsInternetDataGroup' => 'Importera data',
+ 'OptionsInternetSettingsGroup' => 'Inställningar',
+ 'OptionsDisplayInformationGroup' => 'Informationsvisning',
+ 'OptionsDisplayArticlesGroup' => 'Artiklar',
+ 'OptionsImagesDisplayGroup' => 'Visning',
+ 'OptionsImagesStyleGroup' => 'Stil',
+ 'OptionsDetailedPreferencesGroup' => 'Inställningar',
+ 'OptionsFeaturesConveniencesGroup' => 'Bekvämlighet',
+ 'OptionsPicturesFormat' => 'Prefix att använda för bilder:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Titel eller namn att associera med artikel',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% eller . kommer att ersättas med samlingskatalogen (använd bara början av sökvägen)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% kommer att ersättas med samlingsfilnamnet utan suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% kan enbart användas i början av sökvägen för bilder',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% kan enbart användas i början av sökvägen för bilder',
+ 'OptionsConfigureMailers' => 'Konfigurera e-postklienter',
+
+ 'ImagesOptionsButton' => 'Inställningar',
+ 'ImagesOptionsTitle' => 'Inställningar för bildlistan',
+ 'ImagesOptionsSelectColor' => 'Välj en färg',
+ 'ImagesOptionsUseOverlays' => 'Använd bildöverdrag',
+ 'ImagesOptionsBg' => 'Bakgrund',
+ 'ImagesOptionsBgPicture' => 'Använd en bakgrundsbild',
+ 'ImagesOptionsFg'=> 'Markering',
+ 'ImagesOptionsBgTooltip' => 'Ändra bakgrundsfärg',
+ 'ImagesOptionsFgTooltip'=> 'Ändra markeringsfärg',
+ 'ImagesOptionsResizeImgList' => 'Ändra automatiskt antalet kolumner',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Storlek',
+ 'ImagesOptionsSizeList' => {0 => 'Väldigt liten', 1 => 'Liten', 2 => 'Mellan', 3 => 'Stor', 4 => 'Extra Stor'},
+ 'ImagesOptionsSizeTooltip' => 'Välj en bildstorlek',
+
+ 'DetailedOptionsTitle' => 'Inställningar för detaljerad lista',
+ 'DetailedOptionsImageSize' => 'Bildstorlek',
+ 'DetailedOptionsGroupItems' => 'Gruppera artiklar efter',
+ 'DetailedOptionsSecondarySort' => 'Sortera fält för barn',
+ 'DetailedOptionsFields' => 'Välj fält att visa',
+ 'DetailedOptionsGroupedFirst' => 'Gruppera alla artiklar som har barn',
+ 'DetailedOptionsAddCount' => 'Ange antalet element för kategorier',
+
+ 'ExtractButton' => 'Information',
+ 'ExtractTitle' => 'Filinformation',
+ 'ExtractImport' => 'Använd värden',
+
+ 'FieldsListOpen' => 'Ladda en fältlista från en fil',
+ 'FieldsListSave' => 'Spara fältlista till en fil',
+ 'FieldsListError' => 'Dessa fältlistor kan inte användas med denna typ av samling',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Exportera artikellista',
+ 'ExportFilter' => 'Exportera enbart visade artiklar',
+ 'ExportFieldsTitle' => 'Fält som kommer exporteras',
+ 'ExportFieldsTip' => 'Välj fält som du vill exportera',
+ 'ExportWithPictures' => 'Kopiera bilder i en underkatalog',
+ 'ExportSortBy' => 'Sortera på',
+ 'ExportOrder' => 'Ordning',
+
+ 'ImportListTitle' => 'Importa en annan artikellista',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Fil',
+ 'ImportExportFieldsUnused' => 'Osparade fält',
+ 'ImportExportFieldsUsed' => 'Använda fält',
+ 'ImportExportFieldsFill' => 'Lägg till Alla',
+ 'ImportExportFieldsClear' => 'Ta bort Alla',
+ 'ImportExportFieldsEmpty' => 'Du måste välja minst ett fält',
+ 'ImportExportFileEmpty' => 'Du måste specificera ett filnamn',
+ 'ImportFieldsTitle' => 'Fält som kommer importeras',
+ 'ImportFieldsTip' => 'Välj fält du vill importera',
+ 'ImportNewList' => 'Skapa en ny samling',
+ 'ImportCurrentList' => 'Lägg till aktuell samling',
+ 'ImportDropError' => 'Det uppstod ett fel med att öppna åtminstone en fil. Föregående lista kommer laddas om.',
+ 'ImportGenerateId' => 'Generera identifierare för varje artikel',
+
+ 'FileChooserOpenFile' => 'Var god välj en fil att använda',
+ 'FileChooserDirectory' => 'Mapp',
+ 'FileChooserOpenDirectory' => 'Välj en katalog',
+ 'FileChooserOverwrite' => 'Den här filen existerar redan. Vill du skriva över den?',
+ 'FileAllFiles' => 'Alla Filer',
+ 'FileVideoFiles' => 'Video Filer',
+ 'FileEbookFiles' => 'Ebook Filer',
+ 'FileAudioFiles' => 'Audio Filer',
+ 'FileGCstarFiles' => 'GCstar Samlingar',
+
+ #Some default panels
+ 'PanelCompact' => 'Kompakt',
+ 'PanelReadOnly' => 'Enbart läsning',
+ 'PanelForm' => 'Flikar',
+
+ 'PanelSearchButton' => 'Hämta Information',
+ 'PanelSearchTip' => 'Sök webben för information om detta namn',
+ 'PanelSearchContextChooseOne' => 'Välj en sajt...',
+ 'PanelSearchContextMultiSite' => 'Använd "Många sajter"',
+ 'PanelSearchContextMultiSitePerField' => 'Använd "Många sajter per fält"',
+ 'PanelSearchContextOptions' => 'Ändra inställningar...',
+ 'PanelImageTipOpen' => 'Klicka på bilden för att välja en annan.',
+ 'PanelImageTipView' => 'Klicka på bilden för att visa den i dess riktiga storlek.',
+ 'PanelImageTipMenu' => ' Högerklicka för ytterligare alternativ.',
+ 'PanelImageTitle' => 'Välj en bild',
+ 'PanelImageNoImage' => 'Ingen bild',
+ 'PanelSelectFileTitle' => 'Välj en fil',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Återställ förvald',
+ 'PanelRefresh' => 'Uppdatera',
+ 'PanelRefreshTip' => 'Uppdatera information från webben',
+
+ 'PanelFrom' =>'Från',
+ 'PanelTo' =>'Till',
+
+ 'PanelWeb' => 'Visa Information',
+ 'PanelWebTip' => 'Visa information på webben om denna artikel', # Accepts model codes
+ 'PanelRemoveTip' => 'Ta bort aktuell artikel', # Accepts model codes
+
+ 'PanelDateSelect' => 'Välj',
+ 'PanelNobody' => 'Ingen',
+ 'PanelUnknown' => 'Okänd',
+ 'PanelAdded' => 'Lägg till datum',
+ 'PanelRating' => 'Betyg',
+ 'PanelPressRating' => 'Klicka i betyg',
+ 'PanelLocation' => 'Lokalisering',
+
+ 'PanelLending' => 'Utlåning',
+ 'PanelBorrower' => 'LÃ¥ntagare',
+ 'PanelLendDate' => 'Utlånad sedan',
+ 'PanelHistory' => 'Utlåningshistorik',
+ 'PanelReturned' => 'Artikel Returnerad', # Accepts model codes
+ 'PanelReturnDate' => 'Returnerad datum',
+ 'PanelLendedYes' => 'LÃ¥nad',
+ 'PanelLendedNo' => 'Tillgänglig',
+
+ 'PanelTags' => 'Etikett',
+ 'PanelFavourite' => 'Favorit',
+ 'TagsAssigned' => 'Tilldelad etikett',
+
+ 'PanelUser' => 'Användarfält',
+
+ 'CheckUndef' => 'BÃ¥de',
+ 'CheckYes' => 'Ja',
+ 'CheckNo' => 'Nej',
+
+ 'ToolbarAll' => 'Visa Alla',
+ 'ToolbarAllTooltip' => 'Visa alla artiklar',
+ 'ToolbarGroupBy' => 'Gruppera på',
+ 'ToolbarGroupByTooltip' => 'Välj det fält att använda för att gruppera artiklar i listan',
+ 'ToolbarQuickSearch' => 'Snabbsök',
+ 'ToolbarQuickSearchLabel' => 'Sök',
+ 'ToolbarQuickSearchTooltip' => 'Markera fältet att söka i. Ange sökord och tryck Enter',
+ 'ToolbarSeparator' => ' Avskiljare',
+
+ 'PluginsTitle' => 'Sök en artikel',
+ 'PluginsQuery' => 'Förfrågan',
+ 'PluginsFrame' => 'Sök hemsida',
+ 'PluginsLogo' => 'Logotyp',
+ 'PluginsName' => 'Namn',
+ 'PluginsSearchFields' => 'Sök fält',
+ 'PluginsAuthor' => 'Författare',
+ 'PluginsLang' => 'Språk',
+ 'PluginsUseSite' => 'Använd valda hemsidor för framtida sökningar',
+ 'PluginsPreferredTooltip' => 'Sajt rekommenderad av GCstar',
+ 'PluginDisabled' => 'Avaktiverad',
+
+ 'BorrowersTitle' => 'Konfigurera låntagare',
+ 'BorrowersList' => 'LÃ¥ntagare',
+ 'BorrowersName' => 'Namn',
+ 'BorrowersEmail' => 'E-post',
+ 'BorrowersAdd' => 'Lägg till',
+ 'BorrowersRemove' => 'Ta bort',
+ 'BorrowersEdit' => 'Redigera',
+ 'BorrowersTemplate' => 'E-post mall',
+ 'BorrowersSubject' => 'E-post ämne',
+ 'BorrowersNotice1' => '%1 kommer att ersättas med låntagarens namn',
+ 'BorrowersNotice2' => '%2 kommer att ersättas med artikelns titel',
+ 'BorrowersNotice3' => '%3 kommer att ersättas med låningsdatum',
+
+ 'BorrowersImportTitle' => 'Importera låntagarens information',
+ 'BorrowersImportType' => 'Filformat:',
+ 'BorrowersImportFile' => 'Fil:',
+
+ 'BorrowedTitle' => 'LÃ¥nade artiklar', # Accepts model codes
+ 'BorrowedDate' => 'Sedan',
+ 'BorrowedDisplayInPanel' => 'Visa artikel i huvudfönstret', # Accepts model codes
+
+ 'MailTitle' => 'Skicka e-post',
+ 'MailFrom' => 'Från: ',
+ 'MailTo' => 'Till: ',
+ 'MailSubject' => 'Ämne: ',
+ 'MailSmtpError' => 'Problem med att ansluta till SMTP servern',
+ 'MailSendmailError' => 'Problem med att köra sendmail',
+
+ 'SearchTooltip' => 'Sök alla artiklar', # Accepts model codes
+ 'SearchTitle' => 'Artikelsökning', # Accepts model codes
+ 'SearchNoField' => 'Inget fält har markerats för sökrutan. Lägg till några av dem i fliken
+Filter under samlingens inställningar.',
+
+ 'QueryReplaceField' => 'Fält att ersätta',
+ 'QueryReplaceOld' => 'Aktuellt värde',
+ 'QueryReplaceNew' => 'Nytt värde',
+ 'QueryReplaceLaunch' => 'Ersätt',
+
+ 'ImportWindowTitle' => 'Välj Fält att Importera',
+ 'ImportViewPicture' => 'Visa bild',
+ 'ImportSelectAll' => 'Välj alla',
+ 'ImportSelectNone' => 'Välj ingen',
+
+ 'MultiSiteTitle' => 'Hemsida att använda för sökningar',
+ 'MultiSiteUnused' => 'Oanvända tillägg',
+ 'MultiSiteUsed' => 'Tillägg att använda',
+ 'MultiSiteLang' => 'Fyll lista med Svenska tillägg',
+ 'MultiSiteEmptyError' => 'Du har en tom hemsidelista',
+ 'MultiSiteClear' => 'Töm lista',
+
+ 'DisplayOptionsTitle' => 'Artiklar att visa',
+ 'DisplayOptionsAll' => 'Välj alla',
+ 'DisplayOptionsSearch' => 'Sök knapp',
+
+ 'GenresTitle' => 'Genre Konvertering',
+ 'GenresCategoryName' => 'Genre att använda',
+ 'GenresCategoryMembers' => 'Genre att ersätta',
+ 'GenresLoad' => 'Ladda en lista',
+ 'GenresExport' => 'Spara listan till en fil',
+ 'GenresModify' => 'Redigera konvertering',
+
+ 'PropertiesName' => 'Namn på samling',
+ 'PropertiesLang' => 'Språkkod',
+ 'PropertiesOwner' => 'Ägare',
+ 'PropertiesEmail' => 'E-post',
+ 'PropertiesDescription' => 'Beskrivning',
+ 'PropertiesFile' => 'Filinformation',
+ 'PropertiesFilePath' => 'Full sökväg',
+ 'PropertiesItemsNumber' => 'Antal artiklar', # Accepts model codes
+ 'PropertiesFileSize' => 'Storlek',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Egenskap för samling',
+ 'PropertiesDefaultPicture' => 'Förinställd bild',
+
+ 'MailProgramsTitle' => 'Program för att skicka e-post',
+ 'MailProgramsName' => 'Namn',
+ 'MailProgramsCommand' => 'Kommandorad',
+ 'MailProgramsRestore' => 'Återställ förvalda',
+ 'MailProgramsAdd' => 'Lägg till ett program',
+ 'MailProgramsInstructions' => 'I kommandoraden, så görs några ersättningar:
+ %f ersätts med användarens e-postadress.
+ %t ersätts med mottagarens adress.
+ %s ersätts med ämnet för meddelandet.
+ %b ersätts med meddelandets kropp.',
+
+ 'BookmarksBookmarks' => 'Bokmärken',
+ 'BookmarksFolder' => 'Kataloger',
+ 'BookmarksLabel' => 'Beteckning',
+ 'BookmarksPath' => 'Sökväg',
+ 'BookmarksNewFolder' => 'Ny mapp',
+
+ 'AdvancedSearchType' => 'Typ av sökning',
+ 'AdvancedSearchTypeAnd' => 'Artiklarna matchade alla kriterier', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Artiklarna matchade åtminstone ett kriterium', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Kriterium',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Spara sökning',
+ 'AdvancedSearchSaveName' => 'Namn',
+ 'AdvancedSearchSaveOverwrite' => 'En sparad sökning existerar redan med detta namn. Var god använd ett annat.',
+ 'AdvancedSearchUseCase' => 'Skiftlägeskänslighet',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignorera brytning och diakritiska tecken',
+
+ 'BugReportSubject' => 'Felrapport genererad från GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operativsystem',
+ 'BugReportMessage' => 'Felmeddelande',
+ 'BugReportInformation' => 'Ytterligare information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Fält att använd',
+ 'StatsSortByNumber' => 'Sortera på nummer av {x}',
+ 'StatsGenerate' => 'Generera',
+ 'StatsKindOfGraph' => 'Typ av grafik',
+ 'StatsBars' => 'Staplar',
+ 'StatsPie' => 'TÃ¥rtdiagra',
+ 'Stats3DPie' => '3D diagram',
+ 'StatsArea' => 'Areor',
+ 'StatsHistory' => 'Historik',
+ 'StatsWidth' => 'Bredd',
+ 'StatsHeight' => 'Höjd',
+ 'StatsFontSize' => 'Teckenstorlek',
+ 'StatsDisplayNumber' => 'Visa nummer',
+ 'StatsSave' => 'Spara statistik-bild till fil',
+ 'StatsAccumulate' => 'Samla ihop värden',
+ 'StatsShowAllDates' => 'Visa alla datum',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..511d2ba
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::TR::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'En üstteki alan adlarını da dahil et',
+ 'Separator' => 'Ayırıcı',
+ 'Replacement' => 'Ayrıcıyı şununla değiştir',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9c2797e
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::TR::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..2d272b6
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::TR::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'Invalid template file',
+ 'UseFile' => 'Use file specified below',
+ 'TemplateExternalFile' => 'Template file',
+ 'WithJS' => 'Javascript kullan',
+ 'FileTemplate' => 'Biçem :',
+ 'Preview' => 'Önizleme',
+ 'NoPreview' => 'Önizleme yok',
+ 'Title' => 'Sayfa başlığı',
+ 'InfoFile' => 'Film listesinin bulunduÄŸu dosya: ',
+ 'InfoDir' => 'Kapak dosyası: ',
+ 'HeightImg' => 'Kapak resmi yüksekliği (piksel olarak): ',
+ 'OpenFileInBrowser' => 'Oluşturulan dosyayı tarayıcıda aç',
+ 'Note' => 'Bu liste <a href="http://www.gcstar.org/">GCstar</a> yazılımıyla oluşturulmuştur.',
+ 'InputTitle' => 'Arama için başlık giriniz',
+ 'SearchType1' => 'Sadece film adı',
+ 'SearchType2' => 'Tüm bilgiler',
+ 'SearchButton' => 'Ara',
+ 'SearchTitle' => 'Sadece bir önceki kritere uyanları göster',
+ 'AllButton' => 'Tümü',
+ 'AllTitle' => 'Tüm filmleri göster',
+ 'Expand' => 'GeniÅŸlet',
+ 'ExpandTitle' => 'Tüm filmlerin bilgilerini göster',
+ 'Collapse' => 'Hepsini kapat',
+ 'CollapseTitle' => 'Tüm film bilgilerini kapat',
+ 'Borrowed' => 'Ödünç alan: ',
+ 'NotBorrowed' => 'ArÅŸivde',
+ 'Top' => 'Başa dön',
+ 'Bottom' => 'Bottom',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..df42d68
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::TR::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..f9908e1
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::TR::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'DROP komutunu içersin',
+ 'WithCreate' => 'CREATE komutunu içersin',
+ 'TableName' => 'Tablo Adı',
+ 'InfoFile' => 'SQL dosyası: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..fd0b81e
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::TR::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Şu arşivin içinde: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..56ccbbe
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::TR::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Biçem dosyası',
+ 'ModelText' => 'Biçem metni',
+ 'Models' => 'Kullanıcak biçem',
+ 'UseFile' => 'Kullanılacak dosya',
+ 'UseModel' => 'Metin alanını kullan',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..482a474
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::TR::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Where should it search',
+ 'Default' => 'Default Alexandria\'s directory',
+ 'Specified' => 'Directory specified below',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..1205169
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::TR::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'İlk satırı yoksay',
+ 'Separator' => 'Ayırıcı',
+ 'Plugin' => 'Kullanıcak site',
+ 'UseFirst' => 'Eğer bir çok sonuç varsa ilkini seç',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..23744cb
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::TR::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..643d36f
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::TR::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Copy pictures',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportList.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportList.pm
new file mode 100644
index 0000000..6b06cd2
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::TR::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Ä°sim listesi',
+ 'Plugin' => 'Kullanıcak site',
+ 'UseFirst' => 'Eğer bir çok sonuç varsa ilkini seç',
+ 'CommentAuto' => 'Film otomatik olarak alınmıştır.',
+ 'CommentSite' => 'Web Sitesi: ',
+ 'CommentTitle' => 'Adı: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..7b822bd
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::TR::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..2b434a1
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::TR::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Bu dosya bir Tellico video veritabanı dosyası değil',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..b0acada
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::TR::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..3079efb
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::TR::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..fa06a07
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::TR::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Board games collection',
+ Items => {0 => 'Game',
+ 1 => 'Game',
+ X => 'Games'},
+ NewItem => 'New game',
+
+ Id => 'Id',
+ Name => 'Name',
+ Original => 'Original name',
+ Box => 'Box picture',
+ DesignedBy => 'Designed by',
+ PublishedBy => 'Published by',
+ Players => 'Number of players',
+ PlayingTime => 'Playing time',
+ SuggestedAge => 'Suggested age',
+ Released => 'Released',
+ Description => 'Description',
+ Category => 'Category',
+ Mechanics => 'Mechanics',
+ ExpandedBy => 'Expanded by',
+ ExpansionFor => 'Expansion for',
+ GameFamily => 'Game family',
+ IllustratedBy => 'Illustrated by',
+ Url => 'Web page',
+ TimesPlayed => 'Times played',
+ CompleteContents => 'Complete contents',
+ Copies => 'No. of copies',
+ Condition => 'Condition',
+ Photos => 'Photos',
+ Photo1 => 'First picture',
+ Photo2 => 'Second picture',
+ Photo3 => 'Third picture',
+ Photo4 => 'Fourth picture',
+ Comments => 'Comments',
+
+ Perfect => 'Perfect',
+ Good => 'Good',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ CompleteYes => 'Complete contents',
+ CompleteNo => 'Missing pieces',
+
+ General => 'General',
+ Details => 'Details',
+ Personal => 'Personal',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCbooks.pm b/lib/gcstar/GCLang/TR/GCModels/GCbooks.pm
new file mode 100644
index 0000000..4d8048c
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCbooks.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::TR::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Books collection',
+ Items => 'Books',
+ NewItem => 'New book',
+
+ Isbn => 'ISBN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Authors => 'Authors',
+ Publisher => 'Publisher',
+ Publication => 'Publication date',
+ Language => 'Language',
+ Genre => 'Genre',
+ Serie => 'Koleksiyon',
+ Rank => 'Sıralama',
+ Bookdescription => 'Description',
+ Pages => 'Pages',
+ Read => 'Read',
+ Acquisition => 'Acquisition date',
+ Edition => 'Edition',
+ Format => 'Format',
+ Comments => 'Comments',
+ Url => 'Web page',
+ Translator => 'Translator',
+ Artist => 'Artist',
+ DigitalFile => 'Digital version',
+
+ General => 'General',
+ Details => 'Details',
+
+ ReadNo => 'Not read',
+ ReadYes => 'Read',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCcoins.pm b/lib/gcstar/GCLang/TR/GCModels/GCcoins.pm
new file mode 100644
index 0000000..3e152e1
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCcoins.pm
@@ -0,0 +1,101 @@
+{
+ package GCLang::TR::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Numismatic collection',
+ Items => 'Coins',
+ NewItem => 'New coin',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Currency => 'Currency',
+ Value => 'Value',
+ Picture => 'Main picture',
+ Diameter => 'Diameter',
+ Metal => 'Metal',
+ Edge => 'Edge',
+ Edge1 => 'Edge 1',
+ Edge2 => 'Edge 2',
+ Edge3 => 'Edge 3',
+ Edge4 => 'Edge 4',
+ Head => 'Head',
+ Tail => 'Tail',
+ Comments => 'Comments',
+ History => 'History',
+ Website => 'Website',
+ Estimate => 'Estimate',
+ References => 'References',
+ Type => 'Type',
+ Coin => 'Coin',
+ Banknote => 'Bank note',
+
+ Main => 'Main',
+ Description => 'Description',
+ Other => 'Other information',
+ Pictures => 'Pictures',
+
+ Condition => 'Condition (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCcomics.pm b/lib/gcstar/GCLang/TR/GCModels/GCcomics.pm
new file mode 100644
index 0000000..a7c9034
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::TR::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCfilms.pm b/lib/gcstar/GCLang/TR/GCModels/GCfilms.pm
new file mode 100644
index 0000000..27b090c
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCfilms.pm
@@ -0,0 +1,91 @@
+{
+ package GCLang::TR::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Film Koleksiyonu',
+ Items => 'Filmler',
+ NewItem => 'Film Ekle',
+
+
+ Id => 'No',
+ Title => 'Film Adı',
+ Date => 'Yıl',
+ Time => 'Süre',
+ Director => 'Yönetmen',
+ Country => 'Ãœlke',
+ MinimumAge => 'YaÅŸ Grubu',
+ Genre => 'Türü',
+ Image => 'Kapak',
+ Original => 'Özgün Adı',
+ Actors => 'Oyuncular',
+ Actor => 'Actor',
+ Role => 'Role',
+ Comment => 'Yorumlar, Ödüller ve Diğer Bilgiler',
+ Synopsis => 'Konu',
+ Seen => 'Ä°zlendi',
+ Number => 'Sayısı',
+ Format => 'Medya',
+ Region => 'Region',
+ Identifier => 'Identifier',
+ Url => 'Web',
+ Audio => 'Ses',
+ Video => 'Video formatı',
+ Trailer => 'Video dosyası',
+ Serie => 'Koleksiyon',
+ Rank => 'Sıralama',
+ Subtitles => 'Altyazı(lar)',
+
+ SeenYes => 'Ä°zlendi',
+ SeenNo => 'Ä°zlenmedi',
+
+ AgeUnrated => 'DeÄŸerlendirilmemiÅŸ',
+ AgeAll => 'Herkes',
+ AgeParent => 'Ebeveyn Kontrollü',
+
+ Main => 'Genel Bilgiler',
+ General => 'Genel',
+ Details => 'Detay',
+
+ Information => 'Bilgi',
+ Languages => 'Dil(ler)',
+ Encoding => 'Encoding',
+
+ FilterAudienceAge => 'Ä°zleyici grubu',
+ FilterSeenNo => 'Ä°zlen_medi',
+ FilterSeenYes => 'Ä°_zlendi',
+ FilterRatingSelect => '_Puanı En Az...',
+
+ ExtractSize => 'Boyut',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCgames.pm b/lib/gcstar/GCLang/TR/GCModels/GCgames.pm
new file mode 100644
index 0000000..b5c23a7
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCgames.pm
@@ -0,0 +1,80 @@
+{
+ package GCLang::TR::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Oyun Koleksiyonu',
+ Items => 'Oyunlar',
+ NewItem => 'Yeni Oyun',
+
+ Id => 'No',
+ Ean => 'EAN',
+ Name => 'Ad',
+ Platform => 'Platform',
+ Players => 'Oyuncu Sayısı',
+ Released => 'Yayınlanma Tarihi',
+ Editor => 'Editör',
+ Developer => 'Developer',
+ Genre => 'Kategori',
+ Box => 'Kapak Resmi',
+ Case => 'Case',
+ Manual => 'Instructions manual',
+ Completion => 'Tamamlanma (%)',
+ Executable => 'Executable',
+ Description => 'Bilgi',
+ Codes => 'Kodlar',
+ Code => 'Kod',
+ Effect => 'Etki',
+ Secrets => 'Sırlar',
+ Screenshots => 'Ekran Görüntüleri',
+ Screenshot1 => '1. Ekran Görüntüsü',
+ Screenshot2 => '2. Ekran Görüntüsü',
+ Comments => 'Comments',
+ Url => 'Web Sayfası',
+ Unlockables => 'Kilitlenmiş Özellikler',
+ Unlockable => 'Kilitlenen',
+ Howto => 'Nasıl çözülür?',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Genel',
+ Details => 'Detay',
+ Tips => 'Ä°pucu',
+ Information => 'Bilgi',
+
+ FilterRatingSelect => 'En _Az Puanı...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..a810643
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::TR::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCminicars.pm b/lib/gcstar/GCLang/TR/GCModels/GCminicars.pm
new file mode 100644
index 0000000..29863be
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::TR::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCmusics.pm b/lib/gcstar/GCLang/TR/GCModels/GCmusics.pm
new file mode 100644
index 0000000..3daffd4
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::TR::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Music collection',
+ Items => 'Albums',
+ NewItem => 'New album',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Title',
+ Cover => 'Cover',
+ Artist => 'Artist',
+ Format => 'Format',
+ Running => 'Running time',
+ Release => 'Release date',
+ Genre => 'Genre',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'Tracks list',
+ Number => 'Number',
+ Track => 'Title',
+ Time => 'Time',
+
+ Composer => 'Composer',
+ Producer => 'Producer',
+ Playlist => 'Playlist',
+ Comments => 'Comments',
+ Label => 'Label',
+ Url => 'Web page',
+
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..e5b6650
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::TR::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..1413e71
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::TR::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..6930057
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::TR::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCstamps.pm b/lib/gcstar/GCLang/TR/GCModels/GCstamps.pm
new file mode 100644
index 0000000..90d5eb9
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::TR::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCModels/GCwines.pm b/lib/gcstar/GCLang/TR/GCModels/GCwines.pm
new file mode 100644
index 0000000..3fb250e
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::TR::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Wines collection',
+ Items => 'Wines',
+ NewItem => 'New wine',
+
+ Name => 'Name',
+ Designation => 'Designation',
+ Vintage => 'Vintage',
+ Vineyard => 'Vineyard',
+ Type => 'Type',
+ Grapes => 'Grapes',
+ Soil => 'Soil',
+ Producer => 'Producer',
+ Country => 'Country',
+ Volume => 'Volume (ml)',
+ Alcohol => 'Alcohol (%)',
+ Medal => 'Medal/Honour',
+
+ Storage => 'Storage',
+ Location => 'Location',
+ ShelfIndex => 'Index',
+ Quantity => 'Quantity',
+ Acquisition => 'Acquisition',
+ PurchaseDate => 'Purchase date',
+ PurchasePrice => 'Purchase price',
+ Gift => 'Gift',
+ BottleLabel => 'Bottle label',
+ Website => 'Reference on the web',
+
+ Tasted => 'Tasted',
+ Comments => 'Comments',
+ Serving => 'Serving',
+ TastingField => 'Testing notes',
+
+ General => 'General',
+ Details => 'Details',
+ Tasting => 'Tasting',
+
+ TastedNo => 'Non tasted',
+ TastedYes => 'Tasted',
+
+ FilterRange => 'Range',
+ FilterTastedNo => '_Not yet tasted',
+ FilterTastedYes => 'Already _tasted',
+ FilterRatingSelect => 'Rating at _least...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/TR/GCstar.pm b/lib/gcstar/GCLang/TR/GCstar.pm
new file mode 100644
index 0000000..e576604
--- /dev/null
+++ b/lib/gcstar/GCLang/TR/GCstar.pm
@@ -0,0 +1,677 @@
+{
+ package GCLang::TR;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+#
+# Turkish Language File, v.2
+# KaraGarga, 17/07/2006
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Türkçe',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>Dikkat!</b>:
+
+Eklentiler aracılığıyla diğer sitelerden indirilen bilgiler
+sadece <b>kişisel amaçlar için</b> kullanılmalıdır.
+
+Bu bilgilerin, ilgili sitenin izni olmaksızın dağıtımı
+<b>yasaktır</b>.
+
+Bilginin hangi siteden alındığını <b>film detaylarının altındaki link düğmesinden öğrenebilirsiniz.</b>.',
+
+ 'AllItemsFiltered' => 'Aradığınız anahtar sözcükle ilişkili bir film bulunamadı.', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Kurulum klasörü ',
+ 'InstallMandatory' => 'Gerekli BileÅŸenler',
+ 'InstallOptional' => 'DiÄŸer BileÅŸenler',
+ 'InstallErrorMissing' => 'Hata : Aşağıdaki Perl bileşenini kurmalısınız: ',
+ 'InstallPrompt' => 'Yazılımın kurulacağı klasör [/usr/local]: ',
+ 'InstallEnd' => 'Kurulumun sonu',
+ 'InstallNoError' => 'Hata Yok',
+ 'InstallLaunch' => 'Bu yazılımı kullanmak için, şunu başlatmalısınız ',
+ 'InstallDirectory' => 'Ana klasör',
+ 'InstallTitle' => 'GCstar kurulumu',
+ 'InstallDependencies' => 'Bağımlı bileşenler',
+ 'InstallPath' => 'Dizin',
+ 'InstallOptions' => 'Seçenekler',
+ 'InstallSelectDirectory' => 'Kurulum için bir ana klasör seçiniz',
+ 'InstallWithClean' => 'Kurulum dizinindeki dosyaları temizle',
+ 'InstallWithMenu' => 'GCstar yazılımını Programlar menüsüne ekle',
+ 'InstallNoPermission' => 'Hata: Seçtiğiniz klasöre yazma hakkınız yok',
+ 'InstallMissingMandatory' => 'Zorunlu bileşenler eksik. Bu bileşenleri kurmadan GCstar yazılımını kullanamazsınız.',
+ 'InstallMissingOptional' => 'Bazı seçimlik bileşenler eksik. Bu bileşenler aşağıda listelenmiştir. GCstar yazılımını kurabilirsiniz ancak bu bileşenler olmadan bazı özelliklerini kullanmayabilirsiniz.',
+ 'InstallMissingNone' => 'Eksik bağımlı bileşen yok. GCstar yazılımını kurmaya devam edebilirsiniz.',
+ 'InstallOK' => 'Tamam',
+ 'InstallMissing' => 'Eksik',
+ 'InstallMissingFor' => 'Eksikler',
+ 'InstallCleanDirectory' => 'Removing GCstar\'s files in directory: ',
+ 'InstallCopyDirectory' => 'Copying files in directory: ',
+ 'InstallCopyDesktop' => 'Copying desktop file in: ',
+
+#Update
+ 'UpdateUseProxy' => 'Kullanılacak Proxy (emin değilseniz sadece entere basınız): ',
+ 'UpdateNoPermission' => 'Bu klasöre yazma hakkınız yok ya da reddedildi: ',
+ 'UpdateNone' => 'Herhangi bir güncelleme bulunamadı.',
+ 'UpdateFileNotFound' => 'Dosya bulunamadı',
+
+#Splash
+ 'SplashInit' => 'Program açılıyor...',
+ 'SplashLoad' => 'Veritabanı yükleniyor...',
+ 'SplashDisplay' => 'Displaying Collection',
+ 'SplashSort' => 'Sorting Collection',
+ 'SplashDone' => 'Hazır.',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'Daha önce GCfilms yazılımını kullanıyordunuz. Bu yazılımdaki verileri otomatik almak ister misiniz? (bu seçenk GCfilms yazılımını kullanmanızı etkilemeyecektir.)',
+ 'GCfilmsImportOptions' => 'Ayarlar',
+ 'GCfilmsImportData' => 'Film Listesi',
+
+#Menus
+ 'MenuFile' => '_Dosya',
+ 'MenuNewList' => '_Yeni Kolleksiyon',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_Son Kullanılanlar',
+ 'MenuLend' => 'Ö_dünç Verilenler', # Accepts model codes
+ 'MenuImport' => '_Al',
+ 'MenuExport' => '_Ver',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => 'Düz_enle',
+ 'MenuDuplicate' => '_Kopyasını oluştur', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_Sil', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Change collection fields',
+ 'MenuEditLockItems' => '_Veritabanını kilitle',
+
+ 'MenuDisplay' => '_Filtrele',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => 'A_dvanced Search',
+ 'MenuViewAllItems' => 'Tümünü Göste', # Accepts model codes
+ 'MenuNoFilter' => '_Hepsi',
+
+ 'MenuConfiguration' => '_Ayarlar',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Bilgi Alanları',
+ 'MenuBorrowers' => '_Ödünç Alanlar',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '_Tür Çevrimi',
+
+ 'MenuBookmarks' => 'My _Collections',
+ 'MenuBookmarksAdd' => '_Add current collection',
+ 'MenuBookmarksEdit' => '_Edit bookmarked collections',
+
+ 'MenuHelp' => '_Yardım',
+ 'MenuHelpContent' => '_Yardım',
+ 'MenuAllPlugins' => 'View _plugins',
+ 'MenuBugReport' => 'Report a _bug',
+ 'MenuAbout' => 'GCstar _Hakkında',
+
+ 'MenuNewWindow' => '_Yeni Pencerede Göster', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Hepsini Aç',
+ 'ContextCollapseAll' => 'Hepsini Kapa',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Lütfen bir değer giriniz',
+
+ 'RemoveConfirm' => 'Bu başlığı silmek istediğinize emin misiniz?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'New item', # Accepts model codes
+ 'NewItemTooltip' => 'Yeni başlık eklemek için tıklayın', # Accepts model codes
+ 'NoItemFound' => 'Aradığınız başlık bulunamadı. Başka bir siteden arama yapmak ister misiniz?',
+ 'OpenList' => 'Lütfen bir veritabanı seçin',
+ 'SaveList' => 'Listeyi nereye kaydedeceğiniz seçiniz',
+ 'SaveListTooltip' => 'Açık olan veritabanını kaydetmek için tıklayınız',
+ 'SaveUnsavedChanges' => 'There are unsaved changes in your collection. Do you want to save them?',
+ 'SaveDontSave' => 'Don\'t save',
+ 'PreferencesTooltip' => 'Ayarları yapmak için tıklayınız',
+ 'ViewTooltip' => 'Koleksiyonun görsel ayarlarını değiştirir',
+ 'PlayTooltip' => 'Dosyayı lişkilendirilmiş oynatıcı ile başlatır', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'Saving...',
+ 'StatusLoad' => 'Loading...',
+ 'StatusSearch' => 'Aranıyor...',
+ 'StatusGetInfo' => 'Bilgiler alınıyor...',
+ 'StatusGetImage' => 'Kapak alınıyor...',
+
+ 'SaveError' => 'GCStar Koleksiyonu kaydedilemiyor. Erişim engelleri ve boş alan kontrolü yapınız.',
+ 'OpenError' => 'GCStar Koleksiyonu açamıyor. Dosyanın erişim izinlerini kontrol ediniz.',
+ 'OpenFormatError' => 'Koleksiyonu açamıyor.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Kapak dosyaları için seçtiğiniz klasör yanlış. Lütfen başka bir klasör seçiniz.',
+ 'OptionsCreationError'=> 'Ayar dosyası oluşturulamıyor: ',
+ 'OptionsOpenError'=> 'Ayar dosyası açılamıyor: ',
+ 'OptionsSaveError'=> 'Ayar dosyası kaydedilemiyor: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Bana öneride bulun. Rastgele dosya seçer.',
+ 'RandomError'=> 'Tüm başlıkları izlemişsiniz ya da veritanında başlık yok.', # Accepts model codes
+ 'RandomEnd'=> 'Tüm başlıkları izlemişsiniz. Başka başlık kalmadı.', # Accepts model codes
+ 'RandomNextTip'=> 'Bir Sonraki Öneri',
+ 'RandomOkTip'=> 'Tamam bu iyi',
+
+ 'AboutTitle' => 'GCstar Hakkında',
+ 'AboutDesc' => 'Veritabanı Yöneticisi',
+ 'AboutVersion' => 'Sürüm',
+ 'AboutTeam' => 'Takım',
+ 'AboutWho' => 'Christian Jodar (Tian): Proje Yöneticisi, Programcı
+Nyall Dawson (Zombiepig): Programcı
+TPF: Programcı
+Adolfo González: Programcı
+',
+ 'AboutLicense' => 'GNU GPL lisansı altında dağıtılmaktadır
+Logoların telif hakları le Spektre',
+ 'AboutTranslation' => 'Türkçe çeviri KaraGarga\'ya aittir',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo ve webtasarımı: le Spektre',
+
+ 'ToolbarRandom' => 'Gece',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Bir koleksiyon türü seçiniz',
+ 'ModelsPersonal' => 'Personal models',
+ 'ModelsDefault' => 'Default models',
+ 'ModelsList' => 'Koleksiyon Türleri',
+ 'ModelSettings' => 'Collection settings',
+ 'ModelNewType' => 'New collection type',
+ 'ModelName' => 'Name of the collection type:',
+ 'ModelFields' => 'Fields',
+ 'ModelOptions' => 'Options',
+ 'ModelFilters' => 'Filters',
+ 'ModelNewField' => 'New field',
+ 'ModelFieldInformation' => 'Information',
+ 'ModelFieldName' => 'Label:',
+ 'ModelFieldType' => 'Type:',
+ 'ModelFieldGroup' => 'Group:',
+ 'ModelFieldValues' => 'Values',
+ 'ModelFieldInit' => 'Default:',
+ 'ModelFieldMin' => 'Minimum:',
+ 'ModelFieldMax' => 'Maximum:',
+ 'ModelFieldList' => 'Values list:',
+ 'ModelFieldListLegend' => '<i>Comma separated</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Short text',
+ 'ModelFieldTypeLongText' => 'Long text',
+ 'ModelFieldTypeYesNo' => 'Yes/No',
+ 'ModelFieldTypeNumber' => 'Number',
+ 'ModelFieldTypeDate' => 'Date',
+ 'ModelFieldTypeOptions' => 'Pre-defined values list',
+ 'ModelFieldTypeImage' => 'Image',
+ 'ModelFieldTypeSingleList' => 'Simple list',
+ 'ModelFieldTypeFile' => 'File',
+ 'ModelFieldTypeFormatted' => 'Dependant on other fields',
+ 'ModelFieldParameters' => 'Parameters',
+ 'ModelFieldHasHistory' => 'Use an history',
+ 'ModelFieldFlat' => 'Display on one line',
+ 'ModelFieldStep' => 'Increment step:',
+ 'ModelFieldFileFormat' => 'File format:',
+ 'ModelFieldFileFile' => 'Simple file',
+ 'ModelFieldFileImage' => 'Image',
+ 'ModelFieldFileVideo' => 'Video',
+ 'ModelFieldFileAudio' => 'Audio',
+ 'ModelFieldFileProgram' => 'Program',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'Fields to use',
+ 'ModelOptionsFieldsAuto' => 'Automatic',
+ 'ModelOptionsFieldsNone' => 'None',
+ 'ModelOptionsFieldsTitle' => 'As title',
+ 'ModelOptionsFieldsId' => 'As identifier',
+ 'ModelOptionsFieldsCover' => 'As cover',
+ 'ModelOptionsFieldsPlay' => 'For Play button',
+ 'ModelCollectionSettings' => 'Collection settings',
+ 'ModelCollectionSettingsLending' => 'Items could be borrowed',
+ 'ModelCollectionSettingsTagging' => 'Items can be tagged',
+ 'ModelFilterActivated' => 'Should be in search box',
+ 'ModelFilterComparison' => 'Comparison',
+ 'ModelFilterContain' => 'Contains',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Range',
+ 'ModelFilterNumeric' => 'Comparison is numeric',
+ 'ModelFilterQuick' => 'Create a quick filter',
+ 'ModelTooltipName' => 'Use a name to re-use this model for many collections. If empty, the settings will be directly stored in the collection itself',
+ 'ModelTooltipLabel' => 'The field name as it will be displayed',
+ 'ModelTooltipGroup' => 'Used to group fields. Items with no value here will be in a default group',
+ 'ModelTooltipHistory' => 'Should the previous entered values be stored in a list associated to the field',
+ 'ModelTooltipFormat' => 'This format is used to determine the action to open the file with the Play button',
+ 'ModelTooltipLending' => 'This will add some fields to manage lendings',
+ 'ModelTooltipTagging' => 'This will add some fields to manage tags',
+ 'ModelTooltipNumeric' => 'Should the values be consider as numbers for comparison',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'Bir başlık seçiniz', # Accepts model codes
+ 'ResultsNextTip' => 'Bir sonraki sitede ara',
+ 'ResultsPreview' => 'Preview',
+ 'ResultsInfo' => 'You can add multiple items to the collection by holding down the Ctrl or the Shift key and selecting them', # Accepts model codes
+
+ 'OptionsTitle' => 'Ayarlar',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Web tarayıcı',
+ 'OptionsPlayer' => 'Video oynatıcı',
+ 'OptionsAudio' => 'Audio oynatıcı',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Kapak klasörü',
+ 'OptionsUseRelativePaths' => 'Kapak resimleri için değişken dizin yapısı kullan',
+ 'OptionsLayout' => 'Başlık Bilgileri Paneli',
+ 'OptionsStatus' => 'Durum barını göster',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'Dikkat: Bu alandaki değişikleri uygulamak için yazılımı tekrar başlatmalısınız.',
+ 'OptionsRemoveConfirm' => 'Başlık silmeden önce onay iste',
+ 'OptionsAutoSave' => 'Veritabanını otomatik olarak kaydet',
+ 'OptionsAutoLoad' => 'Load previous collection on startup',
+ 'OptionsSplash' => 'Başlangıç ekranını göster',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'Use spelling checker for long text fields',
+ 'OptionsProgramTitle' => 'Bir Program Seçiniz',
+ 'OptionsPlugins' => 'Bilginin alınacağı siteyi seçiniz',
+ 'OptionsAskPlugins' => 'Sor (Tüm Siteler)',
+ 'OptionsPluginsMulti' => 'Seçtiğim Siteler',
+ 'OptionsPluginsMultiAsk' => 'Sor (Seçtiğim Siteler)',
+ 'OptionsPluginsMultiPerField' => 'Seçtiğim Siteler (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Listeyi oluÅŸturun',
+ 'OptionsAskImport' => 'Alınacak bilgi alanları',
+ 'OptionsProxy' => 'Proxy Kullan',
+ 'OptionsCookieJar' => 'Use this cookie jar file',
+ 'OptionsLang' => 'Dil',
+ 'OptionsMain' => 'Genel',
+ 'OptionsPaths' => 'Dizin',
+ 'OptionsInternet' => 'Internet',
+ 'OptionsConveniences' => 'DiÄŸer',
+ 'OptionsDisplay' => 'Görsel',
+ 'OptionsToolbar' => 'Menü',
+ 'OptionsToolbars' => {0 => 'Yok', 1 => 'Küçük', 2 => 'Büyük', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'Konum',
+ 'OptionsToolbarPositions' => {0 => 'Ãœst', 1 => 'Alt', 2 => 'Sol', 3 => 'SaÄŸ'},
+ 'OptionsExpandersMode' => 'Expanders too long',
+ 'OptionsExpandersModes' => {'asis' => 'Do nothing', 'cut' => 'Cut', 'wrap' => 'Line wrap'},
+ 'OptionsDateFormat' => 'Date Format',
+ 'OptionsDateFormatTooltip' => 'Format is the one used by strftime(3). Default is %d/%m/%Y',
+ 'OptionsView' => 'Film Listesi',
+ 'OptionsViews' => {0 => 'Başlık Adları', 1 => 'Kapak', 2 => 'Detay'},
+ 'OptionsColumns' => 'Kolonlar',
+ 'OptionsMailer' => 'E-posta istemcisi',
+ 'OptionsSMTP' => 'Sunucu',
+ 'OptionsFrom' => 'E-posta adresiniz',
+ 'OptionsTransform' => 'Aşağıdaki öbekleri film adının sonuna koy',
+ 'OptionsArticles' => 'Öbekler (virgülle ayrılmış)',
+ 'OptionsSearchStop' => 'Aramanın durdurulmasını sağlar',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'Başlık için özgün ad yoksa kendi adını kullan',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'Geçmiş dosya kısıtlaması',
+ 'OptionsClearHistory' => 'Geçmişi temizle',
+ 'OptionsStyle' => 'Arayüz',
+ 'OptionsDontAsk' => 'Bir daha sorma',
+ 'OptionsPathProgramsGroup' => 'Yazılımlar',
+ 'OptionsProgramsSystem' => 'Use programs defined by system',
+ 'OptionsProgramsUser' => 'Use specified programs',
+ 'OptionsProgramsSet' => 'Set programs',
+ 'OptionsPathImagesGroup' => 'Resimler',
+ 'OptionsInternetDataGroup' => 'Veri alma',
+ 'OptionsInternetSettingsGroup' => 'Ayarlar',
+ 'OptionsDisplayInformationGroup' => 'Bilgi gösterimi',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => 'Görsel',
+ 'OptionsImagesStyleGroup' => 'Stil',
+ 'OptionsDetailedPreferencesGroup' => 'Seçenekler',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => 'Prefix to use for pictures:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Title or name of the associated item',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% or . will be replaced with collection directory (use only on beginning of path)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% will be replaced by collection file name without suffix (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% could only be used on the beginning of the path for pictures',
+ 'OptionsConfigureMailers' => 'Configure mailing programs',
+
+ 'ImagesOptionsButton' => 'Ayarlar',
+ 'ImagesOptionsTitle' => 'Kağak listesi için ayarlar',
+ 'ImagesOptionsSelectColor' => 'Renk seçiniz',
+ 'ImagesOptionsUseOverlays' => 'Use image overlays',
+ 'ImagesOptionsBg' => 'Arkaplan',
+ 'ImagesOptionsBgPicture' => 'Arkaplan resmi kullan',
+ 'ImagesOptionsFg'=> 'Seçim',
+ 'ImagesOptionsBgTooltip' => 'Arkaplanı değiştir',
+ 'ImagesOptionsFgTooltip'=> 'Seçili alan rengini değiştir',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Boyut',
+ 'ImagesOptionsSizeList' => {0 => 'Minik', 1 => 'Küçük', 2 => 'Orta', 3 => 'Büyük', 4 => 'Devasa'},
+ 'ImagesOptionsSizeTooltip' => 'Resim boyutu seçiniz',
+
+ 'DetailedOptionsTitle' => 'Detaylı liste için ayarlar',
+ 'DetailedOptionsImageSize' => 'Kapak boyutu',
+ 'DetailedOptionsGroupItems' => 'Filmleri Koleksiyon türüne göre sınıflandır',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Gösterilecek alanları seçiniz',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => 'Bilgi',
+ 'ExtractTitle' => 'Video Bilgisi',
+ 'ExtractImport' => 'Bu deÄŸerleri kullan',
+
+ 'FieldsListOpen' => 'Load a fields list from a file',
+ 'FieldsListSave' => 'Save fields list to a file',
+ 'FieldsListError' => 'This fields list cannot be used with this kind of collection',
+ 'FieldsListIgnore' => '--- Ignore',
+
+ 'ExportTitle' => 'Film listesini ver',
+ 'ExportFilter' => 'Sadece seçili filmleri ver',
+ 'ExportFieldsTitle' => 'Verilecek alanlar',
+ 'ExportFieldsTip' => 'Aktarılacak alanları seçiniz',
+ 'ExportWithPictures' => 'Kapak resimlerini bir alt klasöre kopyala',
+ 'ExportSortBy' => 'Sort by',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'DiÄŸer bir film listesinden aktar',
+ 'ImportExportData' => 'Data',
+ 'ImportExportFile' => 'Dosya',
+ 'ImportExportFieldsUnused' => 'Kullanılmayacak alanlar',
+ 'ImportExportFieldsUsed' => 'Kullanılacak alanlar',
+ 'ImportExportFieldsFill' => 'Tümüün Ekle',
+ 'ImportExportFieldsClear' => 'Tümünü Sil',
+ 'ImportExportFieldsEmpty' => 'En az bir alan seçmelisiniz',
+ 'ImportExportFileEmpty' => 'Dosya adı belirlemelisiniz',
+ 'ImportFieldsTitle' => 'Alınacak Alanlar',
+ 'ImportFieldsTip' => 'Alınacak alanları seçiniz',
+ 'ImportNewList' => 'Yeni veritabanı oluştur',
+ 'ImportCurrentList' => 'Açık olan veritabanına aktar',
+ 'ImportDropError' => 'Dosyanın açılmasında sorun çıktı. Bir önceki veritabanı yüklenecek.',
+ 'ImportGenerateId' => 'Generate identifier for each item',
+
+ 'FileChooserOpenFile' => 'Lütfen bir dosya seçiniz',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Bir Klasör Seçiniz',
+ 'FileChooserOverwrite' => 'Bu dosya zaten var. Ãœzerine yazmak istediÄŸinizden emin misiniz?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Ä°ÅŸlevsel',
+ 'PanelReadOnly' => 'Salt Okunur',
+ 'PanelForm' => 'Sekmeler',
+
+ 'PanelSearchButton' => 'Bilgi Al',
+ 'PanelSearchTip' => 'Bu film için internetten bilgi al',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Başka bir kapak resmi seçmek için tıklayınız.',
+ 'PanelImageTipView' => 'Click on the picture to view it in real size.',
+ 'PanelImageTipMenu' => ' Daha fazla seçenek için sağ tıklayınız.',
+ 'PanelImageTitle' => 'Kapak seç',
+ 'PanelImageNoImage' => 'No image',
+ 'PanelSelectFileTitle' => 'Dosya Seçiniz',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Restore default',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'Bilgileri göster',
+ 'PanelWebTip' => 'Bu filmin internet bilgisini göster', # Accepts model codes
+ 'PanelRemoveTip' => 'Seçili filmi siliniz', # Accepts model codes
+
+ 'PanelDateSelect' => 'Tarih Seçiniz',
+ 'PanelNobody' => 'Kimse',
+ 'PanelUnknown' => 'Bilinmiyor',
+ 'PanelAdded' => 'Add date',
+ 'PanelRating' => 'Puan',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'Yer',
+
+ 'PanelLending' => 'Ödünç',
+ 'PanelBorrower' => 'Ödünç Alan',
+ 'PanelLendDate' => 'Ödünç Verme Tarihi',
+ 'PanelHistory' => 'Ödünç Geçmişi',
+ 'PanelReturned' => 'Geri Dönme Tarihi', # Accepts model codes
+ 'PanelReturnDate' => 'Geri dönme tarihi',
+ 'PanelLendedYes' => 'Ödün verilme',
+ 'PanelLendedNo' => 'ArÅŸivde',
+
+ 'PanelTags' => 'Tags',
+ 'PanelFavourite' => 'Favourite',
+ 'TagsAssigned' => 'Assigned Tags',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Farketmez',
+ 'CheckYes' => 'Evet',
+ 'CheckNo' => 'Hayır',
+
+ 'ToolbarAll' => 'Tümünü Göster',
+ 'ToolbarAllTooltip' => 'Tüm filmleri görmek için tıklayınız',
+ 'ToolbarGroupBy' => 'Grupla',
+ 'ToolbarGroupByTooltip' => 'Select the field to use to group items in list',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Film arayınız',
+ 'PluginsQuery' => 'Query',
+ 'PluginsFrame' => 'Arama sitesi',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'Adı',
+ 'PluginsSearchFields' => 'Search fields',
+ 'PluginsAuthor' => 'Yazarı',
+ 'PluginsLang' => 'Dil',
+ 'PluginsUseSite' => 'Her zaman bu siteyi kullan',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'Ödünç Seçenekleri',
+ 'BorrowersList' => 'Borrowers',
+ 'BorrowersName' => 'Adı',
+ 'BorrowersEmail' => 'E-posta',
+ 'BorrowersAdd' => 'Ekle',
+ 'BorrowersRemove' => 'Sil',
+ 'BorrowersEdit' => 'Düzenle',
+ 'BorrowersTemplate' => 'E-posta örneği',
+ 'BorrowersSubject' => 'Posta konusu',
+ 'BorrowersNotice1' => '%1 - Ödünç alanın adı',
+ 'BorrowersNotice2' => '%2 - Film adı',
+ 'BorrowersNotice3' => '%3 - Ödün alma tarihi',
+
+ 'BorrowersImportTitle' => 'Import borrowers information',
+ 'BorrowersImportType' => 'File format:',
+ 'BorrowersImportFile' => 'File:',
+
+ 'BorrowedTitle' => 'Ödünç verilmiş filmler', # Accepts model codes
+ 'BorrowedDate' => 'Alma Tarihi',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'E-posta gönder',
+ 'MailFrom' => 'Kimden: ',
+ 'MailTo' => 'Kime: ',
+ 'MailSubject' => 'Konu: ',
+ 'MailSmtpError' => 'SMTP sunucusuna bağlanamıyor',
+ 'MailSendmailError' => 'Sendmail istemcisini çalıştıramıyor',
+
+ 'SearchTooltip' => 'Detaylı arama için tıklayınız', # Accepts model codes
+ 'SearchTitle' => 'Film Arama', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'DeÄŸiÅŸtirilecek alan',
+ 'QueryReplaceOld' => 'Åžimdiki deÄŸer',
+ 'QueryReplaceNew' => 'Yeni DeÄŸer',
+ 'QueryReplaceLaunch' => 'DeÄŸiÅŸtir',
+
+ 'ImportWindowTitle' => 'Alınacak alanları seçiniz',
+ 'ImportViewPicture' => 'Resmi göster',
+ 'ImportSelectAll' => 'Tümünü seç',
+ 'ImportSelectNone' => 'Hiçbirini seçme',
+
+ 'MultiSiteTitle' => 'Arama için kullanılan siteler',
+ 'MultiSiteUnused' => 'Kullanılmayacaklar',
+ 'MultiSiteUsed' => 'Kullanılacak eklentiler',
+ 'MultiSiteLang' => 'İngilizce eklentileri göster',
+ 'MultiSiteEmptyError' => 'Site listeniz boÅŸ',
+ 'MultiSiteClear' => 'Listeyi temizle',
+
+ 'DisplayOptionsTitle' => 'Gösterilecek alanlar',
+ 'DisplayOptionsAll' => 'Tümünü Seç',
+ 'DisplayOptionsSearch' => 'Arama düğmesi',
+
+ 'GenresTitle' => 'Tür Dönüştürme',
+ 'GenresCategoryName' => 'Kullanılan Tür',
+ 'GenresCategoryMembers' => 'Değiştirilecek Tür',
+ 'GenresLoad' => 'Liste yükle',
+ 'GenresExport' => 'Listeyi kaydet',
+ 'GenresModify' => 'Tür Düzenle',
+
+ 'PropertiesName' => 'Collection name',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'Owner',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'Description',
+ 'PropertiesFile' => 'File Information',
+ 'PropertiesFilePath' => 'Full path',
+ 'PropertiesItemsNumber' => 'Number of items', # Accepts model codes
+ 'PropertiesFileSize' => 'Size',
+ 'PropertiesFileSizeSymbols' => ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'Collection properties',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Programs for mail sending',
+ 'MailProgramsName' => 'Name',
+ 'MailProgramsCommand' => 'Command line',
+ 'MailProgramsRestore' => 'Restore defaults',
+ 'MailProgramsAdd' => 'Add a program',
+ 'MailProgramsInstructions' => 'In command line, some substitutions are made:
+ %f is replaced with user\'s e-mail address.
+ %t is replaced with the recipient address.
+ %s is replaced with the subject of the message.
+ %b is replaced with the body of the message.',
+
+ 'BookmarksBookmarks' => 'Bookmarks',
+ 'BookmarksFolder' => 'Directory',
+ 'BookmarksLabel' => 'Label',
+ 'BookmarksPath' => 'Path',
+ 'BookmarksNewFolder' => 'New folder',
+
+ 'AdvancedSearchType' => 'Type of search',
+ 'AdvancedSearchTypeAnd' => 'Items matching all criteria', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'Items matching at least one criterion', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Criteria',
+ 'AdvancedSearchAnyField' => 'Any field',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Bug report generated from GCstar',
+ 'BugReportVersion' => 'Version',
+ 'BugReportPlatform' => 'Operating system',
+ 'BugReportMessage' => 'Error message',
+ 'BugReportInformation' => 'Additional information',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..a6722c0
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::UK::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => 'Включити імена полів вгорі',
+ 'Separator' => 'Розділювач',
+ 'Replacement' => 'Замінити розділювач на',
+ 'Charset' => 'Charset',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..f7b3e0e
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::UK::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..82573a6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::UK::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => 'ÐеприпуÑтимий файл зразка',
+ 'UseFile' => 'Вживати файл, вказаний нижче',
+ 'TemplateExternalFile' => 'Файл зразка',
+ 'WithJS' => 'ВикориÑтовувати Javascript',
+ 'FileTemplate' => 'Зразок:',
+ 'Preview' => 'Попередній переглÑд',
+ 'NoPreview' => 'ПереглÑд недоÑтупний',
+ 'Title' => 'Заголовок Ñторінки',
+ 'InfoFile' => 'СпиÑок фільмів у файлі: ',
+ 'InfoDir' => 'Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñƒ: ',
+ 'HeightImg' => 'ВиÑота (у пікÑелÑÑ…) екÑпортованих зображень: ',
+ 'OpenFileInBrowser' => 'Відкрити Ñтворений файл у переглÑдачі тенет',
+ 'Note' => 'СпиÑок Ñтворений програмою <a href="http://www.gcstar.org/">GCstar</a>',
+ 'InputTitle' => 'Введіть текÑÑ‚ Ð´Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ',
+ 'SearchType1' => 'Лише заголовки',
+ 'SearchType2' => 'Повна інформаціÑ',
+ 'SearchButton' => 'Пошук',
+ 'SearchTitle' => 'Показувати лише фільми, що відповідають попереднім критеріÑм',
+ 'AllButton' => 'Ð’ÑÑ–',
+ 'AllTitle' => 'Показувати вÑÑ– фільми',
+ 'Expand' => 'Розгорнути вÑÑ–',
+ 'ExpandTitle' => 'Показати вÑÑŽ інформацію про фільми',
+ 'Collapse' => 'Згорнути вÑÑ–',
+ 'CollapseTitle' => 'Згорнути вÑÑŽ інформацію про фільми',
+ 'Borrowed' => 'Позичений: ',
+ 'NotBorrowed' => 'ДоÑтупний',
+ 'Top' => 'Вгору',
+ 'Bottom' => 'Вниз',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..7df0554
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::UK::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..8f30eba
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::UK::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => 'Включити інÑтрукцію DROP',
+ 'WithCreate' => 'Включити інÑтрукцію CREATE',
+ 'TableName' => 'Ім\'Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†Ñ–',
+ 'InfoFile' => 'SQL файл: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..b0682d6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::UK::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => 'Ðрхів у файлі: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..a9fa0e8
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::UK::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => 'Файл зразка',
+ 'ModelText' => 'ТекÑÑ‚ зразка',
+ 'Models' => 'ВикориÑтовувати зразок',
+ 'UseFile' => 'ВикориÑтовувати файл',
+ 'UseModel' => 'ВикориÑтовувати облаÑÑ‚ÑŒ текÑту',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..fa999e6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::UK::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'Де його шукати',
+ 'Default' => 'Типова тека Alexandria',
+ 'Specified' => 'Тека, вказана нижче',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..d29b198
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::UK::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'Charset',
+ 'Header' => 'Ігнорувати перший Ñ€Ñдок',
+ 'Separator' => 'Розділювач',
+ 'Plugin' => 'ВикориÑтовувати Ñайт',
+ 'UseFirst' => 'ВикориÑтовувати перший, Ñкщо знайдено декілька',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..dd6e8e1
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportFolder.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::UK::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Folder',
+ 'Recursive' => 'Browse sub-folders',
+ 'Suffixes' => 'Suffixes or extensions of the files',
+ 'SuffixesTooltip' => 'A comma-separated list of suffixes or extensions of files to consider',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..faf756c
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::UK::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'Копіювати зображеннÑ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportList.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportList.pm
new file mode 100644
index 0000000..7721814
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::UK::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'СпиÑок імен',
+ 'Plugin' => 'ВикориÑтовувати Ñайт',
+ 'UseFirst' => 'ВикориÑтовувати перший, Ñкщо знайдено декілька',
+ 'CommentAuto' => 'Ð—Ð°Ð¿Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡Ð½Ð¾ імпортований.',
+ 'CommentSite' => 'ВебÑайт: ',
+ 'CommentTitle' => 'Заголовок: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..70b9cc2
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::UK::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..2fbd677
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::UK::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'Файл не є підтримуваною колекцією Tellico',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..88db64e
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::UK::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (episodes) collection',
+ Items => 'Episodes',
+ NewItem => 'New episode',
+ NewSeries => 'New series',
+ Episode => 'Episode',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..61a449c
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::UK::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'TV Shows (series) collection',
+ Items => 'Series',
+ NewItem => 'New series',
+ Name => 'Name',
+ Season => 'Season',
+ Part => 'Part',
+ Episodes => 'Episodes',
+ FirstAired => 'First Aired',
+ Time => 'Ep. Length',
+ Producer => 'Producer',
+ Music => 'Music',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..385ecc4
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::UK::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ Ð½Ð°Ñтільних ігор',
+ Items => {0 => 'Ігор',
+ 1 => 'Гра',
+ X => 'Ігор'},
+ NewItem => 'Ðова гра',
+
+ Id => 'Id',
+ Name => 'Ðазва',
+ Original => 'Оригінальна назва',
+ Box => 'Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¾Ð±ÐºÐ¸',
+ DesignedBy => 'Розроблена',
+ PublishedBy => 'Видана',
+ Players => 'ЧиÑло гравців',
+ PlayingTime => 'Ð§Ð°Ñ Ð³Ñ€Ð¸',
+ SuggestedAge => 'Рекомендований вік',
+ Released => 'Випущено',
+ Description => 'ОпиÑ',
+ Category => 'КатегоріÑ',
+ Mechanics => 'Механіка',
+ ExpandedBy => 'РозширеннÑ',
+ ExpansionFor => 'Ð Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ Ð´Ð»Ñ',
+ GameFamily => 'Сім\'Ñ Ñ–Ð³Ð¾Ñ€',
+ IllustratedBy => 'ІлюÑтрації',
+ Url => 'Сторінка тенет',
+ TimesPlayed => 'Грали разів',
+ CompleteContents => 'ÐаÑвніÑÑ‚ÑŒ вміÑту',
+ Copies => 'ЧиÑло копій',
+ Condition => 'Стан',
+ Photos => 'Фотографії',
+ Photo1 => 'Перше зображеннÑ',
+ Photo2 => 'Друге зображеннÑ',
+ Photo3 => 'Третє зображеннÑ',
+ Photo4 => 'Четверте зображеннÑ',
+ Comments => 'Коментарі',
+
+ Perfect => 'Чудово',
+ Good => 'Добре',
+ Average => 'ПоÑередньо',
+ Poor => 'Погано',
+
+ CompleteYes => 'ÐаÑвний повніÑÑ‚ÑŽ',
+ CompleteNo => 'ЧаÑтково втрачений',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ Personal => 'ОÑобиÑта',
+ Information => 'ІнформаціÑ',
+
+ FilterRatingSelect => '_Оцінка принаймні...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCbooks.pm b/lib/gcstar/GCLang/UK/GCModels/GCbooks.pm
new file mode 100644
index 0000000..0136856
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCbooks.pm
@@ -0,0 +1,69 @@
+{
+ package GCLang::UK::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ ÐºÐ½Ð¸Ð³',
+ Items => 'Книги',
+ NewItem => 'Ðова книга',
+
+ Isbn => 'ISBN',
+ Title => 'Заголовок',
+ Cover => 'Обкладинка',
+ Authors => 'Ðвтори',
+ Publisher => 'Видавець',
+ Publication => 'Дата виданнÑ',
+ Language => 'Мова',
+ Genre => 'Жанр',
+ Serie => 'СеріÑ',
+ Rank => 'РозрÑд',
+ Bookdescription => 'ОпиÑ',
+ Pages => 'Сторінок',
+ Read => 'Прочитана',
+ Rating => 'Оцінка',
+ Acquisition => 'Дата придбаннÑ',
+ Edition => 'ВиданнÑ',
+ Format => 'Формат',
+ Comments => 'Коментарі',
+ Url => 'Сторінка тенет',
+ Translator => 'Перекладач',
+ Artist => 'Художник',
+ DigitalFile => 'Digital version',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+
+ ReadNo => 'Ðе прочитана',
+ ReadYes => 'Прочитана',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCcoins.pm b/lib/gcstar/GCLang/UK/GCModels/GCcoins.pm
new file mode 100644
index 0000000..3f5528d
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCcoins.pm
@@ -0,0 +1,102 @@
+{
+ package GCLang::UK::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Ðумізматична колекціÑ',
+ Items => 'Монети',
+ NewItem => 'Ðова монета',
+
+ Name => 'Ðазва',
+ Country => 'Країна',
+ Year => 'Рік',
+ Currency => 'Грошова одиницÑ',
+ Value => 'ЗначеннÑ',
+ Picture => 'Головне зображеннÑ',
+ Diameter => 'Діаметр',
+ Metal => 'Метал',
+ Edge => 'Грань',
+ Edge1 => 'Грань 1',
+ Edge2 => 'Грань 2',
+ Edge3 => 'Грань 3',
+ Edge4 => 'Грань 4',
+ Head => 'ÐверÑ',
+ Tail => 'РеверÑ',
+ Comments => 'Коментарі',
+ History => 'ІÑторіÑ',
+ Website => 'Сторінка тенет',
+ Estimate => 'ЦінніÑÑ‚ÑŒ',
+ References => 'ПоÑиланнÑ',
+ Type => 'Тип',
+ Coin => 'Монета',
+ Banknote => 'Банкнота',
+
+ Main => 'Головна',
+ Description => 'ОпиÑ',
+ Other => 'Інша інформаціÑ',
+ Pictures => 'ЗображеннÑ',
+
+ Condition => 'Стан (PCGS)',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCcomics.pm b/lib/gcstar/GCLang/UK/GCModels/GCcomics.pm
new file mode 100644
index 0000000..9a70b74
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::UK::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Comics collection',
+ Items => {0 => 'Comics',
+ 1 => 'Comic',
+ X => 'Comics'},
+ NewItem => 'New comic',
+
+
+ Id => 'Id',
+ Name => 'Name',
+ Series => 'Series',
+ Volume => 'Volume',
+ Title => 'Title',
+ Writer => 'Writer',
+ Illustrator => 'Illustrator',
+ Colourist => 'Colourist',
+ Publisher => 'Publisher',
+ Synopsis => 'Synopsis',
+ Collection => 'Collection',
+ PublishDate => 'Publish Date',
+ PrintingDate => 'Printing Date',
+ ISBN => 'ISBN',
+ Type => 'Type',
+ Category => 'Category',
+ Format => 'Format',
+ NumberBoards => 'Number of Boards',
+ Signing => 'Signing',
+ Cost => 'Cost',
+ Rating => 'Rating',
+ Comment => 'Comments',
+ Url => 'Web page',
+
+ FilterRatingSelect => 'Rating At _Least...',
+
+ Main => 'Main items',
+ General => 'General',
+ Details => 'Details',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCfilms.pm b/lib/gcstar/GCLang/UK/GCModels/GCfilms.pm
new file mode 100644
index 0000000..6936741
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCfilms.pm
@@ -0,0 +1,92 @@
+{
+ package GCLang::UK::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ Ñ„Ñ–Ð»ÑŒÐ¼Ñ–Ð²',
+ Items => 'Фільми',
+ NewItem => 'Ðовий фільм',
+
+
+ Id => 'Ідентифікатор',
+ Title => 'Ðазва',
+ Date => 'Дата',
+ Time => 'ТриваліÑÑ‚ÑŒ',
+ Director => 'РежиÑер',
+ Country => 'Країна',
+ MinimumAge => 'Мінімальний вік',
+ Genre => 'Жанр',
+ Image => 'ЗображеннÑ',
+ Original => 'Оригінальна назва',
+ Actors => 'Ð’ ролÑÑ…',
+ Actor => 'Ðктор',
+ Role => 'Роль',
+ Comment => 'Коментарі',
+ Synopsis => 'ÐнотаціÑ',
+ Seen => 'ПереглÑнутий',
+ Number => 'КількіÑÑ‚ÑŒ ноÑіїв',
+ Rating => 'Оцінка',
+ Format => 'ÐоÑій',
+ Region => 'Region',
+ Identifier => 'Ідентифікатор',
+ Url => 'Сторінка тенет',
+ Audio => 'Звук',
+ Video => 'Відео формат',
+ Trailer => 'Відеофайл',
+ Serie => 'КолекціÑ',
+ Rank => 'РозрÑд',
+ Subtitles => 'Субтитри',
+
+ SeenYes => 'ПереглÑнутий',
+ SeenNo => 'Ðе переглÑнутий',
+
+ AgeUnrated => 'Ðеоцінений',
+ AgeAll => 'Будь-Ñкий вік',
+ AgeParent => 'Під наглÑдом батьків',
+
+ Main => 'Головні пункти',
+ General => 'Загальна',
+ Details => 'Подробиці',
+
+ Information => 'ІнформаціÑ',
+ Languages => 'Мови',
+ Encoding => 'КодуваннÑ',
+
+ FilterAudienceAge => 'Вік глÑдачів',
+ FilterSeenNo => '_Ще не переглÑнутий',
+ FilterSeenYes => '_Вже переглÑнутий',
+ FilterRatingSelect => '_Оцінка принаймні...',
+
+ ExtractSize => 'Розмір',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCgames.pm b/lib/gcstar/GCLang/UK/GCModels/GCgames.pm
new file mode 100644
index 0000000..0c80a1a
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCgames.pm
@@ -0,0 +1,81 @@
+{
+ package GCLang::UK::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ Ð²Ñ–Ð´ÐµÐ¾Ñ–Ð³Ð¾Ñ€',
+ Items => 'Ігри',
+ NewItem => 'Ðова гра',
+
+ Id => 'Ідентифікатор',
+ Ean => 'EAN',
+ Name => 'Ðазва',
+ Platform => 'Платформа',
+ Players => 'КількіÑÑ‚ÑŒ гравців',
+ Released => 'Дата випуÑку',
+ Editor => 'Редактор',
+ Developer => 'Розробник',
+ Genre => 'Жанр',
+ Box => 'Ð—Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ñ€Ð¾Ð±ÐºÐ¸',
+ Case => 'КорпуÑ',
+ Manual => 'Підручник інÑтрукцій',
+ Rating => 'Оцінка',
+ Completion => 'Завершено (%)',
+ Executable => 'ЗапуÑкаючий файл',
+ Description => 'ОпиÑ',
+ Codes => 'Коди',
+ Code => 'Код',
+ Effect => 'ÐаÑлідок',
+ Secrets => 'Секрети',
+ Screenshots => 'Знімки екрану',
+ Screenshot1 => 'Перший знімок',
+ Screenshot2 => 'Другий знімок',
+ Comments => 'Коментарі',
+ Url => 'Сторінка тенет',
+ Unlockables => 'РозблокуваннÑ',
+ Unlockable => 'РозблокуваннÑ',
+ Howto => 'Як розблокувати',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ Tips => 'Поради',
+ Information => 'ІнформаціÑ',
+
+ FilterRatingSelect => '_Оцінка принаймні...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..536399e
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCgeneric.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::UK::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCminicars.pm b/lib/gcstar/GCLang/UK/GCModels/GCminicars.pm
new file mode 100644
index 0000000..e0f899a
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::UK::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Number of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCmusics.pm b/lib/gcstar/GCLang/UK/GCModels/GCmusics.pm
new file mode 100644
index 0000000..d273b9b
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCmusics.pm
@@ -0,0 +1,66 @@
+{
+ package GCLang::UK::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ Ð¼ÑƒÐ·Ð¸ÐºÐ¸',
+ Items => 'Ðльбоми',
+ NewItem => 'Ðовий альбом',
+
+ Unique => 'ISRC/EAN',
+ Title => 'Ðазва',
+ Cover => 'Обкладинка',
+ Artist => 'Виконавець',
+ Format => 'Формат',
+ Running => 'Ð§Ð°Ñ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ',
+ Release => 'Дата випуÑку',
+ Genre => 'Жанр',
+ Origin => 'Origin',
+
+#For tracks list
+ Tracks => 'СпиÑок доріжок',
+ Number => 'Ðомер',
+ Track => 'Ðазва',
+ Time => 'ЧаÑ',
+
+ Composer => 'Композитор',
+ Producer => 'ПродюÑер',
+ Playlist => 'Перелік композицій',
+ Comments => 'Коментарі',
+ Label => 'Мітка',
+ Url => 'Сторінка тенет',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..c872b36
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCperiodicals.pm
@@ -0,0 +1,52 @@
+{
+ package GCLang::UK::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals'},
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..4272997
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::UK::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..8959938
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::UK::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCstamps.pm b/lib/gcstar/GCLang/UK/GCModels/GCstamps.pm
new file mode 100644
index 0000000..64e1c8a
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCstamps.pm
@@ -0,0 +1,189 @@
+{
+ package GCLang::UK::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps'},
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCModels/GCwines.pm b/lib/gcstar/GCLang/UK/GCModels/GCwines.pm
new file mode 100644
index 0000000..2a25fab
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCModels/GCwines.pm
@@ -0,0 +1,63 @@
+{
+ package GCLang::UK::GCModels::GCwines;
+
+ use utf8;
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'ÐšÐ¾Ð»ÐµÐºÑ†Ñ–Ñ Ð²Ð¸Ð½',
+ Items => {0 => 'Вин',
+ 1 => 'Вино',
+ X => 'Вин'},
+ NewItem => 'Ðове вино',
+
+ Name => 'Ðазва',
+ Designation => 'Позначка',
+ Vintage => 'Модель',
+ Vineyard => 'Виноградник',
+ Type => 'Тип',
+ Grapes => 'Виноград',
+ Soil => 'Грунт',
+ Producer => 'Виробник',
+ Country => 'Країна',
+ Volume => 'Об\'єм (мл)',
+ Alcohol => 'Спирт (%)',
+ Medal => 'Медаль/ВшануваннÑ',
+
+ Storage => 'ЗберіганнÑ',
+ Location => 'МіÑце',
+ ShelfIndex => 'Покажчик',
+ Quantity => 'Розмір',
+ Acquisition => 'Придбано',
+ PurchaseDate => 'Дата покупки',
+ PurchasePrice => 'ВартіÑÑ‚ÑŒ покупки',
+ Gift => 'Подарунок',
+ BottleLabel => 'Етикетка плÑшки',
+ Website => 'ПоÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð½Ð° тенета',
+
+ Tasted => 'ДегуÑтоване',
+ Comments => 'Коментарі',
+ Serving => 'Порції',
+ TastingField => 'Помітки дегуÑтації',
+
+ General => 'Загальна',
+ Details => 'Подробиці',
+ Tasting => 'ДегуÑтаціÑ',
+
+ TastedNo => 'Ðе дегуÑтоване',
+ TastedYes => 'ДегуÑтоване',
+
+ FilterRange => 'Діапазон',
+ FilterTastedNo => '_Ще не дегуÑтоване',
+ FilterTastedYes => 'Уже _дегуÑтоване',
+ FilterRatingSelect => 'Оцінка _принаймні...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/UK/GCstar.pm b/lib/gcstar/GCLang/UK/GCstar.pm
new file mode 100644
index 0000000..14d3ea6
--- /dev/null
+++ b/lib/gcstar/GCLang/UK/GCstar.pm
@@ -0,0 +1,674 @@
+{
+ package GCLang::UK;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+#
+# MODEL-SPECIFIC CODES
+#
+# Some strings are modified to include the model-specific item type. Inside these strings,
+# any strings contained in {}'s will be replaced by the corresponding string from
+# the Item collection in the model language file. For example:
+#
+# {lowercase1} = {Items}->{lowercase1} (item type, singular, all lowercase). EG: game, movie, book
+# {1} = {Items}->{1} (item type, singular, with first letter uppercase). EG: Game, Movie, Book
+# {lowercaseX} = {Items}->{lowercaseX} (item type, multiple, lowercase). EG: games, movies, books
+# {X} = {Items}->{X} (item type, multiple, with first letter uppercase). EG Games, Movies, Books
+#
+# GCstar will automatically convert these codes to the relevant translated string. You can
+# use these codes in any string marked by a "Accepts model codes" comment.
+#
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => 'Ukrainian',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>ПопередженнÑ</b>:
+
+ІнформаціÑ, звантажена з веб-Ñайтів (за допомогою
+пошукових втулків) призначена <b>лише Ð´Ð»Ñ Ð¾ÑобиÑтого викориÑтаннÑ</b>.
+
+Заборонений будь-Ñкий перерозподіл без
+<b>Ñвного дозволу Ñайту</b>.
+
+Щоб визначити, Ñкий Ñайт володіє інформацією,
+можна ÑкориÑтатиÑÑŒ <b>кнопкою на вкладці подробиць про фільм</b>.',
+
+ 'AllItemsFiltered' => 'Ðе знайдено відповідноÑтей вашому запиту', # Accepts model codes
+
+#Installation
+ 'InstallDirInfo' => 'Ð’Ñтановити до ',
+ 'InstallMandatory' => 'Обов\'Ñзкові компоненти',
+ 'InstallOptional' => 'Додаткові компоненти',
+ 'InstallErrorMissing' => 'Помилка : Потрібно вÑтановити наÑтупні компоненти Perl: ',
+ 'InstallPrompt' => 'ОÑновна тека Ð´Ð»Ñ Ð²ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ [/usr/local]: ',
+ 'InstallEnd' => 'Кінець вÑтановленнÑ',
+ 'InstallNoError' => 'Ðемає помилок',
+ 'InstallLaunch' => 'Ð”Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñ†ÑŒÐ¾Ð³Ð¾ додатку ви можете запуÑтити ',
+ 'InstallDirectory' => 'ОÑновна таке',
+ 'InstallTitle' => 'Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ GCstar',
+ 'InstallDependencies' => 'ЗалежноÑÑ‚Ñ–',
+ 'InstallPath' => 'ШлÑÑ…',
+ 'InstallOptions' => 'Опції',
+ 'InstallSelectDirectory' => 'Виберіть оÑновну теку Ð´Ð»Ñ Ð²ÑтановленнÑ',
+ 'InstallWithClean' => 'УÑунути файли, знайдені у теці вÑтановленнÑ',
+ 'InstallWithMenu' => 'Додати GCstar меню Додатки',
+ 'InstallNoPermission' => 'Помилка: Ви не маєте дозволу Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñу в обрану теку',
+ 'InstallMissingMandatory' => 'Обов\'Ñзкові залежноÑÑ‚Ñ– відÑутні. Ви не можете вÑтановити GCstar поки вони не будуть додані до ÑиÑтеми.',
+ 'InstallMissingOptional' => 'ДеÑкі додаткові залежноÑÑ‚Ñ– відÑутні. Їх ÑпиÑок нижче. GCstar можна вÑтановити, але деÑкі можливоÑÑ‚Ñ– будуть недоÑтупні.',
+ 'InstallMissingNone' => 'УÑÑ– залежноÑÑ‚Ñ– забезпечено. Ви можете продовжити вÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ GCstar.',
+ 'InstallOK' => 'OK',
+ 'InstallMissing' => 'ВідÑутні',
+ 'InstallMissingFor' => 'ВідÑутні длÑ',
+ 'InstallCleanDirectory' => 'УÑÑƒÐ½ÐµÐ½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² GCstar з теки: ',
+ 'InstallCopyDirectory' => 'ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² до теки: ',
+ 'InstallCopyDesktop' => 'ÐšÐ¾Ð¿Ñ–ÑŽÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ñ–Ð² Ñтільниці: ',
+
+#Update
+ 'UpdateUseProxy' => 'Вживати прокÑÑ– (проÑто натиÑніть ввід, Ñкщо немає): ',
+ 'UpdateNoPermission' => 'Ðемає дозволу запиÑу до цієї теки: ',
+ 'UpdateNone' => 'Оновлень не знайдено',
+ 'UpdateFileNotFound' => 'Файл не знайдений',
+
+#Splash
+ 'SplashInit' => 'ІніціалізуваннÑ',
+ 'SplashLoad' => 'Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ ÐºÐ¾Ð»ÐµÐºÑ†Ñ–Ñ—',
+ 'SplashDisplay' => 'Показ колекції',
+ 'SplashSort' => 'Ð¡Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÐµÐºÑ†Ñ–Ñ—',
+ 'SplashDone' => 'Готово',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => 'ЗдаєтьÑÑ Ð²Ð¸ раніше кориÑтувалиÑÑŒ GCfilms. Що ви хочете імпортувати з GCfilms до GCstar (це не вплине на GCfilms Ñкщо ви Ñ– далі хочете ним кориÑтуватиÑÑŒ)?',
+ 'GCfilmsImportOptions' => 'ÐалаштуваннÑ',
+ 'GCfilmsImportData' => 'СпиÑок фільмів',
+
+#Menus
+ 'MenuFile' => '_Файл',
+ 'MenuNewList' => '_Ðова колекціÑ',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '_ОÑтанні колекції',
+ 'MenuLend' => 'Показати _позичені', # Accepts model codes
+ 'MenuImport' => '_Імпорт',
+ 'MenuExport' => '_ЕкÑпорт',
+ 'MenuAddItem' => '_Add Items', # Accepts model codes
+
+ 'MenuEdit' => '_РедагуваннÑ',
+ 'MenuDuplicate' => '_Дублювати фільм', # Accepts model codes
+ 'MenuDuplicatePlural' => 'Du_plicate Items', # Accepts model codes
+ 'MenuEditSelectAllItems' => 'Select _All Items', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '_УÑунути фільм', # Accepts model codes
+ 'MenuEditDeleteCurrentPlural' => '_Remove Items', # Accepts model codes
+ 'MenuEditFields' => '_Змінити Ð¿Ð¾Ð»Ñ ÐºÐ¾Ð»ÐµÐºÑ†Ñ–Ñ—',
+ 'MenuEditLockItems' => 'За_блокувати колекцію',
+
+ 'MenuDisplay' => 'Ф_ільтр',
+ 'MenuSavedSearches' => 'Saved searches',
+ 'MenuSavedSearchesSave' => 'Save current search',
+ 'MenuSavedSearchesEdit' => 'Modify saved searches',
+ 'MenuAdvancedSearch' => '_Розширений пошук',
+ 'MenuViewAllItems' => 'Показати _вÑÑ– запиÑи', # Accepts model codes
+ 'MenuNoFilter' => '_УÑÑ–',
+
+ 'MenuConfiguration' => '_Параметри',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '_Відображувана інформаціÑ',
+ 'MenuBorrowers' => '_Боржники',
+ 'MenuToolbarConfiguration' => '_Toolbar controls',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => 'Зміна _Жанру',
+
+ 'MenuBookmarks' => '_Мої колекції',
+ 'MenuBookmarksAdd' => '_Додати поточну колекцію',
+ 'MenuBookmarksEdit' => '_Редагувати закладки',
+
+ 'MenuHelp' => '_Допомога',
+ 'MenuHelpContent' => '_ЗміÑÑ‚',
+ 'MenuAllPlugins' => 'ПереглÑд _втулків',
+ 'MenuBugReport' => '_ÐадіÑлати звіт про помилку',
+ 'MenuAbout' => '_Про GCstar',
+
+ 'MenuNewWindow' => 'Показати Ð·Ð°Ð¿Ð¸Ñ Ñƒ _новому вікні', # Accepts model codes
+ 'MenuNewWindowPlural' => 'Show Items in _New Window', # Accepts model codes
+
+ 'ContextExpandAll' => 'Розгорнути уÑÑ–',
+ 'ContextCollapseAll' => 'Згорнути уÑÑ–',
+ 'ContextChooseImage' => 'Choose _Image',
+ 'ContextOpenWith' => 'Open Wit_h',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'Front',
+ 'ContextImgBack' => 'Back',
+ 'ContextChooseFile' => 'Choose a File',
+ 'ContextChooseFolder' => 'Choose a Folder',
+
+ 'DialogEnterNumber' => 'Будь лаÑка, введіть значеннÑ',
+
+ 'RemoveConfirm' => 'Ви дійÑно хочете уÑунути цей запиÑ?', # Accepts model codes
+ 'RemoveConfirmPlural' => 'Do you really want to remove these items?', # Accepts model codes
+ 'DefaultNewItem' => 'Ðовий запиÑ', # Accepts model codes
+ 'NewItemTooltip' => 'Додати новий запиÑ', # Accepts model codes
+ 'NoItemFound' => 'Ðічого не знайдено. Ви хочете шукати на іншому Ñайті?',
+ 'OpenList' => 'Будь лаÑка, оберіть колекцію',
+ 'SaveList' => 'Будь лаÑка, виберіть куди зберегти колекцію',
+ 'SaveListTooltip' => 'Зберегти поточну колекцію',
+ 'SaveUnsavedChanges' => 'Є незбережені зміни у вашій колекції. Ви хочете їх зберегти?',
+ 'SaveDontSave' => 'Ðе зберігати',
+ 'PreferencesTooltip' => 'Ðалаштуйте ваші уподобаннÑ',
+ 'ViewTooltip' => 'Змініть показ колекції',
+ 'PlayTooltip' => 'Програвати відео, зв\'Ñзане з запиÑом', # Accepts model codes
+ 'PlayFileNotFound' => 'File to launch was not found in this location:',
+ 'PlayRetry' => 'Retry',
+
+ 'StatusSave' => 'ЗбереженнÑ...',
+ 'StatusLoad' => 'ЗавантаженнÑ...',
+ 'StatusSearch' => 'ВиконуєтьÑÑ Ð¿Ð¾ÑˆÑƒÐº...',
+ 'StatusGetInfo' => 'ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ñ–Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ—...',
+ 'StatusGetImage' => 'ÐžÑ‚Ñ€Ð¸Ð¼Ð°Ð½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ...',
+
+ 'SaveError' => 'Ðеможливо зберегти ÑпиÑок запиÑів. Будь лаÑка, перевірте права доÑтупу та наÑвніÑÑ‚ÑŒ вільного міÑÑ†Ñ Ð½Ð° диÑку.',
+ 'OpenError' => 'Ðеможливо зберегти ÑпиÑок запиÑів. Будь лаÑка, перевірте права доÑтупу.',
+ 'OpenFormatError' => 'Ðеможливо відкрити ÑпиÑок запиÑів. Формат може бути неправильним.',
+ 'OpenVersionWarning' => 'Collection was created with a more recent version of GCstar. If you save it, you may loose some data.',
+ 'OpenVersionQuestion' => 'Do you still want to continue?',
+ 'ImageError' => 'Обрана тека Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ некоректна. Будь лаÑка, виберіть іншу.',
+ 'OptionsCreationError'=> 'Ðеможливо Ñтворити файл опцій: ',
+ 'OptionsOpenError'=> 'Ðеможливо відкрити файл опцій: ',
+ 'OptionsSaveError'=> 'Ðеможливо зберегти файл опцій: ',
+ 'ErrorModelNotFound' => 'Model not found: ',
+ 'ErrorModelUserDir' => 'User defined models are in: ',
+
+ 'RandomTooltip' => 'Що подивитиÑÑŒ Ñьогодні ввечері ?',
+ 'RandomError'=> 'У Ð²Ð°Ñ Ð½ÐµÐ¼Ð°Ñ” вибраних запиÑів', # Accepts model codes
+ 'RandomEnd'=> 'Ðемає більше запиÑів', # Accepts model codes
+ 'RandomNextTip'=> 'ÐаÑтупна пропозиціÑ',
+ 'RandomOkTip'=> 'ПрийнÑти цей запиÑ',
+
+ 'AboutTitle' => 'Про GCstar',
+ 'AboutDesc' => 'Менеджер колекцій',
+ 'AboutVersion' => 'ВерÑÑ–Ñ',
+ 'AboutTeam' => 'Команда',
+ 'AboutWho' => 'Tian: Керівник проекту, програміÑÑ‚
+Nyall Dawson (Zombiepig): програміÑÑ‚
+TPF: програміÑÑ‚
+Adolfo González : програміÑÑ‚
+',
+ 'AboutLicense' => 'РозповÑюджуєтьÑÑ Ð·Ð³Ñ–Ð´Ð½Ð¾ умов GNU GPL
+Права на логотипи належать le Spektre',
+ 'AboutTranslation' => 'УкраїнÑький переклад виконав Ailandar',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Логотип та вебдизайн le Spektre',
+
+ 'ToolbarRandom' => 'Цього вечора',
+
+ 'UnsavedCollection' => 'Unsaved Collection',
+ 'ModelsSelect' => 'Виберіть тип колекції',
+ 'ModelsPersonal' => 'ОÑобиÑÑ‚Ñ– моделі',
+ 'ModelsDefault' => 'Типові моделі',
+ 'ModelsList' => 'ÐžÐ¿Ð¸Ñ ÐºÐ¾Ð»ÐµÐºÑ†Ñ–Ñ—',
+ 'ModelSettings' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÐµÐºÑ†Ñ–Ñ—',
+ 'ModelNewType' => 'Ðовий тип колекції',
+ 'ModelName' => 'Ім\'Ñ Ñ‚Ð¸Ð¿Ñƒ колекції:',
+ 'ModelFields' => 'ПолÑ',
+ 'ModelOptions' => 'Опції',
+ 'ModelFilters' => 'Фільтри',
+ 'ModelNewField' => 'Ðове поле',
+ 'ModelFieldInformation' => 'ІнформаціÑ',
+ 'ModelFieldName' => 'Мітка:',
+ 'ModelFieldType' => 'Тип:',
+ 'ModelFieldGroup' => 'Група:',
+ 'ModelFieldValues' => 'ЗначеннÑ',
+ 'ModelFieldInit' => 'Типово:',
+ 'ModelFieldMin' => 'Мінімум:',
+ 'ModelFieldMax' => 'МакÑимум:',
+ 'ModelFieldList' => 'СпиÑок значень:',
+ 'ModelFieldListLegend' => '<i>Розділені комами</i>',
+ 'ModelFieldDisplayAs' => 'Display as:',
+ 'ModelFieldDisplayAsText' => 'Text',
+ 'ModelFieldDisplayAsGraphical' => 'Rating Control',
+ 'ModelFieldTypeShortText' => 'Короткий текÑÑ‚',
+ 'ModelFieldTypeLongText' => 'Довгий текÑÑ‚',
+ 'ModelFieldTypeYesNo' => 'Так/ÐÑ–',
+ 'ModelFieldTypeNumber' => 'Ðомер',
+ 'ModelFieldTypeDate' => 'Дата',
+ 'ModelFieldTypeOptions' => 'Ðапередвизначений ÑпиÑок значень',
+ 'ModelFieldTypeImage' => 'ЗображеннÑ',
+ 'ModelFieldTypeSingleList' => 'ПроÑтий ÑпиÑок',
+ 'ModelFieldTypeFile' => 'Файл',
+ 'ModelFieldTypeFormatted' => 'Залежне від інших полів',
+ 'ModelFieldParameters' => 'Параметри',
+ 'ModelFieldHasHistory' => 'ВикориÑтовувати Ñ–Ñторію',
+ 'ModelFieldFlat' => 'Показувати в один Ñ€Ñдок',
+ 'ModelFieldStep' => 'Крок збільшеннÑ:',
+ 'ModelFieldFileFormat' => 'Формат файлу:',
+ 'ModelFieldFileFile' => 'ПрÑтий файл',
+ 'ModelFieldFileImage' => 'ЗображеннÑ',
+ 'ModelFieldFileVideo' => 'Відео',
+ 'ModelFieldFileAudio' => 'Ðудіо',
+ 'ModelFieldFileProgram' => 'Програма',
+ 'ModelFieldFileUrl' => 'URL',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => 'ВикориÑтовувати полÑ',
+ 'ModelOptionsFieldsAuto' => 'Ðвтоматично',
+ 'ModelOptionsFieldsNone' => 'ÐÑ–Ñк',
+ 'ModelOptionsFieldsTitle' => 'Як заголовок',
+ 'ModelOptionsFieldsId' => 'Як ідентифікатор',
+ 'ModelOptionsFieldsCover' => 'Як обкладинку',
+ 'ModelOptionsFieldsPlay' => 'Ð”Ð»Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ Програти',
+ 'ModelCollectionSettings' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ¾Ð»ÐµÐºÑ†Ñ–Ñ—',
+ 'ModelCollectionSettingsLending' => 'Об\'єкти можна позичати',
+ 'ModelCollectionSettingsTagging' => 'ЗапиÑам можна призначати бирки',
+ 'ModelFilterActivated' => 'Може бути в Ñ€Ñдку пошуку',
+ 'ModelFilterComparison' => 'ПорівнÑннÑ',
+ 'ModelFilterContain' => 'МіÑтить',
+ 'ModelFilterDoesNotContain' => 'Does not contain',
+ 'ModelFilterRegexp' => 'Regular expression',
+ 'ModelFilterRange' => 'Діапазон',
+ 'ModelFilterNumeric' => 'ПорівнÑÐ½Ð½Ñ Ñ” чиÑловим',
+ 'ModelFilterQuick' => 'Створити швидкий фільтр',
+ 'ModelTooltipName' => 'ВикориÑтовувати ім\'Ñ Ñ‰Ð¾Ð± вживати цю модель в інших колекціÑÑ…. Якщо порожнє, Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´ÑƒÑ‚ÑŒ збережені безпоÑередньо в Ñамій колекції',
+ 'ModelTooltipLabel' => 'Ім\'Ñ Ð¿Ð¾Ð»Ñ, Ñк воно буде показуватиÑÑŒ',
+ 'ModelTooltipGroup' => 'ВживаєтьÑÑ Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ð»Ñ–Ð². ЗапиÑи без даного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ бути в типовій групі',
+ 'ModelTooltipHistory' => 'Попередньо введені Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ– зберігатиÑÑŒ у ÑпиÑку зв\'Ñзаних з полем',
+ 'ModelTooltipFormat' => 'Цей формат вживаєтьÑÑ Ð´Ð»Ñ Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð´Ñ–Ñ— при відкритті файлу кнопкою Програти',
+ 'ModelTooltipLending' => 'Це додає декілька полів Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð¸Ð´Ð°Ñ‡Ð°Ð¼Ð¸',
+ 'ModelTooltipTagging' => 'Це додає декілька полів Ð´Ð»Ñ ÐºÐµÑ€ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð¸Ñ€ÐºÐ°Ð¼Ð¸',
+ 'ModelTooltipNumeric' => 'Ð—Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¼Ð¾Ð¶ÑƒÑ‚ÑŒ викориÑтовуватиÑÑŒ Ñк чиÑла при порівнÑнні',
+ 'ModelTooltipQuick' => 'Це додає підменю у меню Фільтри',
+
+ 'ResultsTitle' => 'Виберіть об\'єкт', # Accepts model codes
+ 'ResultsNextTip' => 'Шукати на наÑтупному Ñайті',
+ 'ResultsPreview' => 'Попередній переглÑд',
+ 'ResultsInfo' => 'Ви можете додавати декілька запиÑів до колекції утримуючи клавішу Ctrl або Shift та вибираючи запиÑи', # Accepts model codes
+
+ 'OptionsTitle' => 'Параметри',
+ 'OptionsExpertMode' => 'Expert Mode',
+ 'OptionsPrograms' => 'Specify applications to use for different media, leave blank to use system defaults',
+ 'OptionsBrowser' => 'Веб оглÑдач',
+ 'OptionsPlayer' => 'Відео програвач',
+ 'OptionsAudio' => 'Ðудіо програвач',
+ 'OptionsImageEditor' => 'Image editor',
+ 'OptionsCdDevice' => 'CD device',
+ 'OptionsImages' => 'Тека зображень',
+ 'OptionsUseRelativePaths' => 'Вживати відноÑні шлÑхи Ð´Ð»Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ',
+ 'OptionsLayout' => 'ВиглÑд',
+ 'OptionsStatus' => 'Показувати Ñ€Ñдок Ñтану',
+ 'OptionsUseStars' => 'Use stars to display ratings',
+ 'OptionsWarning' => 'ПопередженнÑ: Зміни на цій Ñторінці будуть заÑтоÑовані піÑÐ»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¸.',
+ 'OptionsRemoveConfirm' => 'Питати Ð¿Ñ–Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¶ÐµÐ½Ð½Ñ Ð¿ÐµÑ€ÐµÐ´ видаленнÑм запиÑів',
+ 'OptionsAutoSave' => 'Ðвтоматично зберігати колекцію',
+ 'OptionsAutoLoad' => 'Завантажувати попередню колекцію при запуÑку',
+ 'OptionsSplash' => 'Показувати екран заÑтавки',
+ 'OptionsTearoffMenus' => 'Enable tear-off menus',
+ 'OptionsSpellCheck' => 'ВикориÑтовувати перевірку правопиÑу Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… текÑтових полів',
+ 'OptionsProgramTitle' => 'Оберіть програму Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ',
+ 'OptionsPlugins' => 'Отримувати дані з Ñайту',
+ 'OptionsAskPlugins' => 'Питати (Ð’ÑÑ– Ñайти)',
+ 'OptionsPluginsMulti' => 'Декілька Ñайтів',
+ 'OptionsPluginsMultiAsk' => 'Питати (Декілька Ñайтів)',
+ 'OptionsPluginsMultiPerField' => 'Декілька Ñайтів (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each selected field we will return the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => 'Ð’Ñтановити ÑпиÑок',
+ 'OptionsAskImport' => 'Виберіть Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ',
+ 'OptionsProxy' => 'ВикориÑтовувати прокÑÑ–',
+ 'OptionsCookieJar' => 'ВикориÑтовувати цей cookie jar файл',
+ 'OptionsLang' => 'Мова',
+ 'OptionsMain' => 'Головне',
+ 'OptionsPaths' => 'ШлÑхи',
+ 'OptionsInternet' => 'Інтернет',
+ 'OptionsConveniences' => 'Функції',
+ 'OptionsDisplay' => 'ВиглÑд',
+ 'OptionsToolbar' => 'Панель інÑтрументів',
+ 'OptionsToolbars' => {0 => 'Ðемає', 1 => 'Малі значки', 2 => 'Великі значки', 3 => 'System setting'},
+ 'OptionsToolbarPosition' => 'РозміщеннÑ',
+ 'OptionsToolbarPositions' => {0 => 'Вгорі', 1 => 'Внизу', 2 => 'Ліворуч', 3 => 'Праворуч'},
+ 'OptionsExpandersMode' => 'Розширювачі занадто довгі',
+ 'OptionsExpandersModes' => {'asis' => 'Ðе робити нічого', 'cut' => 'Обрізати', 'wrap' => 'ПеренеÑти Ñ€Ñдок'},
+ 'OptionsDateFormat' => 'Формат дати',
+ 'OptionsDateFormatTooltip' => 'Формат - один з тих, що викориÑтовуютьÑÑ Ñ„ÑƒÐ½ÐºÑ†Ñ–Ñ”ÑŽ strftime(3). Типово це %d/%m/%Y',
+ 'OptionsView' => 'СпиÑок запиÑів',
+ 'OptionsViews' => {0 => 'ТекÑÑ‚', 1 => 'ЗображеннÑ', 2 => 'Детальний'},
+ 'OptionsColumns' => 'Колонки',
+ 'OptionsMailer' => 'ВідÑилати через',
+ 'OptionsSMTP' => 'Сервер',
+ 'OptionsFrom' => 'Ваш e-mail',
+ 'OptionsTransform' => 'Розміщувати артиклі в кінці заголовків',
+ 'OptionsArticles' => 'Ðртиклі (Розділені комами)',
+ 'OptionsSearchStop' => 'ДозволÑти Ð¿ÐµÑ€ÐµÑ€Ð¸Ð²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ',
+ 'OptionsBigPics' => 'Use big pictures when available',
+ 'OptionsAlwaysOriginal' => 'ВикориÑтовувати головний заголовок Ñк оригінальний, Ñкщо оÑтанній відÑутній',
+ 'OptionsRestoreAccelerators' => 'Відновити акÑелератори',
+ 'OptionsHistory' => 'Розмір Ñ–Ñторії',
+ 'OptionsClearHistory' => 'ОчиÑтити Ñ–Ñторію',
+ 'OptionsStyle' => 'ВиглÑд',
+ 'OptionsDontAsk' => 'Більше не питати',
+ 'OptionsPathProgramsGroup' => 'Додатки',
+ 'OptionsProgramsSystem' => 'ВикориÑтовувати програми, визначені ÑиÑтемою',
+ 'OptionsProgramsUser' => 'ВикориÑтовувати інші програми',
+ 'OptionsProgramsSet' => 'Обрати програми',
+ 'OptionsPathImagesGroup' => 'ЗображеннÑ',
+ 'OptionsInternetDataGroup' => 'Імпорт даних',
+ 'OptionsInternetSettingsGroup' => 'ÐалаштуваннÑ',
+ 'OptionsDisplayInformationGroup' => 'Показ інформації',
+ 'OptionsDisplayArticlesGroup' => 'Статті',
+ 'OptionsImagesDisplayGroup' => 'Показати',
+ 'OptionsImagesStyleGroup' => 'Стиль',
+ 'OptionsDetailedPreferencesGroup' => 'УподобаннÑ',
+ 'OptionsFeaturesConveniencesGroup' => 'ЗручноÑÑ‚Ñ–',
+ 'OptionsPicturesFormat' => 'ÐŸÑ€ÐµÑ„Ñ–ÐºÑ Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ñƒ зображеннÑÑ…:',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'Заголовок або ім\'Ñ Ð·Ð²\'Ñзаного запиÑу',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% або . буде замінене текою колекції (вживаєтьÑÑ Ð»Ð¸ÑˆÐµ на початку шлÑху)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% буде замінене іменем колекції без ÑуфікÑу (.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% може вживатиÑÑŒ тільки на початку шлÑху до зображень',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% може вживатиÑÑŒ тільки на початку шлÑху до зображень',
+ 'OptionsConfigureMailers' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ð¾Ð²Ð¸Ñ… програм',
+
+ 'ImagesOptionsButton' => 'ÐалаштуваннÑ',
+ 'ImagesOptionsTitle' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ ÑпиÑку зображень',
+ 'ImagesOptionsSelectColor' => 'Оберіть колір',
+ 'ImagesOptionsUseOverlays' => 'ВикориÑтовувати Ð¿Ð¾ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½ÑŒ',
+ 'ImagesOptionsBg' => 'Тло',
+ 'ImagesOptionsBgPicture' => 'Вживати фонове зображеннÑ',
+ 'ImagesOptionsFg'=> 'Відбір',
+ 'ImagesOptionsBgTooltip' => 'Змінити колір тла',
+ 'ImagesOptionsFgTooltip'=> 'Змінити колір відбору',
+ 'ImagesOptionsResizeImgList' => 'Automatically change number of columns',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => 'Розмір',
+ 'ImagesOptionsSizeList' => {0 => 'Дуже малий', 1 => 'Малий', 2 => 'Середній', 3 => 'Великий', 4 => 'Дуже великий'},
+ 'ImagesOptionsSizeTooltip' => 'Виберіть розмір зображеннÑ',
+
+ 'DetailedOptionsTitle' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑпиÑку',
+ 'DetailedOptionsImageSize' => 'Розмір зображень',
+ 'DetailedOptionsGroupItems' => 'Групувати запиÑи за',
+ 'DetailedOptionsSecondarySort' => 'Сортувати Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð´Ñ–Ñ‚ÐµÐ¹',
+ 'DetailedOptionsFields' => 'Обрати Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ',
+ 'DetailedOptionsGroupedFirst' => 'Збирати разом оÑиротілі запиÑи',
+ 'DetailedOptionsAddCount' => 'Додати номер елемента в категорії',
+
+ 'ExtractButton' => 'ІнформаціÑ',
+ 'ExtractTitle' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ файл',
+ 'ExtractImport' => 'Вживати значеннÑ',
+
+ 'FieldsListOpen' => 'Завантажити ÑпиÑок полів з файлу',
+ 'FieldsListSave' => 'Зберегти ÑпиÑок полів до файлу',
+ 'FieldsListError' => 'Цей ÑпиÑок полів не може викориÑтовуватиÑÑŒ з даним видом колекцій',
+ 'FieldsListIgnore' => '--- Ігнорувати',
+
+ 'ExportTitle' => 'ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку запиÑів',
+ 'ExportFilter' => 'ЕкÑпортувати тільки відображувані запиÑи',
+ 'ExportFieldsTitle' => 'ÐŸÐ¾Ð»Ñ Ð´Ð»Ñ ÐµÐºÑпортуваннÑ',
+ 'ExportFieldsTip' => 'Оберіть полÑ, Ñкі ви хочете екÑпортувати',
+ 'ExportWithPictures' => 'Копіювати Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ Ñƒ підтеку',
+ 'ExportSortBy' => 'Сортувати за',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => 'Імпортувати інший ÑпиÑок запиÑів',
+ 'ImportExportData' => 'Дані',
+ 'ImportExportFile' => 'Файл',
+ 'ImportExportFieldsUnused' => 'ÐевикориÑтовувані полÑ',
+ 'ImportExportFieldsUsed' => 'ВикориÑтовувані полÑ',
+ 'ImportExportFieldsFill' => 'Додати вÑÑ–',
+ 'ImportExportFieldsClear' => 'УÑунути вÑÑ–',
+ 'ImportExportFieldsEmpty' => 'Ви повинні обрати хоча б одне поле',
+ 'ImportExportFileEmpty' => 'Ви повинні визначити ім\'Ñ Ñ„Ð°Ð¹Ð»Ñƒ',
+ 'ImportFieldsTitle' => 'ÐŸÐ¾Ð»Ñ Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ',
+ 'ImportFieldsTip' => 'Оберіть полÑ, Ñкі ви хочете імпортувати',
+ 'ImportNewList' => 'Створити нову колекцію',
+ 'ImportCurrentList' => 'Додати до поточної колекції',
+ 'ImportDropError' => 'Виникла помилка при відкритті щонайменше одного файлу. Попередній ÑпиÑок буде перевантажений.',
+ 'ImportGenerateId' => 'Створити ідентифікатор Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ запиÑу',
+
+ 'FileChooserOpenFile' => 'Будь лаÑка, оберіть файл Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑтаннÑ',
+ 'FileChooserDirectory' => 'Directory',
+ 'FileChooserOpenDirectory' => 'Оберіть теку',
+ 'FileChooserOverwrite' => 'Це поле уже Ñ–Ñнує. Ви хочете його перепиÑати?',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => 'Компактний',
+ 'PanelReadOnly' => 'Лише Ð´Ð»Ñ Ñ‡Ð¸Ñ‚Ð°Ð½Ð½Ñ',
+ 'PanelForm' => 'Вкладки',
+
+ 'PanelSearchButton' => 'Отримати інформацію',
+ 'PanelSearchTip' => 'Пошук в інтернеті інформації за цим іменем',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => 'Клацніть на зображенні Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ іншого.',
+ 'PanelImageTipView' => 'Клацніть на зображенні Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду його Ñправжнього розміру.',
+ 'PanelImageTipMenu' => ' Клацніть правою клавішею Ð´Ð»Ñ Ñ–Ð½ÑˆÐ¸Ñ… варіантів.',
+ 'PanelImageTitle' => 'Вибрати зображеннÑ',
+ 'PanelImageNoImage' => 'Ðемає зображеннÑ',
+ 'PanelSelectFileTitle' => 'Оберіть файл',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => 'Відновити типову',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'Від',
+ 'PanelTo' =>'До',
+
+ 'PanelWeb' => 'ПереглÑд інформації',
+ 'PanelWebTip' => 'ПереглÑд інформації в інтернеті про даний запиÑ', # Accepts model codes
+ 'PanelRemoveTip' => 'УÑунути поточний запиÑ', # Accepts model codes
+
+ 'PanelDateSelect' => 'Обрати',
+ 'PanelNobody' => 'Ðіхто',
+ 'PanelUnknown' => 'Ðевідомий',
+ 'PanelAdded' => 'Дата додаваннÑ',
+ 'PanelRating' => 'Оцінка',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'МіÑце',
+
+ 'PanelLending' => 'Позичка',
+ 'PanelBorrower' => 'Боржник',
+ 'PanelLendDate' => 'Позичив',
+ 'PanelHistory' => 'ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð¿Ð¾Ð·Ð¸Ñ‡Ð¾Ðº',
+ 'PanelReturned' => 'Річ повернута', # Accepts model codes
+ 'PanelReturnDate' => 'Дата поверненнÑ',
+ 'PanelLendedYes' => 'Позичено',
+ 'PanelLendedNo' => 'ДоÑтупно',
+
+ 'PanelTags' => 'Бирки',
+ 'PanelFavourite' => 'Улюблене',
+ 'TagsAssigned' => 'Призначені бирки',
+
+ 'PanelUser' => 'User fields',
+
+ 'CheckUndef' => 'Будь-Ñкі',
+ 'CheckYes' => 'Так',
+ 'CheckNo' => 'ÐÑ–',
+
+ 'ToolbarAll' => 'Показати вÑÑ–',
+ 'ToolbarAllTooltip' => 'Показати вÑÑ– запиÑи',
+ 'ToolbarGroupBy' => 'Групувати за',
+ 'ToolbarGroupByTooltip' => 'Оберіть поле Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð° ним запиÑів у ÑпиÑку',
+ 'ToolbarQuickSearch' => 'Quick search',
+ 'ToolbarQuickSearchLabel' => 'Search',
+ 'ToolbarQuickSearchTooltip' => 'Select the field to search in. Enter the search terms and press Enter',
+ 'ToolbarSeparator' => ' Separator',
+
+ 'PluginsTitle' => 'Пошук запиÑу',
+ 'PluginsQuery' => 'Запит',
+ 'PluginsFrame' => 'Пошук на Ñайті',
+ 'PluginsLogo' => 'Логотип',
+ 'PluginsName' => 'Ім\'Ñ',
+ 'PluginsSearchFields' => 'ÐŸÐ¾Ð»Ñ Ð¿Ð¾ÑˆÑƒÐºÑƒ',
+ 'PluginsAuthor' => 'Ðвтор',
+ 'PluginsLang' => 'Мова',
+ 'PluginsUseSite' => 'ВикориÑтовувати поточний Ñайт Ð´Ð»Ñ Ð¼Ð°Ð¹Ð±ÑƒÑ‚Ð½Ñ–Ñ… пошуків',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => 'ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð±Ð¾Ñ€Ð¶Ð½Ð¸ÐºÑ–Ð²',
+ 'BorrowersList' => 'Боржники',
+ 'BorrowersName' => 'Ім\'Ñ',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => 'Додати',
+ 'BorrowersRemove' => 'УÑунути',
+ 'BorrowersEdit' => 'Редагувати',
+ 'BorrowersTemplate' => 'Шаблон лиÑта',
+ 'BorrowersSubject' => 'Тема лиÑта',
+ 'BorrowersNotice1' => '%1 буде замінене на ім\'Ñ Ð±Ð¾Ñ€Ð¶Ð½Ð¸ÐºÐ°',
+ 'BorrowersNotice2' => '%2 буде замінене на назву речі',
+ 'BorrowersNotice3' => '%3 буде замінене на дату позички',
+
+ 'BorrowersImportTitle' => 'Імпорт інформації про боржників',
+ 'BorrowersImportType' => 'Формат файлу:',
+ 'BorrowersImportFile' => 'Файл:',
+
+ 'BorrowedTitle' => 'Позичені речі', # Accepts model codes
+ 'BorrowedDate' => 'З',
+ 'BorrowedDisplayInPanel' => 'Show item in main window', # Accepts model codes
+
+ 'MailTitle' => 'ÐадіÑлати e-mail',
+ 'MailFrom' => 'Від: ',
+ 'MailTo' => 'Кому: ',
+ 'MailSubject' => 'Тема: ',
+ 'MailSmtpError' => 'Проблема Ð¿Ñ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð´Ð¾ SMTP Ñервера',
+ 'MailSendmailError' => 'Проблема запуÑку sendmail',
+
+ 'SearchTooltip' => 'Шукати вÑÑ– запиÑи', # Accepts model codes
+ 'SearchTitle' => 'Пошук запиÑу', # Accepts model codes
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => 'ÐŸÐ¾Ð»Ñ Ð´Ð»Ñ Ð·Ð°Ð¼Ñ–Ð½Ð¸',
+ 'QueryReplaceOld' => 'Поточне значеннÑ',
+ 'QueryReplaceNew' => 'Ðове значеннÑ',
+ 'QueryReplaceLaunch' => 'Замінити',
+
+ 'ImportWindowTitle' => 'Виберіть Ð¿Ð¾Ð»Ñ Ð´Ð»Ñ Ñ–Ð¼Ð¿Ð¾Ñ€Ñ‚Ñƒ',
+ 'ImportViewPicture' => 'ПереглÑд зображеннÑ',
+ 'ImportSelectAll' => 'Вибрати вÑÑ–',
+ 'ImportSelectNone' => 'Ðе вибрати жодного',
+
+ 'MultiSiteTitle' => 'Сайти Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ пошуку',
+ 'MultiSiteUnused' => 'ÐевикориÑтовувані втулки',
+ 'MultiSiteUsed' => 'ВикориÑтовувати втулки',
+ 'MultiSiteLang' => 'Заповніть ÑпиÑок англійÑькими втулками',
+ 'MultiSiteEmptyError' => 'У Ð²Ð°Ñ Ð¿Ð¾Ñ€Ð¾Ð¶Ð½Ñ–Ð¹ ÑпиÑок Ñайтів',
+ 'MultiSiteClear' => 'ОчиÑтити ÑпиÑок',
+
+ 'DisplayOptionsTitle' => 'Елементи Ð´Ð»Ñ Ð²Ñ–Ð´Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð½Ñ',
+ 'DisplayOptionsAll' => 'Вибрати вÑÑ–',
+ 'DisplayOptionsSearch' => 'Кнопка пошуку',
+
+ 'GenresTitle' => 'Зміна жанру',
+ 'GenresCategoryName' => 'ВикориÑтовуєтьÑÑ Ð¶Ð°Ð½Ñ€',
+ 'GenresCategoryMembers' => 'Жанр Ð´Ð»Ñ Ð·Ð°Ð¼Ñ–Ð½Ð¸',
+ 'GenresLoad' => 'Завантажити ÑпиÑок',
+ 'GenresExport' => 'Зберегти ÑпиÑок до файлу',
+ 'GenresModify' => 'Редагувати заміну',
+
+ 'PropertiesName' => 'Ðазва колекції',
+ 'PropertiesLang' => 'Language code',
+ 'PropertiesOwner' => 'ВлаÑник',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'ОпиÑ',
+ 'PropertiesFile' => 'Ð†Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ñ–Ñ Ð¿Ñ€Ð¾ файл',
+ 'PropertiesFilePath' => 'Повний шлÑÑ…',
+ 'PropertiesItemsNumber' => 'КількіÑÑ‚ÑŒ запиÑів', # Accepts model codes
+ 'PropertiesFileSize' => 'Розмір',
+ 'PropertiesFileSizeSymbols' => ['Байтів', 'Кб', 'Мб', 'Гб', 'Тб', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => 'ВлаÑтивоÑÑ‚Ñ– колекції',
+ 'PropertiesDefaultPicture' => 'Default picture',
+
+ 'MailProgramsTitle' => 'Програми Ð´Ð»Ñ Ð½Ð°Ð´ÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿Ð¾ÑˆÑ‚Ð¸',
+ 'MailProgramsName' => 'Ðазва',
+ 'MailProgramsCommand' => 'Командкий Ñ€Ñдок',
+ 'MailProgramsRestore' => 'Відновити типові',
+ 'MailProgramsAdd' => 'Додати програму',
+ 'MailProgramsInstructions' => 'Ð’ командному Ñ€Ñдку ролÑÑ‚ÑŒÑÑ Ð´ÐµÑкі заміни:
+ %f замінюєтьÑÑ Ð½Ð° e-mail адреÑу кориÑтувача.
+ %t замінюєтьÑÑ Ð½Ð° адреÑу одержувача.
+ %s замінюєтьÑÑ Ð½Ð° тему повідомленнÑ.
+ %b замінюєтьÑÑ Ð½Ð° тіло повідомленнÑ.',
+
+ 'BookmarksBookmarks' => 'Закладки',
+ 'BookmarksFolder' => 'Теки',
+ 'BookmarksLabel' => 'Мітка',
+ 'BookmarksPath' => 'ШлÑÑ…',
+ 'BookmarksNewFolder' => 'Ðова тека',
+
+ 'AdvancedSearchType' => 'Тип пошуку',
+ 'AdvancedSearchTypeAnd' => 'ЗапиÑи, що відповідають вÑім критеріÑм', # Accepts model codes
+ 'AdvancedSearchTypeOr' => 'ЗапиÑи, що відповідають хоча б одному критерію', # Accepts model codes
+ 'AdvancedSearchCriteria' => 'Критерій',
+ 'AdvancedSearchAnyField' => 'Будь-Ñке поле',
+ 'AdvancedSearchSaveTitle' => 'Save search',
+ 'AdvancedSearchSaveName' => 'Name',
+ 'AdvancedSearchSaveOverwrite' => 'A saved search already exists with that name. Please use a different one.',
+ 'AdvancedSearchUseCase' => 'Case sensitive',
+ 'AdvancedSearchIgnoreDiacritics' => 'Ignore accents and other diacritics',
+
+ 'BugReportSubject' => 'Звіт про помилку, згенерований GCstar',
+ 'BugReportVersion' => 'ВерÑÑ–Ñ',
+ 'BugReportPlatform' => 'Операційна ÑиÑтема',
+ 'BugReportMessage' => 'ÐŸÐ¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ Ð¿Ñ€Ð¾ помилку',
+ 'BugReportInformation' => 'Додаткова інформаціÑ',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..46ac08a
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => '包å«é ‚端的欄ä½å稱',
+ 'Separator' => '分隔符號',
+ 'Replacement' => '用來å–代分隔符號',
+ 'Charset' => '字元集',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..76b6bce
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'External disk',
+ 'ZipAll' => 'Put everything in a zipped file (.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..50fe454
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ZH::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => '無效的模æ¿æª”',
+ 'UseFile' => '使用下方指定的檔案',
+ 'WithJS' => '使用Javascript',
+ 'FileTemplate' => '模æ¿',
+ 'Preview' => 'é è¦½',
+ 'NoPreview' => '沒有é è¦½å¯ç”¨',
+ 'TemplateExternalFile' => '模æ¿æª”案',
+ 'Title' => 'é é¢æ¨™é¡Œ',
+ 'InfoFile' => '檔案中的電影列表:',
+ 'InfoDir' => '圖片在:',
+ 'HeightImg' => '匯出圖片的高度(åƒç´ ï¼‰',
+ 'OpenFileInBrowser' => '在ç€è¦½å™¨æ‰“開產生的檔案',
+ 'Note' => '本列表由<a href="http://www.gcstar.org/">GCstar</a>產生',
+ 'InputTitle' => '輸入æœå°‹å­—串',
+ 'SearchType1' => 'åªæœ‰æ¨™é¡Œ',
+ 'SearchType2' => '全部資訊',
+ 'SearchButton' => 'æœå°‹',
+ 'SearchTitle' => 'åªé¡¯ç¤ºåŒ¹é…æ¢ä»¶çš„電影',
+ 'AllButton' => '全部',
+ 'AllTitle' => '顯示全部電影',
+ 'Expand' => '展開全部',
+ 'ExpandTitle' => '顯示所有電影訊æ¯',
+ 'Collapse' => '褶疊全部',
+ 'CollapseTitle' => '褶疊全部電影資訊',
+ 'Borrowed' => '被誰借走:',
+ 'NotBorrowed' => 'å¯ç”¨',
+ 'Top' => '頂端',
+ 'Bottom' => '底部',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..9c995c2
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'Database name',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..7a9192b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => '包å«DROP指引',
+ 'WithCreate' => '包å«CREATE指引',
+ 'TableName' => '表格å稱',
+ 'InfoFile' => 'SQL檔案: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..5bbad15
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => '檔案中有壓縮檔:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..04c42fb
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ZH::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => '模æ¿æª”案',
+ 'ModelText' => '模æ¿æ–‡å­—',
+ 'Models' => '模æ¿ä½¿ç”¨',
+ 'UseFile' => '使用檔案',
+ 'UseModel' => '使用文字å€åŸŸ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..3acc812
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ZH::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'è¦æœå°‹å“ªå€‹ä½ç½®',
+ 'Default' => 'é è¨­çš„Alexandria資料夾',
+ 'Specified' => '在下é¢æŒ‡å®šè³‡æ–™å¤¾',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..dbcde26
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => '字元集',
+ 'Header' => '忽略第一行',
+ 'Separator' => '分隔符號',
+ 'Plugin' => '被使用的站點',
+ 'UseFirst' => '當回傳太多çµæžœæ™‚使用第一個',
+ 'SearchField' => 'Search for items using',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..5869ab7
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportFolder.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '資料夾',
+ 'Recursive' => 'éžè¿´æŽƒæå­ç›®éŒ„',
+ 'Suffixes' => '後綴或副檔å',
+ 'SuffixesTooltip' => '用逗點分隔打算處ç†çš„後綴或副檔å列表',
+ 'Remove' => 'To be removed from names',
+ 'RemoveTooltip' => 'A comma-seperated list of words that should be removed from file names to create the fetched names',
+ 'Ask'=> 'Ask',
+ 'AskEnd'=> 'Ask all at end',
+ 'AddWithoutInfo'=> 'Add without infos',
+ 'DontAdd'=> 'Do not add',
+ 'TakeFirst' => 'Select first',
+ 'MultipleResult'=> 'Multiple results',
+ 'MultipleResultTooltip'=> 'What do we do when more than 1 result is return by the plugin',
+ 'RemoveWholeWord' => 'Remove only whole words',
+ 'NoResult'=> 'No results',
+ 'NoResultTooltip'=> 'What do we do when no search results is return by the plugin',
+ 'RemoveTooltipWholeWord' => 'Words will be removed only if they appear as an entire word',
+ 'RemoveRegularExpr' => 'Regular expression',
+ 'RemoveTooltipRegularExpr' => 'Consider that \'To be removed from names\' is a perl regular expression',
+ 'SkipFileAlreadyInCollection' => 'Add new files only',
+ 'SkipFileAlreadyInCollectionTooltip' => 'Add only files not already in the collection',
+ 'SkipFileNo' => 'No',
+ 'SkipFileFullPath' => 'based on full path',
+ 'SkipFileFileName' => 'based on file name',
+ 'SkipFileFileNameAndUpdate' => 'based on file name (but update path in collection)',
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied after removing extension).\nLeave empty if not needed.\nKnown fields : \n$T:Title, $A:Alphabetised title, $Y:Release date, $S:Season, $E:Episode, $N:Alphabetised serie name, $x:Part number, $y: Total part number',
+
+ 'InfoFromFileNameRegExp' => 'Parse file name with this regular expression',
+ 'InfoFromFileNameRegExpTooltip' => 'Use this to retrieve infos from filename (applied before removing anything).\nLeave empty if not needed.\nKnown fields : $T:Title, $A:Article, $Y:Year, $S:Season, $E:Episode, $N:Serie Name'
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..8629dce
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => '複製圖片',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm
new file mode 100644
index 0000000..84b082c
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'å稱列表',
+ 'Plugin' => '被使用的站點',
+ 'UseFirst' => '當回傳太多çµæžœæ™‚使用第一個',
+ 'CommentAuto' => '項目自動匯入',
+ 'CommentSite' => '網站:',
+ 'CommentTitle' => '標題:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..833e085
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..79ea6ad
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => '檔案ä¸æ˜¯å€‹è¢«æ”¯æ´çš„Tellico收è—集',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..018ef7e
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::ZH::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '電視劇(集)收è—集',
+ Items => '集',
+ NewItem => '新章節',
+ NewSeries => '新系列',
+ Episode => '集',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..7c80048
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '電視劇(系列)收è—集',
+ Items => '個系列',
+ NewItem => '新系列',
+ Name => '系列å稱',
+ Season => 'å­£',
+ Part => 'Part',
+ Episodes => '集',
+ FirstAired => '首播',
+ Time => 'æ¯é›†é•·åº¦',
+ Producer => '製片商',
+ Music => '音樂',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..78af50d
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::ZH::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '桌上éŠæˆ²æ”¶è—集',
+ Items => {0 => '份éŠæˆ²',
+ 1 => '份éŠæˆ²',
+ X => '份éŠæˆ²'},
+ NewItem => 'æ–°éŠæˆ²',
+
+ Id => 'Id',
+ Name => 'å稱',
+ Original => '原å',
+ Box => 'éŠæˆ²ç›’圖片',
+ DesignedBy => '設計者',
+ PublishedBy => '出版商',
+ Players => 'éŠçŽ©è€…人數',
+ PlayingTime => 'éŠæˆ²æ™‚é–“',
+ SuggestedAge => '建議年齡',
+ Released => '釋出',
+ Description => 'æè¿°',
+ Category => '分類',
+ Mechanics => 'éŠæˆ²æ©Ÿåˆ¶',
+ ExpandedBy => '有哪些擴充',
+ ExpansionFor => 'æ“´å……å°è±¡',
+ GameFamily => 'éŠæˆ²å®¶æ—',
+ IllustratedBy => '繪師',
+ Url => '網é ',
+ TimesPlayed => 'éŠçŽ©æ¬¡æ•¸',
+ CompleteContents => '內容完整',
+ Copies => 'No. of copies',
+ Condition => 'ä¿å­˜ç‹€æ…‹',
+ Photos => '照片',
+ Photo1 => '第一張圖片',
+ Photo2 => '第二張圖片',
+ Photo3 => '第三張圖片',
+ Photo4 => '第四張圖片',
+ Comments => 'è©•è«–',
+
+ Perfect => '完美',
+ Good => '良好',
+ Average => '普通',
+ Poor => '糟糕',
+
+ CompleteYes => '內容完整',
+ CompleteNo => 'éºå¤±ä¸€éƒ¨ä»½',
+
+ General => '一般',
+ Details => '項目細節',
+ Personal => '個人',
+ Information => '資訊',
+
+ FilterRatingSelect => '評價至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm
new file mode 100644
index 0000000..3ff732f
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '書本收è—集',
+ Items => {0 => '本書',
+ 1 => '本書',
+ X => '本書'},
+ NewItem => '新書',
+
+ Isbn => 'ISBN',
+ Title => '標題',
+ Cover => 'å°çš®',
+ Authors => '作者',
+ Publisher => '出版商',
+ Publication => '出版日期',
+ Language => '語言',
+ Genre => 'é¡žåž‹',
+ Serie => '系列',
+ Rank => '等級',
+ Bookdescription => '書ç±æè¿°',
+ Pages => 'é æ•¸',
+ Read => '已讀',
+ Acquisition => 'å–得日期',
+ Edition => '版本',
+ Format => 'æ ¼å¼',
+ Comments => 'è©•è«–',
+ Url => '網é ',
+ Translator => '譯者',
+ Artist => 'æ’畫家',
+ DigitalFile => 'Digital version',
+
+ General => '一般',
+ Details => '書ç±ç´°ç¯€',
+
+ ReadNo => '未讀',
+ ReadYes => '已讀',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm
new file mode 100644
index 0000000..7f611ac
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::ZH::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '錢幣收è—集',
+ Items => {0 => '份錢幣',
+ 1 => '份錢幣',
+ X => '份錢幣'},
+ NewItem => '新錢幣',
+
+ Name => 'å稱',
+ Country => '國家',
+ Year => '年份',
+ Currency => '貨幣',
+ Value => '價值',
+ Picture => '主è¦åœ–片',
+ Diameter => '直徑',
+ Metal => '金屬',
+ Edge => 'é‚Šç·£',
+ Edge1 => 'é‚Šç·£ 1',
+ Edge2 => 'é‚Šç·£ 2',
+ Edge3 => 'é‚Šç·£ 3',
+ Edge4 => 'é‚Šç·£ 4',
+ Head => 'æ­£é¢ï¼ˆäººé ­ï¼‰',
+ Tail => 'åé¢',
+ Comments => 'è©•è«–',
+ History => 'æ­·å²',
+ Website => '網站',
+ Estimate => '估價',
+ References => 'åƒè€ƒè³‡æ–™',
+ Type => 'é¡žåž‹',
+ Coin => '硬幣',
+ Banknote => '鈔票',
+
+ Main => '主è¦',
+ Description => 'æè¿°',
+ Other => '其他訊æ¯',
+ Pictures => '圖片',
+
+ Condition => 'PCGS狀態分級',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm
new file mode 100644
index 0000000..0ae5766
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::ZH::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '漫畫收è—集',
+ Items => {0 => '本漫畫',
+ 1 => '本漫畫',
+ X => '本漫畫'},
+ NewItem => '新漫畫',
+
+
+ Id => 'Id',
+ Name => 'å稱',
+ Series => '書å',
+ Volume => 'å·è™Ÿ',
+ Title => '標題',
+ Writer => '腳本作者',
+ Illustrator => '繪師',
+ Colourist => '著色師',
+ Publisher => '出版商',
+ Synopsis => '故事æè¦',
+ Collection => '收è—',
+ PublishDate => '出版日期',
+ PrintingDate => 'å°åˆ·æ—¥æœŸ',
+ ISBN => 'ISBN',
+ Type => 'å°åˆ·ç‰ˆæœ¬',
+ Category => '分類',
+ Format => 'æ ¼å¼',
+ NumberBoards => 'å°åˆ·æ‰¹è™Ÿ',
+ Signing => 'ç°½å',
+ Cost => '售價',
+ Rating => '評價',
+ Comment => 'æ„見',
+ Url => '網é ',
+
+ FilterRatingSelect => '評價至少到(_L)...',
+
+ Main => '主項目',
+ General => '一般資訊',
+ Details => '細節',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm
new file mode 100644
index 0000000..0feb400
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::ZH::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '電影收è—集',
+ Items => {0 => '部電影',
+ 1 => '部電影',
+ X => '部電影'},
+ NewItem => '新電影',
+
+
+ Id => 'Id',
+ Title => 'å稱',
+ Date => '日期',
+ Time => '片長',
+ Director => 'å°Žæ¼”',
+ Country => '國家',
+ MinimumAge => '最å°å¹´é½¡é™åˆ¶',
+ Genre => 'é¡žåž‹',
+ Image => '圖片',
+ Original => '原å',
+ Actors => '演員',
+ Actor => '演員',
+ Role => '角色',
+ Comment => 'è©•è«–',
+ Synopsis => '故事概覽',
+ Seen => '已觀賞',
+ Number => '媒體數é‡',
+ Format => '媒體格å¼',
+ Region => '地å€',
+ Identifier => 'Identifier',
+ Url => '網é ',
+ Audio => 'è²éŸ³',
+ Video => '影片格å¼',
+ Trailer => 'é å‘Šç‰‡',
+ Serie => '系列',
+ Rank => '等級',
+ Subtitles => '字幕',
+
+ SeenYes => '已觀賞',
+ SeenNo => '還沒看',
+
+ AgeUnrated => '未評級',
+ AgeAll => '全年齡',
+ AgeParent => '需è¦å®¶é•·é™ªåŒ',
+
+ Main => '主項目',
+ General => '一般',
+ Details => '細節',
+
+ Information => '資訊',
+ Languages => '語言',
+ Encoding => '編碼',
+
+ FilterAudienceAge => '觀眾年齡',
+ FilterSeenNo => '還沒看éŽ(_N)',
+ FilterSeenYes => '已觀賞(_A)',
+ FilterRatingSelect => '評價至少到(_L)...',
+
+ ExtractSize => '尺寸',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCgames.pm b/lib/gcstar/GCLang/ZH/GCModels/GCgames.pm
new file mode 100644
index 0000000..5077a47
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::ZH::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'é›»å­éŠæˆ²æ”¶è—集',
+ Items => {0 => '個éŠæˆ²',
+ 1 => '個éŠæˆ²',
+ X => '個éŠæˆ²'},
+ NewItem => 'æ–°éŠæˆ²',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'å稱',
+ Platform => 'å¹³å°',
+ Players => 'éŠæˆ²äººæ•¸',
+ Released => '釋出日期',
+ Editor => '編輯者',
+ Developer => '開發者',
+ Genre => 'é¡žåž‹',
+ Box => 'éŠæˆ²ç›’圖片',
+ Case => 'éŠæˆ²ç›’',
+ Manual => '說明手冊',
+ Completion => '完æˆåº¦(%)',
+ Executable => 'å¯åŸ·è¡Œæª”',
+ Description => '說明',
+ Codes => '秘技',
+ Code => '秘技',
+ Effect => '效果',
+ Secrets => 'éŠæˆ²ä¸­çš„秘密',
+ Screenshots => 'ç•«é¢æˆªåœ–',
+ Screenshot1 => '第一張截圖',
+ Screenshot2 => '第二張截圖',
+ Comments => 'è©•è«–',
+ Url => '網é ',
+ Unlockables => 'å¯è¢«è§£éŽ–çš„éš±è—é …ç›®',
+ Unlockable => 'é …ç›®',
+ Howto => '作法',
+ Exclusive => 'Exclusive',
+ Resolutions => 'Display resolutions',
+ InstallationSize => 'Size',
+ Region => 'Region',
+ SerialNumber => 'Serial Number',
+
+ General => '一般',
+ Details => 'éŠæˆ²ç´°ç¯€',
+ Tips => 'å°æŠ€å·§',
+ Information => '訊æ¯',
+
+ FilterRatingSelect => '評價至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..752e883
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCgeneric.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::ZH::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => 'Item',
+ 1 => 'Item',
+ X => 'Items',
+ lowercase1 => 'item',
+ lowercaseX => 'items'
+ },
+ NewItem => 'New item',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm
new file mode 100644
index 0000000..dd61624
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::ZH::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Mini vehicles collection',
+ Items => {0 => 'Vehicle',
+ 1 => 'Vehicle',
+ X => 'Vehicles',
+ lowercase1 => 'vehicle',
+ lowercaseX => 'vehicles'
+ },
+ NewItem => 'New vehicle',
+ Currency => 'Currency',
+
+# Main fields
+
+ Main => 'Main information',
+
+ Name => 'Name',
+ Exchange => 'To be sold or exchanged',
+ Wanted => 'Wanted',
+ Rating1 => 'Main rating',
+ Picture1 => 'Main picture',
+ Scale => 'Scale',
+ Manufacturer => 'Manufacturer',
+ Constructor => 'Constructor',
+ Type1 => 'Type',
+ Modele => 'Model',
+ Version => 'Version',
+ Color => 'Model color',
+ Pub => 'Advertisement',
+ Year => 'Year',
+ Reference => 'Reference',
+ Kit => 'In kit form',
+ Transformation => 'Personal transformation',
+ Comments1 => 'Comments',
+
+# Details fields
+
+ Details => 'Details',
+
+ MiscCharacteristics => 'Miscellaneous characteristics',
+ Material => 'Material',
+ Molding => 'Molding',
+ Condition => 'Condition',
+ Edition => 'Edition',
+ Collectiontype => 'Collection name',
+ Serial => 'Series',
+ Serialnumber => 'Serial number',
+ Designed => 'Design date',
+ Madein => 'Manufacture date',
+ Box1 => 'Kind of box',
+ Box2 => 'Box description',
+ Containbox => 'Box contet',
+ Rating2 => 'Realism',
+ Rating3 => 'Finish',
+ Acquisition => 'Acquisition date',
+ Location => 'Acquisition place',
+ Buyprice => 'Acquisition price',
+ Estimate => 'Estimation',
+ Comments2 => 'Comments',
+ Decorationset => 'Decoration set',
+ Characters => 'Characters',
+ CarFromFilm => 'Movie car',
+ Filmcar => 'Movie related to the vehicle',
+ Filmpart => 'Movie part/episode',
+ Parts => 'Number of parts',
+ VehiculeDetails => 'Vehicule details',
+ Detailsparts => 'Details parts',
+ Detailsdecorations => 'Kind of decorations',
+ Decorations => 'Nunmber of decorations',
+ Lwh => 'Length / Width / Height',
+ Weight => 'Weight',
+ Framecar => 'Chassis',
+ Bodycar => 'Bodywork',
+ Colormirror => 'Model color',
+ Interior => 'Interior',
+ Wheels => 'Wheels',
+ Registrationnumber1 => 'Front registration number',
+ Registrationnumber2 => 'Back registration number',
+ RacingCar => 'Racing car',
+ Course => 'Race',
+ Courselocation => 'Race place',
+ Courseyear => 'Race date',
+ Team => 'Team',
+ Pilots => 'Pilot(s)',
+ Copilots => 'Copilot(s)',
+ Carnumber => 'Vehicle number',
+ Pub2 => 'Advertisers',
+ Finishline => 'Finish ranking',
+ Steeringwheel => 'Position of steering wheel',
+
+
+# Catalogs fields
+
+ Catalogs => 'Catalogs',
+
+ OfficialPicture => 'Official picture',
+ Barcode => 'Barcode',
+ Referencemirror => 'Reference',
+ Year3 => 'Availability date',
+ CatalogCoverPicture => 'Cover',
+ CatalogPagePicture => 'Page',
+ Catalogyear => 'Catalog year',
+ Catalogedition => 'Catalog edition',
+ Catalogpage => 'Catalog page',
+ Catalogprice => 'Catalog price',
+ Personalref => 'Personal reference',
+ Websitem => 'Mini vehicle\'s manufacturer website',
+ Websitec => 'Actual vehicle\'s manufacturer website',
+ Websiteo => 'Useful link',
+ Comments3 => 'Comments',
+
+# Pictures fields
+
+ Pictures => 'Pictures',
+
+ OthersComments => 'General remarks',
+ OthersDetails => 'Other details',
+ Top1 => 'Above',
+ Back1 => 'Below',
+ AVG => 'Front Left',
+ AV => 'Front',
+ AVD => 'Front Right',
+ G => 'Left',
+ BOX => 'Box',
+ D => 'Right',
+ ARG => 'Back Left',
+ AR => 'Back',
+ ARD => 'Back Right',
+ Others => 'Misc',
+
+# PanelLending fields
+
+ LendingExplanation => 'Useful exchanges during temporary exhibitions',
+ PanelLending => 'Lendings (for exhibitions)',
+ Comments4 => 'Comments',
+
+# Realmodel fields
+
+ Realmodel => 'Actual vehicle',
+
+ Difference => 'Differences with miniature',
+ Front2 => 'Front',
+ Back2 => 'Back',
+ Comments5 => 'Comments',
+
+ References => 'References',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm
new file mode 100644
index 0000000..cae9575
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ZH::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '音樂收è—集',
+ Items => {0 => '張專輯',
+ 1 => '張專輯',
+ X => '張專輯'},
+ NewItem => '新專輯',
+
+ Unique => 'ISRC/EAN',
+ Title => '標題',
+ Cover => 'å°é¢',
+ Artist => 'è—術家',
+ Format => 'æ ¼å¼',
+ Running => '播放時間',
+ Release => '釋出日期',
+ Genre => 'é¡žåž‹',
+ Origin => '原始作å“',
+
+#For tracks list
+ Tracks => '曲目列表',
+ Number => '編號',
+ Track => '標題',
+ Time => '時間',
+
+ Composer => '作曲家',
+ Producer => '製片人',
+ Playlist => '播放列表',
+ Comments => 'è©•è«–',
+ Label => '標籤',
+ Url => '網é ',
+
+ General => '一般',
+ Details => '專輯細節',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..ea87fcd
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::ZH::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Periodicals collection',
+ Items => {0 => 'Periodical',
+ 1 => 'Periodical',
+ X => 'Periodicals',
+ lowercase1 => 'periodical',
+ lowercaseX => 'periodicals'
+ },
+ NewItem => 'New periodical',
+
+ Title => 'Title',
+ Cover => 'Cover',
+ Periodical => 'Periodical',
+ Number => 'Number',
+ Date => 'Date',
+ Subject => 'Subject',
+ Articles => 'Articles',
+
+ General => 'General',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..87e449b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ZH::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Smart card collection',
+ Items => {0 => 'Smart card',
+ 1 => 'Smart card',
+ X => 'Smart cards'},
+ NewItem => 'New smart card',
+ Currency => 'Currency',
+
+ Help => 'Help for fields',
+ Help1 => 'Help',
+
+# Traduction des Champs "Main"
+
+ Main => 'The smart card',
+
+ Cover => 'Picture',
+
+ Name => 'Name',
+ Exchange => 'To be exchanged or sold',
+ Wanted => 'Wanted',
+ Rating1 => 'Global rating',
+ TheSmartCard => 'The smart card, front/back',
+
+ Country => 'Country',
+ Color => 'Color',
+ Type1 => 'Card type',
+ Type2 => 'Chip type',
+ Dimension => 'Length / Width / Thickness',
+
+ Box => 'Box',
+ Chip => 'Chip',
+ Year1 => 'Edition year',
+ Year2 => 'Validity year',
+ Condition => 'Condition',
+ Charge => 'Rechargeable card',
+ Variety => 'Variety',
+
+ Edition => 'Number of exemplars',
+ Serial => 'Serial number',
+ Theme => 'Theme',
+
+ Acquisition => 'Acquired on',
+
+ Catalog0 => 'Catalog',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'Reference',
+ Reference1 => 'Reference Phonecote / Infopuce (YT)',
+ Reference2 => 'Reference La Cote en Poche',
+ Reference3 => 'Other reference',
+
+ Quotationnew00 => 'Quotation for new card',
+ Quotationnew10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationnew20 => 'Quotation La Cote en Poche',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => 'Quotation for used card',
+ Quotationold10 => 'Quotation Phonecote / Infopuce (YT)',
+ Quotationold20 => 'Quotation La Cote en Poche',
+ Quotationold30 => 'Other quotation',
+
+ Title1 => 'Title',
+
+ Unit => 'Units / Minutes number',
+
+ Pressed => 'Impression type',
+ Location => 'Impression place',
+
+ Comments1 => 'Comments',
+
+ Others => 'Misc.',
+ Weight => 'Weight',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..001abfd
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ZH::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Computer software collection',
+ Items => {0 => 'Application',
+ 1 => 'Application',
+ X => 'Applications',
+ lowercase1 => 'application',
+ lowercaseX => 'applications'},
+ NewItem => 'New application',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'Name',
+ Platform => 'Platform',
+ Released => 'Release date',
+ Homepage => 'Homepage',
+ Editor => 'Editor',
+ Developer => 'Developer',
+ Category => 'Category',
+ NumberOfCopies => 'Copies',
+ Price => 'Price',
+ Box => 'Box picture',
+ Case => 'Case',
+ Manual => 'Instruction manual',
+ Executable => 'Executable',
+ Description => 'Description',
+ License => 'License',
+ Commercial => 'Commercial',
+ FreewareNoncommercial => 'Freeware (non-commercial use)',
+ OtherOpenSource => 'Other Open Source',
+ PublicDomain => 'Public Domain',
+ OtherLicense => 'Other',
+ Registration => 'Registration',
+ RegistrationInfo => 'Registration Info',
+ RegInfo => 'Registration Info',
+ RegistrationName => 'Username',
+ RegistrationNumber => 'Registration Number',
+ PanelRegistration => 'Registration Info',
+ RegistrationComments => 'Additional info or comments',
+ Screenshots => 'Screenshots',
+ Screenshot1 => 'First screenshot',
+ Screenshot2 => 'Second screenshot',
+ Comments => 'Comments',
+ Url => 'Web page',
+ General => 'General',
+ Details => 'Details',
+ Information => 'Information',
+
+ FilterRatingSelect => 'Rating At _Least...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm
new file mode 100644
index 0000000..85a9974
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCstamps.pm
@@ -0,0 +1,192 @@
+{
+ package GCLang::ZH::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'Stamp collection',
+ Items => {0 => 'Stamps',
+ 1 => 'Stamp',
+ X => 'Stamps',
+ lowercase1 => 'stamp',
+ lowercaseX => 'stamps'
+ },
+ NewItem => 'New stamp',
+
+ General => 'General',
+ Detail => 'Detail',
+ Value => 'Value',
+ Notes => 'Notes',
+ Views => 'Views',
+
+ Name => 'Name',
+ Country => 'Country',
+ Year => 'Year',
+ Catalog => 'Catalog',
+ Number => 'Number',
+ Topic => 'Topic',
+ Serie => 'Serie',
+ Designer => 'Designer',
+ Engraver => 'Engraver',
+ Type => 'Type',
+ Format => 'Format',
+ Description => 'Description',
+ Color => 'Color',
+ Gum => 'Gum',
+ Paper => 'Paper',
+ Perforation => 'Perforation',
+ PerforationSize => 'Perforation size',
+ CancellationType => 'Cancellation type',
+ Comments => 'Comments',
+ PrintingVariety => 'Printing variety',
+ IssueDate => 'Issue date',
+ EndOfIssue => 'End of issue',
+ Issue => 'Issue',
+ Grade => 'Grade',
+ Status => 'Status',
+ Adjusted => 'Adjusted',
+ Cancellation => 'Cancellation',
+ CancellationCondition => 'Cancellation condition',
+ GumCondition => 'Gum condition',
+ PerforationCondition => 'Perforation condition',
+ ConditionNotes => 'Condition notes',
+ Error => 'Error',
+ ErrorNotes => 'Error notes',
+ FaceValue => 'Face value',
+ MintValue => 'Mint value',
+ UsedValue => 'Used value',
+ PurchasedDate => 'Purchased date',
+ Quantity => 'Quantity',
+ History => 'History',
+ Picture1 => 'Picture 1',
+ Picture2 => 'Picture 2',
+ Picture3 => 'Picture 3',
+
+ AirMail => 'Air mail',
+ MilitaryStamp => 'Military stamp',
+ Official => 'Official',
+ PostageDue => 'Postage due',
+ Regular => 'Regular',
+ Revenue => 'Revenue',
+ SpecialDelivery => 'Special delivery',
+ StrikeStamp => 'Strike stamp',
+ TelegraphStamp => 'Telegraph stamp',
+ WarStamp => 'War stamp',
+ WarTaxStamp => 'War tax stamp',
+
+ Booklet => 'Booklet',
+ BookletPane => 'Booklet Pane',
+ Card => 'Card',
+ Coil => 'Coil',
+ Envelope => 'Envelope',
+ FirstDayCover => 'First Day Cover',
+ Sheet => 'Sheet',
+ Single => 'Single',
+
+ Heliogravure => 'Heliogravure',
+ Lithography => 'Lithography',
+ Offset => 'Offset',
+ Photogravure => 'Photogravure',
+ RecessPrinting => 'Recess printing',
+ Typography => 'Typography',
+
+ OriginalGum => 'Original gum',
+ Ungummed => 'Ungummed',
+ Regummed => 'Regummed',
+
+ Chalky => 'Chalky',
+ ChinaPaper => 'China paper',
+ Coarsed => 'Coarsed',
+ Glossy => 'Glossy',
+ Granite => 'Granite',
+ Laid => 'Laid',
+ Manila => 'Manila',
+ Native => 'Native',
+ Pelure => 'Pelure',
+ Quadrille => 'Quadrille',
+ Ribbed => 'Ribbed',
+ Rice => 'Rice',
+ Silk => 'Silk',
+ Smoothed => 'Smoothed',
+ Thick => 'Thick',
+ Thin => 'Thin',
+ Wove => 'Wove',
+
+ CoarsedPerforation => 'Coarsed perforation',
+ CombPerforation => 'Comb perforation',
+ CompoundPerforation => 'Compound perforation',
+ DamagedPerforation => 'Damaged perforation',
+ DoublePerforation => 'Double perforation',
+ HarrowPerforation => 'Harrow perforation',
+ LinePerforation => 'Line perforation',
+ NoPerforation => 'No perforation',
+
+ CancellationToOrder => 'Cancellation To Order',
+ FancyCancellation => 'Fancy cancellation',
+ FirstDayCancellation => 'First Day cancellation',
+ NumeralCancellation => 'Numeral cancellation',
+ PenMarked => 'Pen-Marked',
+ RailroadCancellation => 'Railroad cancellation',
+ SpecialCancellation => 'Special cancellation',
+
+ Superb => 'Superb',
+ ExtraFine => 'Extra-Fine',
+ VeryFine => 'Very fine',
+ FineVeryFine => 'Fine/Very fine',
+ Fine => 'Fine',
+ Average => 'Average',
+ Poor => 'Poor',
+
+ Owned => 'Owned',
+ Ordered => 'Ordered',
+ Sold => 'Sold',
+ ToSell => 'To sell',
+ Wanted => 'Wanted',
+
+ LightCancellation => 'Light cancellation',
+ HeavyCancellation => 'Heavy cancellation',
+ ModerateCancellation => 'Moderate cancellation',
+
+ MintNeverHinged => 'Mint never hinged',
+ MintLightHinged => 'Mint light hinged',
+ HingedRemnant => 'Hinged remnant',
+ HeavilyHinged => 'Heavily hinged',
+ LargePartOriginalGum => 'Large part original gum',
+ SmallPartOriginalGum => 'Small part original gum',
+ NoGum => 'No gum',
+
+ Perfect => 'Perfect',
+ VeryNice => 'Very nice',
+ Nice => 'Nice',
+ Incomplete => 'Incomplete',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCModels/GCwines.pm b/lib/gcstar/GCLang/ZH/GCModels/GCwines.pm
new file mode 100644
index 0000000..cc6e9df
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::ZH::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'è‘¡è„酒收è—',
+ Items => {0 => 'è‘¡è„é…’',
+ 1 => 'è‘¡è„é…’',
+ X => 'è‘¡è„é…’'},
+ NewItem => 'æ–°çš„è‘¡è„é…’',
+
+ Name => 'å稱',
+ Designation => '稱呼',
+ Vintage => '製造年份',
+ Vineyard => '釀造地',
+ Type => '種類',
+ Grapes => 'è‘¡è„å“種',
+ Soil => '土壤類型',
+ Producer => '製造者',
+ Country => '國家',
+ Volume => '容é‡(毫å‡)',
+ Alcohol => '酒精濃度(%)',
+ Medal => 'çŽç« ',
+
+ Storage => '儲存',
+ Location => 'ä½ç½®',
+ ShelfIndex => '架上索引',
+ Quantity => '數é‡',
+ Acquisition => 'Acquisition',
+ PurchaseDate => '進貨日期',
+ PurchasePrice => '進貨價格',
+ Gift => 'è´ˆå“',
+ BottleLabel => '瓶上的標籤',
+ Website => '網路上的åƒè€ƒè³‡æ–™',
+
+ Tasted => 'å·²å“嘗',
+ Comments => 'è©•è«–',
+ Serving => 'æœå‹™',
+ TastingField => '賞味筆記',
+
+ General => '一般',
+ Details => '細節',
+ Tasting => '賞味',
+
+ TastedNo => '未å“嘗éŽ',
+ TastedYes => 'å·²å“嘗',
+
+ FilterRange => '範åœ',
+ FilterTastedNo => 'é‚„æ²’å“嘗(_N)',
+ FilterTastedYes => '已經å“嘗éŽäº†ï¼ˆ_t)',
+ FilterRatingSelect => '評價至少到(_l)...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH/GCstar.pm b/lib/gcstar/GCLang/ZH/GCstar.pm
new file mode 100644
index 0000000..93a2ac1
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH/GCstar.pm
@@ -0,0 +1,654 @@
+{
+ package GCLang::ZH;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => '中文(ç¹é«”)',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>警告</b>:
+
+é€éŽæ’件從網站上下載的資訊<b>僅é™æ–¼å€‹äººä½¿ç”¨</b>。
+
+沒有<b>ç²å–é¡å¤–授權</b>的任何二次轉發行為都是éžæ³•çš„。
+
+若想確èªå“ªå€‹ç¶²ç«™æ“有這些資訊,你å¯ä»¥ä½¿ç”¨<b>項目細節下的按鈕</b>。',
+
+ 'AllItemsFiltered' => '沒有項目匹é…éŽæ¿¾å™¨è¦æ±‚',
+
+#Installation
+ 'InstallDirInfo' => '安è£åˆ°',
+ 'InstallMandatory' => 'å¿…è¦å…ƒä»¶',
+ 'InstallOptional' => 'é¸æ“‡å…ƒä»¶',
+ 'InstallErrorMissing' => '錯誤:以下Perl組件必須被安è£ï¼š',
+ 'InstallPrompt' => '安è£çš„基礎資料夾 [/usr/local]: ',
+ 'InstallEnd' => '安è£å®Œç•¢',
+ 'InstallNoError' => '沒有錯誤',
+ 'InstallLaunch' => '想使用這個應用程å¼ï¼Œè«‹é»žæ“Šä¸€ä¸‹',
+ 'InstallDirectory' => '基礎資料夾',
+ 'InstallTitle' => 'GCstar 安è£ç¨‹å¼',
+ 'InstallDependencies' => '相ä¾å…ƒä»¶',
+ 'InstallPath' => '路徑',
+ 'InstallOptions' => 'é¸é …',
+ 'InstallSelectDirectory' => 'é¸æ“‡å®‰è£ç”¨çš„基礎資料夾',
+ 'InstallWithClean' => '移除安è£è³‡æ–™å¤¾ä¸­çš„檔案',
+ 'InstallWithMenu' => 'å°‡GCstar加入應用程å¼é¸å–®',
+ 'InstallNoPermission' => '錯誤:你沒有寫入指定資料夾的權é™',
+ 'InstallMissingMandatory' => 'å¿…è¦ç›¸ä¾å…ƒä»¶ä¸å­˜åœ¨ã€‚在ç²å–這些元件å‰ï¼Œä½ ä¸èƒ½å¤ å®‰è£GCstar。',
+ 'InstallMissingOptional' => '部份é¸æ“‡ç›¸ä¾å…ƒä»¶ä¸å­˜åœ¨ã€‚詳細列表顯示於下。 GCstar或許å¯ä»¥å®‰è£ï¼Œä½†éƒ¨ä»½åŠŸèƒ½å°‡æœƒå¤±æ•ˆã€‚',
+ 'InstallMissingNone' => '沒有任何相ä¾å•é¡Œï¼Œä½ å¯ä»¥ç¹¼çºŒä¸¦å®‰è£GCstar',
+ 'InstallOK' => '完æˆ',
+ 'InstallMissing' => 'ä¸å­˜åœ¨',
+ 'InstallMissingFor' => 'ä¸å­˜åœ¨',
+ 'InstallCleanDirectory' => '移除資料夾中的GCstar檔案:',
+ 'InstallCopyDirectory' => '將檔案拷è²åˆ°è³‡æ–™å¤¾ï¼š',
+ 'InstallCopyDesktop' => '複製桌é¢æ–‡ä»¶ï¼š',
+
+#Update
+ 'UpdateUseProxy' => '使用代ç†ï¼ˆå¦‚果沒有使用代ç†ç›´æŽ¥æŒ‰ä¸‹ENTER):',
+ 'UpdateNoPermission' => '這個資料夾沒有寫入權é™ï¼š',
+ 'UpdateNone' => '沒有發ç¾æ›´æ–°',
+ 'UpdateFileNotFound' => '檔案ä¸å­˜åœ¨',
+
+#Splash
+ 'SplashInit' => 'åˆå§‹åŒ–',
+ 'SplashLoad' => '載入收è—集',
+ 'SplashDisplay' => '正在顯示收è—集',
+ 'SplashSort' => '排åºæ”¶è—集',
+ 'SplashDone' => '準備完æˆ',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => '你似乎先å‰ç”¨éŽGCfilms,你想è¦åŒ¯å…¥GCfilms資料到GCstar中嗎(這ä¸æœƒæå‚·ä½ çš„GCfilms資料)?',
+ 'GCfilmsImportOptions' => '設定',
+ 'GCfilmsImportData' => '電影列表',
+
+#Menus
+ 'MenuFile' => '檔案(_F)',
+ 'MenuNewList' => '新收è—集(_N)',
+ 'MenuStats' => 'Statistics',
+ 'MenuHistory' => '最近使用的收è—集(_R)',
+ 'MenuLend' => '顯示被借走的æ±è¥¿(_B)',
+ 'MenuImport' => '匯入(_I)',
+ 'MenuExport' => '匯出(_E)',
+ 'MenuAddItem' => '_Add {1}', # Accepts model codes
+
+ 'MenuEdit' => '編輯(_E)',
+ 'MenuDuplicate' => '複製項目(_p)',
+ 'MenuDuplicatePlural' => '複製項目(_p)',
+ 'MenuEditSelectAllItems' => 'Select _All {X}', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '移除項目(_R)',
+ 'MenuEditDeleteCurrentPlural' => '移除項目(_R)',
+ 'MenuEditFields' => '變更收è—集欄ä½(_C)',
+ 'MenuEditLockItems' => '鎖定收è—集(_L)',
+
+ 'MenuDisplay' => 'éŽæ¿¾å™¨(_i)',
+ 'MenuSavedSearches' => '儲存æœå°‹',
+ 'MenuSavedSearchesSave' => '儲存當å‰æœå°‹',
+ 'MenuSavedSearchesEdit' => '變更已經儲存的æœå°‹',
+ 'MenuAdvancedSearch' => '進階æœå°‹(_d)',
+ 'MenuViewAllItems' => '顯示全部項目(_A)',
+ 'MenuNoFilter' => '全部(_A)',
+
+ 'MenuConfiguration' => '設定(_S)',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '顯示資訊(_D)',
+ 'MenuBorrowers' => '出借å°è±¡(_B)',
+ 'MenuToolbarConfiguration' => '工具列控制(_T)',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '類型轉æ›(_C)',
+
+ 'MenuBookmarks' => '我的收è—集(_C)',
+ 'MenuBookmarksAdd' => '加入當å‰æ”¶è—集(_A)',
+ 'MenuBookmarksEdit' => '編輯被書籤的收è—集(_E)',
+
+ 'MenuHelp' => '幫助(_H)',
+ 'MenuHelpContent' => '內容(_C)',
+ 'MenuAllPlugins' => '檢視æ’件(_P)',
+ 'MenuBugReport' => '回報å•é¡Œ',
+ 'MenuAbout' => '關於GCstar(_A)',
+
+ 'MenuNewWindow' => '在新視窗中顯示項目(_N)',
+ 'MenuNewWindowPlural' => '在新視窗中顯示項目(_N)',
+
+ 'ContextExpandAll' => '展開全部',
+ 'ContextCollapseAll' => '收åˆå…¨éƒ¨',
+ 'ContextChooseImage' => 'é¸æ“‡åœ–片(_I)',
+ 'ContextOpenWith' => '以指定程å¼é–‹å•Ÿ(_h)...',
+ 'ContextImageEditor' => 'Image Editor',
+ 'ContextImgFront' => 'å°é¢',
+ 'ContextImgBack' => 'å°åº•',
+ 'ContextChooseFile' => 'è«‹é¸æ“‡è¦ä½¿ç”¨çš„檔案',
+ 'ContextChooseFolder' => 'é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾',
+
+ 'DialogEnterNumber' => '請輸入數值',
+
+ 'RemoveConfirm' => '你確定è¦ç§»é™¤é€™å€‹é …目?',
+ 'RemoveConfirmPlural' => '你確定è¦ç§»é™¤é€™å€‹é …目?',
+ 'DefaultNewItem' => 'æ–°é …ç›®',
+ 'NewItemTooltip' => '加入一個新項目',
+ 'NoItemFound' => '沒有發ç¾ï¼Œæƒ³è¦æœå°‹å…¶ä»–站點嗎?',
+ 'OpenList' => 'è«‹é¸æ“‡æ”¶è—集',
+ 'SaveList' => 'è«‹é¸æ“‡è¦å°‡é€™å€‹æ”¶è—集ä¿å­˜åœ¨å“ªè£¡ï¼Ÿ',
+ 'SaveListTooltip' => 'ä¿å­˜ç•¶å‰çš„收è—集',
+ 'SaveUnsavedChanges' => '你收è—集中的變更還未儲存,ç¾åœ¨å„²å­˜å—Žï¼Ÿ',
+ 'SaveDontSave' => 'ä¸å„²å­˜',
+ 'PreferencesTooltip' => '設定å好',
+ 'ViewTooltip' => '改變收è—集顯示',
+ 'PlayTooltip' => 'é‡å°é …目啟動檔案關è¯ï¼ˆé€šå¸¸æ˜¯æ’­æ”¾çš„æ„æ€ï¼‰',
+ 'PlayFileNotFound' => '在指定ä½ç½®ä¸Šæ²’有發ç¾ç›®æ¨™æª”案:',
+ 'PlayRetry' => 'é‡è©¦',
+
+ 'StatusSave' => '儲存中...',
+ 'StatusLoad' => '載入中...',
+ 'StatusSearch' => 'æœå°‹æ­£åœ¨é€²è¡Œ...',
+ 'StatusGetInfo' => 'å–得資訊...',
+ 'StatusGetImage' => 'å–得圖片...',
+
+ 'SaveError' => 'ä¸èƒ½å„²å­˜é …目列表,請檢查檔案存å–權é™èˆ‡å‰©é¤˜ç£ç¢Ÿç©ºé–“。',
+ 'OpenError' => 'ä¸èƒ½é–‹å•Ÿé …目列表,請檢查檔案存å–權é™ã€‚',
+ 'OpenFormatError' => 'ä¸èƒ½é–‹å•Ÿé …目列表,因為檔案格å¼ä¸æ­£ç¢ºã€‚',
+ 'OpenVersionWarning' => '本收è—集由更新版本的GCstar建立。如果你儲存,你å¯èƒ½æœƒå¤±åŽ»æŸäº›è¨Šæ¯ã€‚',
+ 'OpenVersionQuestion' => 'ä½ ä¾ç„¶æƒ³ç¹¼çºŒå—Žï¼Ÿ',
+ 'ImageError' => 'é¸æ“‡å„²å­˜åœ–片的資料夾ä¸æ­£ç¢ºï¼Œè«‹é¸æ“‡å¦ä¸€å€‹ã€‚',
+ 'OptionsCreationError'=> 'ä¸èƒ½å»ºç«‹è¨­å®šæª”。',
+ 'OptionsOpenError'=> 'ä¸èƒ½æ‰“開設定檔:',
+ 'OptionsSaveError'=> 'ä¸èƒ½å„²å­˜è¨­å®šæª”:',
+ 'ErrorModelNotFound' => '未發ç¾æ¨¡çµ„:',
+ 'ErrorModelUserDir' => '使用者定義模組在:',
+
+ 'RandomTooltip' => 'What to see this evening ?',
+ 'RandomError'=> '沒有項目å¯ä¾›é¸æ“‡',
+ 'RandomEnd'=> '沒有更多項目',
+ 'RandomNextTip'=> '下一個建議',
+ 'RandomOkTip'=> '接å—這個項目',
+
+ 'AboutTitle' => '關於GCstar',
+ 'AboutDesc' => '個人收è—å“管ç†å™¨',
+ 'AboutVersion' => '版本',
+ 'AboutTeam' => '團隊',
+ 'AboutWho' => 'Christian Jodar (Tian): Project manager, Programmer
+Nyall Dawson (Zombiepig): Programmer
+TPF: Programmer
+Adolfo González: Programmer
+',
+ 'AboutLicense' => '以GNU GPL授權發佈
+Logos Copyright le Spektre',
+ 'AboutTranslation' => '中文翻譯由林雪凡製作
+http://wfst.blogspot.com',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): Skin Designer
+Logo和網路設計: le Spektre',
+
+ 'UnsavedCollection' => '未儲存的收è—集',
+ 'ModelsSelect' => 'é¸æ“‡ä¸€å€‹æ”¶è—集類型',
+ 'ModelsPersonal' => '個人模組',
+ 'ModelsDefault' => 'é è¨­æ¨¡çµ„',
+ 'ModelsList' => '收è—集定義',
+ 'ModelSettings' => '收è—集設定',
+ 'ModelNewType' => '新的收è—集類型',
+ 'ModelName' => '收è—集類型的å字:',
+ 'ModelFields' => '欄ä½',
+ 'ModelOptions' => 'é¸é …',
+ 'ModelFilters' => 'éŽæ¿¾å™¨',
+ 'ModelNewField' => '新欄ä½',
+ 'ModelFieldInformation' => '資訊',
+ 'ModelFieldName' => '欄ä½å稱:',
+ 'ModelFieldType' => '類型:',
+ 'ModelFieldGroup' => '組別:',
+ 'ModelFieldValues' => '值',
+ 'ModelFieldInit' => 'é è¨­ï¼š',
+ 'ModelFieldMin' => '最å°ï¼š',
+ 'ModelFieldMax' => '最大:',
+ 'ModelFieldList' => '列表:',
+ 'ModelFieldListLegend' => '<i>用åŠå½¢é€—號分隔</i>',
+ 'ModelFieldDisplayAs' => '顯示æˆï¼š',
+ 'ModelFieldDisplayAsText' => '文字',
+ 'ModelFieldDisplayAsGraphical' => '評分æ¢',
+ 'ModelFieldTypeShortText' => '短文字',
+ 'ModelFieldTypeLongText' => '長文字',
+ 'ModelFieldTypeYesNo' => '布林值',
+ 'ModelFieldTypeNumber' => '數字',
+ 'ModelFieldTypeDate' => '日期',
+ 'ModelFieldTypeOptions' => 'é å®šç¾©é¸æ“‡åˆ—表',
+ 'ModelFieldTypeImage' => '圖片',
+ 'ModelFieldTypeSingleList' => '簡表',
+ 'ModelFieldTypeFile' => '檔案',
+ 'ModelFieldTypeFormatted' => 'ä¾è³´å…¶ä»–欄ä½',
+ 'ModelFieldParameters' => '變數',
+ 'ModelFieldHasHistory' => '使用歷å²è³‡è¨Š',
+ 'ModelFieldFlat' => '單行顯示',
+ 'ModelFieldStep' => '累進增加:',
+ 'ModelFieldFileFormat' => '檔案格å¼ï¼š',
+ 'ModelFieldFileFile' => '一般檔案',
+ 'ModelFieldFileImage' => '圖片',
+ 'ModelFieldFileVideo' => '影片',
+ 'ModelFieldFileAudio' => '音訊',
+ 'ModelFieldFileProgram' => '程å¼',
+ 'ModelFieldFileUrl' => '統一資æºå®šç¾©ç¬¦(URL)',
+ 'ModelFieldFileEbook' => 'Ebook',
+ 'ModelOptionsFields' => '使用欄ä½',
+ 'ModelOptionsFieldsAuto' => '自動',
+ 'ModelOptionsFieldsNone' => 'ç„¡',
+ 'ModelOptionsFieldsTitle' => '作為標題',
+ 'ModelOptionsFieldsId' => '作為ID',
+ 'ModelOptionsFieldsCover' => '作為å°é¢',
+ 'ModelOptionsFieldsPlay' => '連給播放按鈕',
+ 'ModelCollectionSettings' => '收è—集設定',
+ 'ModelCollectionSettingsLending' => 'å¯è¢«å€Ÿå‡º',
+ 'ModelCollectionSettingsTagging' => 'å¯åŠ æ¨™ç±¤',
+ 'ModelFilterActivated' => '收錄進æœå°‹ç›’å…§',
+ 'ModelFilterComparison' => '比較',
+ 'ModelFilterContain' => 'å«æœ‰',
+ 'ModelFilterDoesNotContain' => '未å«æœ‰',
+ 'ModelFilterRegexp' => '正則表示å¼',
+ 'ModelFilterRange' => '範åœ',
+ 'ModelFilterNumeric' => '以數字比較',
+ 'ModelFilterQuick' => '建立一個快速éŽæ¿¾å™¨',
+ 'ModelTooltipName' => '建立å字以供其他收è—集使用。如果空白,相關設定會直接儲存在收è—集裡é¢ã€‚',
+ 'ModelTooltipLabel' => '用來顯示的欄ä½å稱',
+ 'ModelTooltipGroup' => '供欄ä½çš„分組使用,ä¸è¨­å®šæœƒå°‡æ¬„ä½æ­¸å…¥é è¨­åˆ†çµ„',
+ 'ModelTooltipHistory' => 'éŽåŽ»çš„輸入值將會被建æˆåˆ—表供é¸æ“‡',
+ 'ModelTooltipFormat' => 'æ ¼å¼å°‡æœƒæ±ºå®šæ’­æ”¾æŒ‰éˆ•é—œè¯åˆ°ä»€éº¼ç¨‹å¼',
+ 'ModelTooltipLending' => '這會在收è—集裡加入一些欄ä½ä¾†ç®¡ç†å€Ÿå‡ºè³‡è¨Š',
+ 'ModelTooltipTagging' => '這會加入一些欄ä½ä¾†ç®¡ç†æ¨™ç±¤',
+ 'ModelTooltipNumeric' => '這個值將會被當作數字來比較',
+ 'ModelTooltipQuick' => 'This will add a submenu in the Filters one',
+
+ 'ResultsTitle' => 'é¸æ“‡ä¸€å€‹é …ç›®',
+ 'ResultsNextTip' => 'æœå°‹ä¸‹ä¸€å€‹ç¶²ç«™',
+ 'ResultsPreview' => 'é è¦½',
+ 'ResultsInfo' => '藉由按ä½Ctrl或shiftéµï¼Œä½ å¯ä»¥åŠ å…¥å¤šå€‹é …目到收è—集中',
+
+ 'OptionsTitle' => 'å好設定',
+ 'OptionsExpertMode' => '專家模å¼',
+ 'OptionsPrograms' => 'å°ä¸åŒé¡žåž‹çš„檔案用ä¸åŒçš„程å¼é–‹å•Ÿï¼Œè‹¥ç•™ç™½å‰‡ä½¿ç”¨ç³»çµ±é è¨­å€¼',
+ 'OptionsBrowser' => '網é ç€è¦½å™¨',
+ 'OptionsPlayer' => '影片播放器',
+ 'OptionsAudio' => '音訊播放器',
+ 'OptionsImageEditor' => 'å½±åƒç·¨è¼¯å™¨',
+ 'OptionsCdDevice' => 'CDè£ç½®',
+ 'OptionsImages' => '圖片資料夾',
+ 'OptionsUseRelativePaths' => 'å°åœ–片使用相å°è·¯å¾‘',
+ 'OptionsLayout' => '視窗佈局方å¼',
+ 'OptionsStatus' => '顯示狀態æ¢',
+ 'OptionsUseStars' => '使用星號來顯示評分',
+ 'OptionsWarning' => '警告:改變這個標籤é å¾Œå¿…é ˆè¦é‡å•Ÿç¨‹å¼æ‰æœƒç”Ÿæ•ˆã€‚',
+ 'OptionsRemoveConfirm' => '在項目刪除å‰è¦æ±‚確èª',
+ 'OptionsAutoSave' => '自動儲存收è—集',
+ 'OptionsAutoLoad' => '在啟動時載入先å‰çš„收è—集',
+ 'OptionsSplash' => '顯示啟動畫é¢',
+ 'OptionsTearoffMenus' => 'å…許撕開é¸å–®',
+ 'OptionsSpellCheck' => '在長文字欄ä½ä½¿ç”¨èªžæ³•æª¢æŸ¥',
+ 'OptionsProgramTitle' => 'é¸æ“‡ä½¿ç”¨çš„程å¼',
+ 'OptionsPlugins' => '從哪些網站å–得項目資料',
+ 'OptionsAskPlugins' => 'è©¢å• (全部網站)',
+ 'OptionsPluginsMulti' => '多數網站',
+ 'OptionsPluginsMultiAsk' => 'è©¢å• (多數網站)',
+ 'OptionsPluginsMultiPerField' => 'Many sites (per field)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => 'Many sites per field order selection',
+ 'OptionsPluginsMultiPerFieldDesc' => 'For each field we will fill the field with the first non empty information beginning from left',
+ 'OptionsPluginsMultiPerFieldFirst' => 'First',
+ 'OptionsPluginsMultiPerFieldLast' => 'Last',
+ 'OptionsPluginsMultiPerFieldRemove' => 'Remove',
+ 'OptionsPluginsMultiPerFieldClearSelected' => 'Empty selected field list',
+ 'OptionsPluginsList' => '設定列表',
+ 'OptionsAskImport' => 'é¸æ“‡æ¬„ä½ä¾†åŒ¯å…¥',
+ 'OptionsProxy' => '使用代ç†',
+ 'OptionsCookieJar' => '使用cookie jar檔案',
+ 'OptionsLang' => '語言',
+ 'OptionsMain' => '主è¦',
+ 'OptionsPaths' => '路徑',
+ 'OptionsInternet' => '網際網路',
+ 'OptionsConveniences' => '其他特徵',
+ 'OptionsDisplay' => '顯示',
+ 'OptionsToolbar' => '工具列',
+ 'OptionsToolbars' => {0 => 'ç„¡', 1 => 'å°', 2 => '大', 3 => '系統設定'},
+ 'OptionsToolbarPosition' => 'ä½ç½®',
+ 'OptionsToolbarPositions' => {0 => '上', 1 => '下', 2 => 'å·¦', 3 => 'å³'},
+ 'OptionsExpandersMode' => 'éŽé•·çš„文字',
+ 'OptionsExpandersModes' => {'asis' => 'ä¸ç®¡å®ƒ', 'cut' => '切斷', 'wrap' => '自動æ›è¡Œ'},
+ 'OptionsDateFormat' => '日期格å¼',
+ 'OptionsDateFormatTooltip' => '使用strftime(3)æ ¼å¼ï¼Œé è¨­å€¼ç‚º%d/%m/%Y',
+ 'OptionsView' => '項目列表',
+ 'OptionsViews' => {0 => '文字', 1 => '圖片', 2 => '細節'},
+ 'OptionsColumns' => '欄',
+ 'OptionsMailer' => '寄件程å¼',
+ 'OptionsSMTP' => '伺æœå™¨',
+ 'OptionsFrom' => 'ä½ çš„e-mail',
+ 'OptionsTransform' => 'Place articles at the end of titles',
+ 'OptionsArticles' => 'Articles (用逗點分開)',
+ 'OptionsSearchStop' => 'å…許æœå°‹è¢«æ”¾æ£„',
+ 'OptionsBigPics' => '在å¯ä»¥çš„ç‹€æ³ä¸‹ä½¿ç”¨å¤§åœ–片',
+ 'OptionsAlwaysOriginal' => 'Use main title as the original title if none present',
+ 'OptionsRestoreAccelerators' => 'Restore accelerators',
+ 'OptionsHistory' => 'æ­·å²å¤§å°',
+ 'OptionsClearHistory' => '清除歷å²',
+ 'OptionsStyle' => 'é¢æ¿',
+ 'OptionsDontAsk' => '別å†è©¢å•',
+ 'OptionsPathProgramsGroup' => 'Applications',
+ 'OptionsProgramsSystem' => '使用系統定義的程å¼',
+ 'OptionsProgramsUser' => '複寫é è¨­çš„程å¼',
+ 'OptionsProgramsSet' => '設定程å¼',
+ 'OptionsPathImagesGroup' => '圖片',
+ 'OptionsInternetDataGroup' => '資料匯入',
+ 'OptionsInternetSettingsGroup' => '設定',
+ 'OptionsDisplayInformationGroup' => '訊æ¯é¡¯ç¤ºæ–¹å¼',
+ 'OptionsDisplayArticlesGroup' => 'Articles',
+ 'OptionsImagesDisplayGroup' => '顯示',
+ 'OptionsImagesStyleGroup' => '風格',
+ 'OptionsDetailedPreferencesGroup' => 'å好設定',
+ 'OptionsFeaturesConveniencesGroup' => 'Conveniences',
+ 'OptionsPicturesFormat' => '圖片å‰ç¶´ï¼š',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'é—œè¯é …目的標題或åå­—',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% 或 . 被用來代指收è—集資料夾(在路徑的開始處)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% 被用來代指沒有後綴的收è—集檔å(.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% åªèƒ½è¢«ç”¨åœ¨åœ–片路徑的開頭',
+ 'OptionsConfigureMailers' => '設定郵件程å¼',
+
+ 'ImagesOptionsButton' => '設定',
+ 'ImagesOptionsTitle' => '設定圖片列表',
+ 'ImagesOptionsSelectColor' => 'é¸æ“‡ä¸€å€‹é¡è‰²',
+ 'ImagesOptionsUseOverlays' => '使用圖åƒå±¤ç–Š',
+ 'ImagesOptionsBg' => '背景',
+ 'ImagesOptionsBgPicture' => '使用背景圖片',
+ 'ImagesOptionsFg'=> 'é¸æ“‡',
+ 'ImagesOptionsBgTooltip' => '改變背景色',
+ 'ImagesOptionsFgTooltip'=> '改變é¸æ“‡é¡è‰²',
+ 'ImagesOptionsResizeImgList' => '自動改變欄的數字',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => '尺寸',
+ 'ImagesOptionsSizeList' => {0 => '極å°', 1 => 'å°', 2 => '中', 3 => '大', 4 => '極大'},
+ 'ImagesOptionsSizeTooltip' => 'é¸æ“‡åœ–片尺寸',
+
+ 'DetailedOptionsTitle' => '設定細節列表',
+ 'DetailedOptionsImageSize' => '圖片尺寸',
+ 'DetailedOptionsGroupItems' => '項目分組ä¾æ“š',
+ 'DetailedOptionsSecondarySort' => 'Sort field for children',
+ 'DetailedOptionsFields' => 'Select fields to display',
+ 'DetailedOptionsGroupedFirst' => 'Keep together orphaned items',
+ 'DetailedOptionsAddCount' => 'Add number of elements on categories',
+
+ 'ExtractButton' => '訊æ¯',
+ 'ExtractTitle' => '檔案訊æ¯',
+ 'ExtractImport' => '使用值',
+
+ 'FieldsListOpen' => '從檔案載入欄ä½åˆ—表',
+ 'FieldsListSave' => '儲存欄ä½åˆ—表到檔案',
+ 'FieldsListError' => '這個欄ä½åˆ—表ä¸èƒ½è¢«ç”¨åœ¨é€™å€‹é¡žåž‹çš„收è—集上',
+ 'FieldsListIgnore' => '--- 忽略',
+
+ 'ExportTitle' => '匯出項目列表',
+ 'ExportFilter' => '僅匯出顯示的項目',
+ 'ExportFieldsTitle' => '欄ä½è¢«åŒ¯å‡º',
+ 'ExportFieldsTip' => 'é¸æ“‡ä½ æƒ³åŒ¯å‡ºçš„欄ä½',
+ 'ExportWithPictures' => '複製å­ç›®éŒ„中的圖片',
+ 'ExportSortBy' => '排åºä¾æ“š',
+ 'ExportOrder' => 'Order',
+
+ 'ImportListTitle' => '匯入å¦ä¸€å€‹é …目列表',
+ 'ImportExportData' => '資料',
+ 'ImportExportFile' => '檔案',
+ 'ImportExportFieldsUnused' => '未使用欄ä½',
+ 'ImportExportFieldsUsed' => '使用欄ä½',
+ 'ImportExportFieldsFill' => '添加全部',
+ 'ImportExportFieldsClear' => '移除全部',
+ 'ImportExportFieldsEmpty' => '你至少必須é¸æ“‡ä¸€å€‹æ¬„ä½',
+ 'ImportExportFileEmpty' => '你必須指定一個檔案å稱',
+ 'ImportFieldsTitle' => 'è¦å°Žå…¥çš„欄ä½',
+ 'ImportFieldsTip' => 'é¸æ“‡ä½ æƒ³åŒ¯å…¥çš„欄ä½',
+ 'ImportNewList' => '建立一個新的收è—集',
+ 'ImportCurrentList' => '加入當å‰çš„收è—集',
+ 'ImportDropError' => 'There was an error opening at least one file. Previous list will be reloaded.',
+ 'ImportGenerateId' => 'å°æ¯å€‹é …目產生ID',
+
+ 'FileChooserOpenFile' => 'è«‹é¸æ“‡è¦ä½¿ç”¨çš„檔案',
+ 'FileChooserDirectory' => '資料夾',
+ 'FileChooserOpenDirectory' => 'é¸æ“‡ä¸€å€‹è³‡æ–™å¤¾',
+ 'FileChooserOverwrite' => '這個檔案已經存在,你è¦è¤‡å¯«å®ƒå—Žï¼Ÿ',
+ 'FileAllFiles' => 'All Files',
+ 'FileVideoFiles' => 'Video Files',
+ 'FileEbookFiles' => 'Ebook Files',
+ 'FileAudioFiles' => 'Audio Files',
+ 'FileGCstarFiles' => 'GCstar Collections',
+
+ #Some default panels
+ 'PanelCompact' => '緊密',
+ 'PanelReadOnly' => '唯讀',
+ 'PanelForm' => '分é ',
+
+ 'PanelSearchButton' => 'ç²å–資訊',
+ 'PanelSearchTip' => 'æœå°‹ç¶²è·¯ä¸Šé—œæ–¼é€™å€‹å字的資訊',
+ 'PanelSearchContextChooseOne' => 'Choose a site ...',
+ 'PanelSearchContextMultiSite' => 'Use "Many sites"',
+ 'PanelSearchContextMultiSitePerField' => 'Use "Many sites per field"',
+ 'PanelSearchContextOptions' => 'Change options ...',
+ 'PanelImageTipOpen' => '點擊圖片以é¸æ“‡å¦ä¸€å€‹ã€‚',
+ 'PanelImageTipView' => '點擊圖片ç€è¦½çœŸå¯¦å°ºå¯¸ã€‚',
+ 'PanelImageTipMenu' => ' 更多é¸æ“‡è«‹æŒ‰å³éµ',
+ 'PanelImageTitle' => 'é¸æ“‡ä¸€å¼µåœ–片',
+ 'PanelImageNoImage' => '沒有圖片',
+ 'PanelSelectFileTitle' => 'é¸æ“‡ä¸€å€‹æª”案',
+ 'PanelLaunch' => 'Launch',
+ 'PanelRestoreDefault' => '復原到é è¨­å€¼',
+ 'PanelRefresh' => 'Update',
+ 'PanelRefreshTip' => 'Update information from web',
+
+ 'PanelFrom' =>'From',
+ 'PanelTo' =>'To',
+
+ 'PanelWeb' => 'ç€è¦½è³‡è¨Š',
+ 'PanelWebTip' => 'ç€è¦½ç¶²è·¯ä¸Šé—œæ–¼é€™å€‹é …目的資訊',
+ 'PanelRemoveTip' => '移除當å‰é …ç›®',
+
+ 'PanelDateSelect' => 'é¸æ“‡',
+ 'PanelNobody' => '沒有人',
+ 'PanelUnknown' => '未知',
+ 'PanelAdded' => '加入日期',
+ 'PanelRating' => '評價',
+ 'PanelPressRating' => 'Press Rating',
+ 'PanelLocation' => 'ä½ç½®',
+
+ 'PanelLending' => '出借狀æ³',
+ 'PanelBorrower' => '借出å°è±¡',
+ 'PanelLendDate' => '出借日期',
+ 'PanelHistory' => '出借記錄',
+ 'PanelReturned' => '物å“歸還',
+ 'PanelReturnDate' => '歸還日期',
+ 'PanelLendedYes' => '出借中',
+ 'PanelLendedNo' => 'å¯ç”¨',
+
+ 'PanelTags' => '標籤',
+ 'PanelFavourite' => '最愛',
+ 'TagsAssigned' => '標籤',
+
+ 'PanelUser' => '使用者欄ä½',
+
+ 'CheckUndef' => '未定義',
+ 'CheckYes' => '是',
+ 'CheckNo' => 'ä¸æ˜¯',
+
+ 'ToolbarRandom' => 'Tonight',
+ 'ToolbarAll' => 'ç€è¦½å…¨éƒ¨',
+ 'ToolbarAllTooltip' => 'ç€è¦½å…¨éƒ¨é …ç›®',
+ 'ToolbarGroupBy' => '分組ä¾æ“š',
+ 'ToolbarGroupByTooltip' => 'é¸æ“‡ä¸€å€‹æ¬„ä½çµ¦é …目列表分組',
+ 'ToolbarQuickSearch' => '快速æœå°‹',
+ 'ToolbarQuickSearchLabel' => 'æœå°‹',
+ 'ToolbarQuickSearchTooltip' => 'é¸æ“‡é€™å€‹æ¬„ä½ä¾†æœå°‹ï¼Œè¼¸å…¥è¦æœå°‹çš„字串後按ENTER。',
+ 'ToolbarSeparator' => '分隔',
+
+ 'PluginsTitle' => 'æœå°‹ä¸€å€‹é …ç›®',
+ 'PluginsQuery' => '查詢',
+ 'PluginsFrame' => 'æœå°‹ç«™é»ž',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'åå­—',
+ 'PluginsSearchFields' => 'æœå°‹æ¬„ä½',
+ 'PluginsAuthor' => '作者',
+ 'PluginsLang' => '語言',
+ 'PluginsUseSite' => '使用被é¸æ“‡çš„站點供未來æœå°‹',
+ 'PluginsPreferredTooltip' => 'Site recommended by GCstar',
+ 'PluginDisabled' => 'Disabled',
+
+ 'BorrowersTitle' => '出借å°è±¡è¨­å®š',
+ 'BorrowersList' => '出借å°è±¡',
+ 'BorrowersName' => 'åå­—',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => '加入',
+ 'BorrowersRemove' => '移除',
+ 'BorrowersEdit' => '編輯',
+ 'BorrowersTemplate' => '郵件模æ¿',
+ 'BorrowersSubject' => '郵件主題',
+ 'BorrowersNotice1' => '%1 將會被å–代為出借å°è±¡çš„åå­—',
+ 'BorrowersNotice2' => '%2 將會被å–代為物å“å稱',
+ 'BorrowersNotice3' => '%3 將會被å–代為出借日期',
+
+ 'BorrowersImportTitle' => '匯入出借å°è±¡çš„資訊',
+ 'BorrowersImportType' => '檔案格å¼ï¼š',
+ 'BorrowersImportFile' => '檔案:',
+
+ 'BorrowedTitle' => '被借走的æ±è¥¿',
+ 'BorrowedDate' => '從',
+ 'BorrowedDisplayInPanel' => '在主視窗顯示物å“',
+
+ 'MailTitle' => '發一å°e-mail',
+ 'MailFrom' => '寄件人:',
+ 'MailTo' => '收件人:',
+ 'MailSubject' => '主旨:',
+ 'MailSmtpError' => '連線到SMTP伺æœå™¨æ™‚出ç¾å•é¡Œ',
+ 'MailSendmailError' => '寄é€ä¿¡ä»¶æ™‚出ç¾å•é¡Œ',
+
+ 'SearchTooltip' => 'æœå°‹æ‰€æœ‰é …ç›®',
+ 'SearchTitle' => 'é …ç›®æœå°‹',
+ 'SearchNoField' => 'No field have been selected for the search box.
+Add some of them in the Filters tab of the collection settings.',
+
+ 'QueryReplaceField' => '欄ä½å–代',
+ 'QueryReplaceOld' => '當å‰å€¼',
+ 'QueryReplaceNew' => '新值',
+ 'QueryReplaceLaunch' => 'å–代',
+
+ 'ImportWindowTitle' => 'é¸æ“‡è¦åŒ¯å…¥çš„欄ä½',
+ 'ImportViewPicture' => 'ç€è¦½åœ–片',
+ 'ImportSelectAll' => 'å…¨é¸',
+ 'ImportSelectNone' => '全部ä¸é¸',
+
+ 'MultiSiteTitle' => '用來æœå°‹çš„網站',
+ 'MultiSiteUnused' => '未使用的æ’件',
+ 'MultiSiteUsed' => '被使用的æ’件',
+ 'MultiSiteLang' => 'Fill list with English plugins',
+ 'MultiSiteEmptyError' => '你的站點列表為空',
+ 'MultiSiteClear' => '清除列表',
+
+ 'DisplayOptionsTitle' => 'Items to display',
+ 'DisplayOptionsAll' => 'å…¨é¸',
+ 'DisplayOptionsSearch' => 'é¸æ“‡éˆ•',
+
+ 'GenresTitle' => 'Genre Conversion',
+ 'GenresCategoryName' => 'Genre to use',
+ 'GenresCategoryMembers' => 'Genre to replace',
+ 'GenresLoad' => '讀å–一個列表',
+ 'GenresExport' => '將列表存到檔案',
+ 'GenresModify' => '編輯轉æ›',
+
+ 'PropertiesName' => '收è—集å稱',
+ 'PropertiesLang' => '語言編碼',
+ 'PropertiesOwner' => 'æ“有者',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'æè¿°',
+ 'PropertiesFile' => '檔案訊æ¯',
+ 'PropertiesFilePath' => '完整路徑',
+ 'PropertiesItemsNumber' => '項目數目',
+ 'PropertiesFileSize' => '大å°',
+ 'PropertiesFileSizeSymbols' => ['ä½å…ƒçµ„', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => '收è—集屬性',
+ 'PropertiesDefaultPicture' => 'é è¨­åœ–片',
+
+ 'MailProgramsTitle' => '寄件軟體',
+ 'MailProgramsName' => 'åå­—',
+ 'MailProgramsCommand' => '指令行',
+ 'MailProgramsRestore' => '回復é è¨­å€¼',
+ 'MailProgramsAdd' => '加入一個程å¼',
+ 'MailProgramsInstructions' => '在指令行中,你å¯ä»¥ç”¨ä¸‹é¢çš„變數來替æ›ï¼š
+ %f å¯è¢«æ›¿æ›ç‚ºä½¿ç”¨è€…çš„é›»å­éƒµä»¶åœ°å€ã€‚
+ %t å¯è¢«æ›¿æ›ç‚ºæŽ¥æ”¶åœ°å€ã€‚
+ %s å¯è¢«æ›¿æ›ç‚ºéƒµä»¶ä¸»é¡Œã€‚
+ %b å¯è¢«æ›¿æ›ç‚ºéƒµä»¶è¨Šæ¯ã€‚',
+
+ 'BookmarksBookmarks' => '書籤',
+ 'BookmarksFolder' => '資料夾',
+ 'BookmarksLabel' => '書籤å',
+ 'BookmarksPath' => '路徑',
+ 'BookmarksNewFolder' => '新資料夾',
+
+ 'AdvancedSearchType' => 'æœå°‹é¡žåž‹',
+ 'AdvancedSearchTypeAnd' => '項目匹é…所有æ¢ä»¶',
+ 'AdvancedSearchTypeOr' => '項目匹é…至少一個æ¢ä»¶',
+ 'AdvancedSearchCriteria' => 'æ¢ä»¶',
+ 'AdvancedSearchAnyField' => '所有欄ä½',
+ 'AdvancedSearchSaveTitle' => '儲存æœå°‹',
+ 'AdvancedSearchSaveName' => 'å稱',
+ 'AdvancedSearchSaveOverwrite' => '一個使用相åŒåå­—çš„æœå°‹å·²ç¶“存在,請使用å¦ä¸€å€‹å字。',
+ 'AdvancedSearchUseCase' => '大å°å¯«æ•æ„Ÿ',
+ 'AdvancedSearchIgnoreDiacritics' => '忽略é‡éŸ³ç­‰ç™¼éŸ³è¨˜è™Ÿ',
+
+ 'BugReportSubject' => 'GCstar產生錯誤回報',
+ 'BugReportVersion' => '版本',
+ 'BugReportPlatform' => '作業系統',
+ 'BugReportMessage' => '錯誤訊æ¯',
+ 'BugReportInformation' => '附加資訊',
+
+#Statistics
+ 'StatsFieldToUse' => 'Field to use',
+ 'StatsSortByNumber' => 'Sort by number of {lowercaseX}',
+ 'StatsGenerate' => 'Generate',
+ 'StatsKindOfGraph' => 'Kind of graphic',
+ 'StatsBars' => 'Bars',
+ 'StatsPie' => 'Pie',
+ 'Stats3DPie' => '3D Pie',
+ 'StatsArea' => 'Areas',
+ 'StatsHistory' => 'History',
+ 'StatsWidth' => 'Width',
+ 'StatsHeight' => 'Height',
+ 'StatsFontSize' => 'Font size',
+ 'StatsDisplayNumber' => 'Show numbers',
+ 'StatsSave' => 'Save statistics image to a file',
+ 'StatsAccumulate' => 'Accumulate values',
+ 'StatsShowAllDates' => 'Show all dates',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm
new file mode 100644
index 0000000..e4c10d7
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportCSV.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Header' => '包å«é¡¶éƒ¨çš„字段å称',
+ 'Separator' => '分隔符',
+ 'Replacement' => '替æ¢åˆ†éš”符',
+ 'Charset' => 'ç¼–ç ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm
new file mode 100644
index 0000000..9f2fafc
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportExternal.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportExternal;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '外部ç£ç›˜',
+ 'ZipAll' => 'zip压缩(.gcz)',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm
new file mode 100644
index 0000000..c6adb7e
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportHTML.pm
@@ -0,0 +1,64 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportHTML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelNotFound' => '无效模æ¿',
+ 'UseFile' => '使用文件',
+ 'WithJS' => '使用Javascript',
+ 'FileTemplate' => '模æ¿',
+ 'Preview' => '预览',
+ 'NoPreview' => '没有预览',
+ 'TemplateExternalFile' => '模æ¿æ–‡ä»¶',
+ 'Title' => '页é¢æ ‡é¢˜',
+ 'InfoFile' => '列表所在文件:',
+ 'InfoDir' => '图片目录',
+ 'HeightImg' => '导出图片的高度(åƒç´ ï¼‰',
+ 'OpenFileInBrowser' => '在æµè§ˆå™¨ä¸­æ‰“开生æˆçš„文件',
+ 'Note' => '本列表由<a href="http://www.gcstar.org/">GCstar</a>生æˆ',
+ 'InputTitle' => '输入æœç´¢æ–‡å­—',
+ 'SearchType1' => 'åªæœ‰æ ‡é¢˜',
+ 'SearchType2' => '全部信æ¯',
+ 'SearchButton' => 'æœç´¢',
+ 'SearchTitle' => 'åªæ˜¾ç¤ºåŒ¹é…æ¡ä»¶çš„电影',
+ 'AllButton' => '全部',
+ 'AllTitle' => '显示全部电影',
+ 'Expand' => '展开全部',
+ 'ExpandTitle' => '显示所有电影信æ¯',
+ 'Collapse' => '折å å…¨éƒ¨',
+ 'CollapseTitle' => '折å å…¨éƒ¨ç”µå½±ä¿¡æ¯',
+ 'Borrowed' => '被è°å€Ÿèµ°ï¼š',
+ 'NotBorrowed' => 'å¯ç”¨',
+ 'Top' => '顶部',
+ 'Bottom' => '底部',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm
new file mode 100644
index 0000000..cf6e0a3
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportPDB.pm
@@ -0,0 +1,38 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportPDB;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Palm PDB',
+ 'DatabaseName' => 'æ•°æ®åº“å称',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm
new file mode 100644
index 0000000..2be7405
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportSQL.pm
@@ -0,0 +1,40 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportSQL;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'WithDrop' => '包å«DROP指引',
+ 'WithCreate' => '包å«CREATE指引',
+ 'TableName' => '表格å称',
+ 'InfoFile' => 'SQL文件: ',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm
new file mode 100644
index 0000000..df90790
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportTarGz.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportTarGz;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Info' => '压缩到文件:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm
new file mode 100644
index 0000000..3a590ec
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCExport/GCExportXML.pm
@@ -0,0 +1,41 @@
+{
+ package GCLang::ZH_CN::GCExport::GCExportXML;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'ModelFile' => '模æ¿æ–‡ä»¶',
+ 'ModelText' => '模æ¿æ–‡å­—',
+ 'Models' => '模æ¿ä½¿ç”¨',
+ 'UseFile' => '使用文件',
+ 'UseModel' => '使用文字区域',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm
new file mode 100644
index 0000000..3ac70f4
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportAlexandria.pm
@@ -0,0 +1,39 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportAlexandria;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Where' => 'è¦æœç´¢å“ªå€‹ä½ç½®',
+ 'Default' => '默认的Alexandria目录',
+ 'Specified' => '指定目录',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm
new file mode 100644
index 0000000..6850d92
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportCSV.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportCSV;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Charset' => 'ç¼–ç ',
+ 'Header' => '忽略第一行',
+ 'Separator' => '分隔符',
+ 'Plugin' => '使用网站',
+ 'UseFirst' => '当结果太多时使用第一个',
+ 'SearchField' => 'æœç´¢é¡¹ç›®æ—¶ä½¿ç”¨',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm
new file mode 100644
index 0000000..33040c1
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportFolder.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportFolder;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+ use GCLang::GCLangUtils;
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => '目录',
+ 'Recursive' => '递归æœç´¢å­ç›®å½•',
+ 'Suffixes' => 'åŽç¼€å',
+ 'SuffixesTooltip' => '用逗å·åˆ†éš”打算处ç†çš„åŽç¼€åˆ—表',
+ 'Remove' => '从å称中删除',
+ 'RemoveTooltip' => '用逗å·åˆ†éš”è¦ä»Žå称中删除的文字列表',
+ 'Ask'=> '询问',
+ 'AskEnd'=> '最åŽä¸€èµ·è¯¢é—®',
+ 'AddWithoutInfo'=> '添加,ä¸åŒ…括信æ¯',
+ 'DontAdd'=> 'ä¸æ·»åŠ ',
+ 'TakeFirst' => '优先选择',
+ 'MultipleResult'=> '多个结果',
+ 'MultipleResultTooltip'=> '当æ’件有多个返回结果时怎么办?',
+ 'RemoveWholeWord' => 'åªæœ‰ä¸€ä¸ªå•è¯æ—¶åˆ é™¤',
+ 'NoResult'=> '没有结果',
+ 'NoResultTooltip'=> '当æ’件没有返回结果时怎么办?',
+ 'RemoveTooltipWholeWord' => 'åªæœ‰å½“åªå‡ºçŽ°ä¸€ä¸ªå•è¯æ—¶åˆ é™¤å•è¯',
+ 'RemoveRegularExpr' => '正则表达å¼',
+ 'RemoveTooltipRegularExpr' => 'å°†\'从å称中删除\'作为perl正则表达å¼',
+ 'SkipFileAlreadyInCollection' => 'åªæ·»åŠ æ–°æ–‡ä»¶',
+ 'SkipFileAlreadyInCollectionTooltip' => 'åªæ·»åŠ æ²¡æœ‰åœ¨æ”¶è—中的文件',
+ 'SkipFileNo' => 'å¦',
+ 'SkipFileFullPath' => '基于完整路径',
+ 'SkipFileFileName' => '基于文件å',
+ 'SkipFileFileNameAndUpdate' => '基于文件å(但更新收è—中的路径)',
+ 'InfoFromFileNameRegExp' => '用正则表达å¼åˆ†æžæ–‡ä»¶å',
+ 'InfoFromFileNameRegExpTooltip' => '从文件å(删除åŽç¼€å)中æå–æå–ä¿¡æ¯.\n如ä¸éœ€è¦ç•™ç©º.\n已知字段:\n$T:标题,$A:å­—æ¯è¡¨ç¤ºæ ‡é¢˜, $Y:å‘行日期,$S:å­£,$E:集,$N:å­—æ¯è¡¨ç¤ºç³»åˆ—å称,$x:部,$y:总部数',
+
+ 'InfoFromFileNameRegExp' => '用正则表达å¼åˆ†æžæ–‡ä»¶å',
+ 'InfoFromFileNameRegExpTooltip' => '从文件å(删除åŽç¼€å)中æå–æå–ä¿¡æ¯.\n如ä¸éœ€è¦ç•™ç©º.\n已知字段:\n$T:标题,$A:文章, $Y:年份, $S:å­£, $E:期, $N:å·å'
+ );
+
+ # As this plugin shares some values with ImportList, it adds them from it
+ importTranslation('List');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm
new file mode 100644
index 0000000..276df8b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportGCstar.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportGCstar;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'CopyPictures' => 'å¤åˆ¶å›¾ç‰‡',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm
new file mode 100644
index 0000000..cce54b6
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportList.pm
@@ -0,0 +1,42 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportList;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'å称列表',
+ 'Plugin' => '使用网站',
+ 'UseFirst' => '结果太多时使用第一个',
+ 'CommentAuto' => '自动导入项目',
+ 'CommentSite' => '网站:',
+ 'CommentTitle' => '标题:',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm
new file mode 100644
index 0000000..fb5a870
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportScanner.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportScanner;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'Name' => 'Barcode scanner',
+ 'Type' => 'Scanner type',
+ 'Local' => 'Local (used as a keyboard)',
+ 'Network' => 'Network (eg: GCstar Scanner for Android)',
+ 'Port' => 'Port to listen on',
+ 'Plugin' => 'Site to be used',
+ 'UseFirst' => 'Select first one if many results',
+ 'Waiting' => 'Waiting for barcode',
+ 'EAN' => 'Barcode',
+ 'ScanPrompt' => 'Scan an item or press on Done',
+ 'ScanOtherPrompt' => 'Scan another item or press on Done',
+ 'Previous' => '"%s" will be added.',
+ 'NothingFound' => 'Nothing was found for "%s". An empty item will be added.',
+ 'Terminate' => 'Done',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm
new file mode 100644
index 0000000..46d1f61
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCImport/GCImportTellico.pm
@@ -0,0 +1,37 @@
+{
+ package GCLang::ZH_CN::GCImport::GCImportTellico;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+ 'NotSupported' => 'ä¸æ˜¯æ‰€æ”¯æŒçš„Tellico收è—',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm
new file mode 100644
index 0000000..ae58678
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVepisodes.pm
@@ -0,0 +1,46 @@
+{
+ package GCLang::ZH_CN::GCModels::GCTVepisodes;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电视剧(集)收è—',
+ Items => '集',
+ NewItem => '新章节',
+ NewSeries => '新系列',
+ Episode => '集',
+ );
+ # Both of them are required as importTranslation doesn't recurse
+ importTranslation('films');
+ importTranslation('TVseries');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm
new file mode 100644
index 0000000..f90605b
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCTVseries.pm
@@ -0,0 +1,50 @@
+{
+ package GCLang::ZH_CN::GCModels::GCTVseries;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use GCLang::GCLangUtils;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电视剧(系列)收è—',
+ Items => '个系列',
+ NewItem => '新系列',
+ Name => '系列å称',
+ Season => 'å­£',
+ Part => '部',
+ Episodes => '集',
+ FirstAired => '首播',
+ Time => 'æ¯é›†é•¿åº¦',
+ Producer => '制片商',
+ Music => '音ä¹',
+ );
+ importTranslation('Films');
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm
new file mode 100644
index 0000000..8a3fd8d
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCboardgames.pm
@@ -0,0 +1,86 @@
+{
+ package GCLang::ZH_CN::GCModels::GCboardgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'æ¡Œé¢æ¸¸æˆæ”¶è—',
+ Items => {0 => '份游æˆ',
+ 1 => '份游æˆ',
+ X => '游æˆ'},
+ NewItem => 'æ–°éŠæˆ',
+
+ Id => 'Id',
+ Name => 'å称',
+ Original => '原å',
+ Box => 'éŠæˆç›’图片',
+ DesignedBy => '设计者',
+ PublishedBy => '出版商',
+ Players => '玩家人数',
+ PlayingTime => 'éŠæˆæ—¶é—´',
+ SuggestedAge => '建议年龄',
+ Released => 'å‘布',
+ Description => 'æè¿°',
+ Category => '分类',
+ Mechanics => 'éŠæˆæœºåˆ¶',
+ ExpandedBy => '有哪些扩充',
+ ExpansionFor => '扩充对象',
+ GameFamily => 'éŠæˆå®¶æ—',
+ IllustratedBy => '美工',
+ Url => '网页',
+ TimesPlayed => '所玩次数',
+ CompleteContents => '內容完整',
+ Copies => 'åºåˆ—å·',
+ Condition => 'ä¿å­˜çŠ¶æ€',
+ Photos => '照片',
+ Photo1 => '第一張图片',
+ Photo2 => '第二張图片',
+ Photo3 => '第三張图片',
+ Photo4 => '第四張图片',
+ Comments => '评论',
+
+ Perfect => '完美',
+ Good => '良好',
+ Average => '普通',
+ Poor => '糟糕',
+
+ CompleteYes => '內容完整',
+ CompleteNo => '丢失一部份',
+
+ General => '一般',
+ Details => '项目细节',
+ Personal => '个人',
+ Information => 'ä¿¡æ¯',
+
+ FilterRatingSelect => '评价至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm
new file mode 100644
index 0000000..63860c8
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCbooks.pm
@@ -0,0 +1,70 @@
+{
+ package GCLang::ZH_CN::GCModels::GCbooks;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '书本收è—',
+ Items => {0 => '本书',
+ 1 => '本书',
+ X => '书'},
+ NewItem => '新书',
+
+ Isbn => 'ISBN',
+ Title => '標題',
+ Cover => 'å°çš®',
+ Authors => '作者',
+ Publisher => '出版商',
+ Publication => '出版日期',
+ Language => '语言',
+ Genre => '类型',
+ Serie => '系列',
+ Rank => '等級',
+ Bookdescription => '书ç±æè¿°',
+ Pages => '页數',
+ Read => '已读',
+ Acquisition => 'å–得日期',
+ Edition => '版本',
+ Format => 'æ ¼å¼',
+ Comments => '评论',
+ Url => '网页',
+ Translator => '译者',
+ Artist => 'æ’画家',
+ DigitalFile => '电å­ç‰ˆ',
+
+ General => '一般',
+ Details => '详细',
+
+ ReadNo => '未读',
+ ReadYes => '已读',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm
new file mode 100644
index 0000000..01ad245
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcoins.pm
@@ -0,0 +1,104 @@
+{
+ package GCLang::ZH_CN::GCModels::GCcoins;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'é’±å¸æ”¶è—',
+ Items => {0 => '份钱å¸',
+ 1 => '份钱å¸',
+ X => 'é’±å¸'},
+ NewItem => 'æ–°é’±å¸',
+
+ Name => 'å称',
+ Country => '国家',
+ Year => '年份',
+ Currency => 'è´§å¸',
+ Value => '价值',
+ Picture => '主è¦å›¾ç‰‡',
+ Diameter => '直径',
+ Metal => '金属',
+ Edge => '边缘',
+ Edge1 => '边缘1',
+ Edge2 => '边缘2',
+ Edge3 => '边缘3',
+ Edge4 => '边缘4',
+ Head => 'æ­£é¢ï¼ˆäººé ­ï¼‰',
+ Tail => 'åé¢',
+ Comments => '评论',
+ History => '历å²',
+ Website => '网站',
+ Estimate => 'ä¼°ä»·',
+ References => 'å‚考资料',
+ Type => '类型',
+ Coin => '硬å¸',
+ Banknote => '钞票',
+
+ Main => '主è¦',
+ Description => 'æè¿°',
+ Other => '其他信æ¯',
+ Pictures => '图片',
+
+ Condition => 'PCGS状æ€åˆ†çº§',
+ Grade1 => 'BS-1',
+ Grade2 => 'FR-2',
+ Grade3 => 'AG-3',
+ Grade4 => 'G-4',
+ Grade6 => 'G-6',
+ Grade8 => 'VG-8',
+ Grade10 => 'VG-10',
+ Grade12 => 'F-12',
+ Grade15 => 'F-15',
+ Grade20 => 'VF-20',
+ Grade25 => 'VF-25',
+ Grade30 => 'VF-30',
+ Grade35 => 'VF-35',
+ Grade40 => 'XF-40',
+ Grade45 => 'XF-45',
+ Grade50 => 'AU-50',
+ Grade53 => 'AU-53',
+ Grade55 => 'AU-55',
+ Grade58 => 'AU-58',
+ Grade60 => 'MS-60',
+ Grade61 => 'MS-61',
+ Grade62 => 'MS-62',
+ Grade63 => 'MS-63',
+ Grade64 => 'MS-64',
+ Grade65 => 'MS-65',
+ Grade66 => 'MS-66',
+ Grade67 => 'MS-67',
+ Grade68 => 'MS-68',
+ Grade69 => 'MS-69',
+ Grade70 => 'MS-70',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm
new file mode 100644
index 0000000..e224388
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCcomics.pm
@@ -0,0 +1,73 @@
+{
+ package GCLang::ZH_CN::GCModels::GCcomics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '漫画收è—',
+ Items => {0 => '本漫画',
+ 1 => '本漫画',
+ X => '漫画'},
+ NewItem => '新漫画',
+
+
+ Id => 'Id',
+ Name => 'å称',
+ Series => '书å',
+ Volume => 'å·å·',
+ Title => '标题',
+ Writer => '脚本作者',
+ Illustrator => '绘师',
+ Colourist => '著色师',
+ Publisher => '出版商',
+ Synopsis => '故事æè¦',
+ Collection => '收è—',
+ PublishDate => '出版日期',
+ PrintingDate => 'å°åˆ·æ—¥æœŸ',
+ ISBN => 'ISBN',
+ Type => 'å°åˆ·ç‰ˆæœ¬',
+ Category => '分类',
+ Format => 'æ ¼å¼',
+ NumberBoards => 'å°åˆ·æ‰¹å·',
+ Signing => 'ç­¾å',
+ Cost => '售价',
+ Rating => '评价',
+ Comment => 'æ„è§',
+ Url => '网页',
+
+ FilterRatingSelect => '评价至少到(_L)...',
+
+ Main => '主项目',
+ General => '一般信æ¯',
+ Details => '详细',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm
new file mode 100644
index 0000000..3ce30ab
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCfilms.pm
@@ -0,0 +1,93 @@
+{
+ package GCLang::ZH_CN::GCModels::GCfilms;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电影收è—',
+ Items => {0 => '部电影',
+ 1 => '部电影',
+ X => '电影'},
+ NewItem => '新电影',
+
+
+ Id => 'Id',
+ Title => 'å称',
+ Date => '日期',
+ Time => '片长',
+ Director => '导演',
+ Country => '国家',
+ MinimumAge => '最å°å¹´é¾„é™åˆ¶',
+ Genre => '类型',
+ Image => '图片',
+ Original => '原å',
+ Actors => '演员',
+ Actor => '演员',
+ Role => '角色',
+ Comment => '评论',
+ Synopsis => '故事概览',
+ Seen => '已观èµ',
+ Number => '媒体数é‡',
+ Format => '媒体格å¼',
+ Region => '地区',
+ Identifier => 'ID',
+ Url => '网页',
+ Audio => '声音',
+ Video => '影片格å¼',
+ Trailer => '预告片',
+ Serie => '系列',
+ Rank => '等级',
+ Subtitles => '字幕',
+
+ SeenYes => '已观èµ',
+ SeenNo => '还没看',
+
+ AgeUnrated => '未评级',
+ AgeAll => '全年龄',
+ AgeParent => '需è¦å®¶é•¿é™ªåŒ',
+
+ Main => '主项目',
+ General => '一般',
+ Details => '细节',
+
+ Information => '资讯',
+ Languages => '语言',
+ Encoding => 'ç¼–ç ',
+
+ FilterAudienceAge => '观众年龄',
+ FilterSeenNo => '还没看过(_N)',
+ FilterSeenYes => '已观èµ(_A)',
+ FilterRatingSelect => '评价至少到(_L)...',
+
+ ExtractSize => '尺寸',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm
new file mode 100644
index 0000000..0fb790a
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgames.pm
@@ -0,0 +1,82 @@
+{
+ package GCLang::ZH_CN::GCModels::GCgames;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '电å­æ¸¸æˆæ”¶è—',
+ Items => {0 => '个游æˆ',
+ 1 => '个游æˆ',
+ X => '游æˆ'},
+ NewItem => '新游æˆ',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'å称',
+ Platform => 'å¹³å°',
+ Players => '游æˆäººæ•°',
+ Released => '释出日期',
+ Editor => '编辑者',
+ Developer => 'å¼€å‘者',
+ Genre => '类型',
+ Box => '游æˆç›’图片',
+ Case => '游æˆç›’',
+ Manual => '说明手册',
+ Completion => '完æˆåº¦(%)',
+ Executable => 'å¯å¯æ‰§è¡Œæ–‡ä»¶',
+ Description => '说明',
+ Codes => '秘技',
+ Code => '秘技',
+ Effect => '效果',
+ Secrets => '游æˆä¸­çš„秘密',
+ Screenshots => 'ç”»é¢æˆªå›¾',
+ Screenshot1 => '第一张截图',
+ Screenshot2 => '第二张截图',
+ Comments => '评论',
+ Url => '网页',
+ Unlockables => 'å¯è§£é”çš„éšè—项目',
+ Unlockable => 'å¯è§£é”',
+ Howto => 'æ“作方法',
+ Exclusive => '精选',
+ Resolutions => '显示分辨率',
+ InstallationSize => '大å°',
+ Region => '地区',
+ SerialNumber => 'åºåˆ—å·',
+
+ General => '概况',
+ Details => '游æˆç»†èŠ‚',
+ Tips => 'å°æŠ€å·§',
+ Information => 'ä¿¡æ¯',
+
+ FilterRatingSelect => '评价至少到(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm
new file mode 100644
index 0000000..299e46e
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCgeneric.pm
@@ -0,0 +1,44 @@
+{
+ package GCLang::ZH_CN::GCModels::GCgeneric;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ Items => {0 => '项',
+ 1 => '项',
+ X => '项目',
+ lowercase1 => '项',
+ lowercaseX => '项'
+ },
+ NewItem => '新项',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm
new file mode 100644
index 0000000..3fabc3c
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCminicars.pm
@@ -0,0 +1,182 @@
+{
+ package GCLang::ZH_CN::GCModels::GCminicars;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'å°è½¦æ”¶è—',
+ Items => {0 => '辆汽车',
+ 1 => '辆汽车',
+ X => '汽车',
+ lowercase1 => '辆汽车',
+ lowercaseX => '汽车'
+ },
+ NewItem => '新汽车',
+ Currency => '通用性',
+
+# Main fields
+
+ Main => '主è¦ä¿¡æ¯',
+
+ Name => 'å称',
+ Exchange => '待售或待æ¢',
+ Wanted => '需è¦',
+ Rating1 => '主评价',
+ Picture1 => '主图片',
+ Scale => '尺寸',
+ Manufacturer => '制造商',
+ Constructor => '设计师',
+ Type1 => '类型',
+ Modele => 'åž‹å·',
+ Version => '版本',
+ Color => 'åž‹å·é¢œè‰²',
+ Pub => '广告',
+ Year => '年份',
+ Reference => 'å‚考',
+ Kit => '工具列表',
+ Transformation => '个性å˜åŒ–',
+ Comments1 => '注释',
+
+# Details fields
+
+ Details => '详细',
+
+ MiscCharacteristics => '多方é¢ç‰¹æ€§',
+ Material => 'ææ–™',
+ Molding => '模制',
+ Condition => '状æ€',
+ Edition => '版本',
+ Collectiontype => '收集å称',
+ Serial => '系列',
+ Serialnumber => 'åºåˆ—å·',
+ Designed => '设计日期',
+ Madein => '制造日期',
+ Box1 => 'Boxç§ç±»',
+ Box2 => 'Boxæè¿°',
+ Containbox => 'Box内容',
+ Rating2 => '实用',
+ Rating3 => '完美',
+ Acquisition => '获得日期',
+ Location => '获得地点',
+ Buyprice => '获得价格',
+ Estimate => 'ä¼°ä»·',
+ Comments2 => '评论',
+ Decorationset => '装饰',
+ Characters => '性质',
+ CarFromFilm => '电影汽车',
+ Filmcar => '与汽车相关电影',
+ Filmpart => '电影部/集',
+ Parts => 'æ•°ç›®',
+ VehiculeDetails => '详细',
+ Detailsparts => '细节部分',
+ Detailsdecorations => '装饰ç§ç±»',
+ Decorations => '装饰数é‡',
+ Lwh => '长/宽/高',
+ Weight => 'é‡é‡',
+ Framecar => '底盘',
+ Bodycar => '车身',
+ Colormirror => 'åž‹å·é¢œè‰²',
+ Interior => '内部',
+ Wheels => '车轮',
+ Registrationnumber1 => 'å‰æ–¹æ³¨å†Œå·',
+ Registrationnumber2 => 'åŽéƒ¨æ³¨å†Œå·',
+ RacingCar => '赛车',
+ Course => '比赛',
+ Courselocation => '比赛地点',
+ Courseyear => '比赛日期',
+ Team => '团队',
+ Pilots => '赛车手',
+ Copilots => '副驾',
+ Carnumber => '车å·',
+ Pub2 => '广告商',
+ Finishline => '完美等级',
+ Steeringwheel => 'æ–¹å‘盘ä½ç½®',
+
+
+# Catalogs fields
+
+ Catalogs => '目录',
+
+ OfficialPicture => '官方图片',
+ Barcode => 'æ¡å½¢ç ',
+ Referencemirror => 'å‚考',
+ Year3 => 'å¯å¾—日期',
+ CatalogCoverPicture => 'å°é¢',
+ CatalogPagePicture => '页数',
+ Catalogyear => '目录年份',
+ Catalogedition => '目录版本',
+ Catalogpage => '目录页数',
+ Catalogprice => '目录价格',
+ Personalref => '个人å‚考',
+ Websitem => '汽车制造商网站',
+ Websitec => '实际制造商网站',
+ Websiteo => '有用链接',
+ Comments3 => '注释',
+
+# Pictures fields
+
+ Pictures => '图片',
+
+ OthersComments => '总评分',
+ OthersDetails => '其它细节',
+ Top1 => '上',
+ Back1 => '下',
+ AVG => 'å·¦å‰',
+ AV => 'å‰',
+ AVD => 'å³å‰',
+ G => 'å·¦',
+ BOX => 'Box',
+ D => 'å³',
+ ARG => 'å·¦åŽ',
+ AR => 'åŽ',
+ ARD => 'å³åŽ',
+ Others => 'æ‚项',
+
+# PanelLending fields
+
+ LendingExplanation => '临时展览中的有用交æ¢',
+ PanelLending => '租借(展览用)',
+ Comments4 => '注释',
+
+# Realmodel fields
+
+ Realmodel => '真实汽车',
+
+ Difference => '与å°å›¾çš„ä¸åŒ',
+ Front2 => 'å‰',
+ Back2 => 'åŽ',
+ Comments5 => '注释',
+
+ References => 'å‚考',
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm
new file mode 100644
index 0000000..f6f67ff
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCmusics.pm
@@ -0,0 +1,68 @@
+{
+ package GCLang::ZH_CN::GCModels::GCmusics;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '音ä¹æ”¶è—',
+ Items => {0 => '张专辑',
+ 1 => '张专辑',
+ X => '专辑'},
+ NewItem => '新专辑',
+
+ Unique => 'ISRC/EAN',
+ Title => '标题',
+ Cover => 'å°é¢',
+ Artist => '艺术家',
+ Format => 'æ ¼å¼',
+ Running => '播放时间',
+ Release => 'å‘布日期',
+ Genre => '类型',
+ Origin => '原始作å“',
+
+#For tracks list
+ Tracks => '曲目列表',
+ Number => 'ç¼–å·',
+ Track => '标题',
+ Time => '时间',
+
+ Composer => '作曲家',
+ Producer => '制作人',
+ Playlist => '播放列表',
+ Comments => '评论',
+ Label => '标签',
+ Url => '网页',
+
+ General => '一般',
+ Details => '专辑细节',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm
new file mode 100644
index 0000000..4397183
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCperiodicals.pm
@@ -0,0 +1,55 @@
+{
+ package GCLang::ZH_CN::GCModels::GCperiodicals;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '期刊收è—',
+ Items => {0 => '期刊',
+ 1 => '本期刊',
+ X => '期刊',
+ lowercase1 => '本期刊',
+ lowercaseX => '期刊'
+ },
+ NewItem => '新期刊',
+
+ Title => 'å称',
+ Cover => 'å°é¢',
+ Periodical => '周期',
+ Number => 'æ•°',
+ Date => '日期',
+ Subject => '主题',
+ Articles => '文章',
+
+ General => '一般',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm
new file mode 100644
index 0000000..f46b0e8
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsmartcards.pm
@@ -0,0 +1,108 @@
+{
+ package GCLang::ZH_CN::GCModels::GCsmartcards;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '智能å¡æ”¶è—',
+ Items => {0 => '张智能å¡',
+ 1 => '张智能å¡',
+ X => '智能å¡'},
+ NewItem => '新智能å¡',
+ Currency => '通用',
+
+ Help => '字段帮助',
+ Help1 => '帮助',
+
+# Traduction des Champs "Main"
+
+ Main => '智能å¡',
+
+ Cover => '图片',
+
+ Name => 'å称',
+ Exchange => 'å°†å–出或交æ¢',
+ Wanted => '需è¦',
+ Rating1 => '总体需求',
+ TheSmartCard => '智能å¡,å‰/åŽ',
+
+ Country => '国家',
+ Color => '颜色',
+ Type1 => 'å¡ç±»åž‹',
+ Type2 => '芯片类型',
+ Dimension => '长/宽/厚',
+
+ Box => 'ç›’',
+ Chip => '芯片',
+ Year1 => '版本年份',
+ Year2 => '有效年份',
+ Condition => '状æ€',
+ Charge => 'å¯å……电å¡',
+ Variety => 'å˜ç§',
+
+ Edition => 'æ ·å“æ•°ç›®',
+ Serial => 'åºåˆ—å·',
+ Theme => '主题',
+
+ Acquisition => '获得',
+
+ Catalog0 => '目录',
+ Catalog1 => 'Phonecote / Infopuce (YT)',
+ Catalog2 => 'La Cote en Poche',
+
+ Reference0 => 'å‚考',
+ Reference1 => 'Phonecote / Infopuce (YT)å‚考',
+ Reference2 => 'La Cote en Pocheå‚考',
+ Reference3 => '其它å‚考',
+
+ Quotationnew00 => 'æ–°å¡æŠ¥ä»·',
+ Quotationnew10 => 'Phonecote / Infopuce (YT)报价',
+ Quotationnew20 => 'La Cote en Poche报价',
+ Quotationnew30 => 'Cotation Autre',
+ Quotationold00 => '二手å¡æŠ¥ä»·',
+ Quotationold10 => 'Phonecote / Infopuce (YT)报价',
+ Quotationold20 => 'La Cote en Poche报价',
+ Quotationold30 => '其它报价',
+
+ Title1 => 'å称',
+
+ Unit => 'å•å…ƒ/微粒数',
+
+ Pressed => '压模类型',
+ Location => '压模地点',
+
+ Comments1 => '注释',
+
+ Others => 'æ‚项',
+ Weight => 'é‡é‡',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm
new file mode 100644
index 0000000..6302fd4
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCsoftware.pm
@@ -0,0 +1,84 @@
+{
+ package GCLang::ZH_CN::GCModels::GCsoftware;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '计算机软件收è—',
+ Items => {0 => '个软件',
+ 1 => '个软件',
+ X => '软件',
+ lowercase1 => '个软件',
+ lowercaseX => '软件'},
+ NewItem => '新软件',
+
+ Id => 'Id',
+ Ean => 'EAN',
+ Name => 'å称',
+ Platform => 'å¹³å°',
+ Released => 'å‘布日期',
+ Homepage => '主页',
+ Editor => '编辑',
+ Developer => 'å¼€å‘人员',
+ Category => '类型',
+ NumberOfCopies => '个数',
+ Price => 'ä»·æ ¼',
+ Box => '盒装图片',
+ Case => '例å­',
+ Manual => 'æ“作指å—',
+ Executable => 'å¯æ‰§è¡Œ',
+ Description => 'æè¿°',
+ License => '版æƒ',
+ Commercial => '商业软件',
+ FreewareNoncommercial => 'å…费软件',
+ OtherOpenSource => '其它开æºè½¯ä»¶',
+ PublicDomain => '公共软件',
+ OtherLicense => '其它',
+ Registration => '注册',
+ RegistrationInfo => '注册信æ¯',
+ RegInfo => '注册信æ¯',
+ RegistrationName => '用户å',
+ RegistrationNumber => '注册å·',
+ PanelRegistration => '注册信æ¯',
+ RegistrationComments => '添加信æ¯æˆ–注释',
+ Screenshots => '截图',
+ Screenshot1 => '截图1',
+ Screenshot2 => '截图2',
+ Comments => '注释',
+ Url => '网页',
+ General => '一般',
+ Details => '详细',
+ Information => 'ä¿¡æ¯',
+
+ FilterRatingSelect => '评价至少(_L)...',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm
new file mode 100644
index 0000000..294adac
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCstamps.pm
@@ -0,0 +1,192 @@
+{
+ package GCLang::ZH_CN::GCModels::GCstamps;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => '邮票收è—',
+ Items => {0 => '邮票',
+ 1 => '张邮票',
+ X => '邮票',
+ lowercase1 => '张邮票',
+ lowercaseX => '邮票'
+ },
+ NewItem => '新邮票',
+
+ General => '一般',
+ Detail => '详细',
+ Value => '价值',
+ Notes => '笔记',
+ Views => '观察',
+
+ Name => 'å称',
+ Country => '国家',
+ Year => '年份',
+ Catalog => '类型',
+ Number => 'æ•°ç›®',
+ Topic => '主题',
+ Serie => '系列',
+ Designer => '设计者',
+ Engraver => '雕刻师',
+ Type => '类型',
+ Format => 'å½¢å¼',
+ Description => 'æè¿°',
+ Color => '颜色',
+ Gum => '背胶',
+ Paper => '纸张',
+ Perforation => 'ç©¿å­”',
+ PerforationSize => '穿孔大å°',
+ CancellationType => '注销戳类型',
+ Comments => '注释',
+ PrintingVariety => 'å°åˆ·å˜ç§',
+ IssueDate => 'å‘行日期',
+ EndOfIssue => '结æŸå‘è¡Œ',
+ Issue => 'å‘è¡Œ',
+ Grade => '分级',
+ Status => '状æ€',
+ Adjusted => '调整',
+ Cancellation => '注销戳',
+ CancellationCondition => '注销戳情况',
+ GumCondition => '背胶情况',
+ PerforationCondition => '穿孔情况',
+ ConditionNotes => '状æ€ç¬”è®°',
+ Error => '错误',
+ ErrorNotes => '错误记录',
+ FaceValue => 'é¢å€¼',
+ MintValue => '制造值',
+ UsedValue => '使用值',
+ PurchasedDate => '购买日期',
+ Quantity => 'æ•°é‡',
+ History => '历å²',
+ Picture1 => '图片1',
+ Picture2 => '图片2',
+ Picture3 => '图片3',
+
+ AirMail => '航空邮件',
+ MilitaryStamp => '军邮',
+ Official => '公务邮件',
+ PostageDue => '应付邮资类',
+ Regular => '常规',
+ Revenue => '税收',
+ SpecialDelivery => '特别投递',
+ StrikeStamp => '罢工邮票',
+ TelegraphStamp => '电报邮票',
+ WarStamp => '战争邮票',
+ WarTaxStamp => '战争税邮票',
+
+ Booklet => 'å°åž‹å¼ ',
+ BookletPane => 'å•å¼ å°åž‹å¼ ',
+ Card => '明信片',
+ Coil => 'å·çŠ¶',
+ Envelope => 'ä¿¡å°',
+ FirstDayCover => '首日å°',
+ Sheet => 'è”å¼ ',
+ Single => 'å•å¼ ',
+
+ Heliogravure => '凹版照相',
+ Lithography => '平版',
+ Offset => '胶å°',
+ Photogravure => '凹版å°åˆ·',
+ RecessPrinting => '凹å£å°åˆ·',
+ Typography => '凸版å°åˆ·',
+
+ OriginalGum => '原始背胶',
+ Ungummed => '无胶',
+ Regummed => 'åŽåŠ èƒŒèƒ¶',
+
+ Chalky => '粉笔状',
+ ChinaPaper => '瓷器般的',
+ Coarsed => 'ç²—ç³™',
+ Glossy => '有光泽的',
+ Granite => '花岗岩状',
+ Laid => 'Laid纸',
+ Manila => '马尼拉纸',
+ Native => '本地纸',
+ Pelure => 'Pelure纸',
+ Quadrille => 'Quadrille纸',
+ Ribbed => '棱纹纸',
+ Rice => '宣纸',
+ Silk => 'ä¸çº¸',
+ Smoothed => '光滑的',
+ Thick => '厚',
+ Thin => 'è–„',
+ Wove => '布纹纸',
+
+ CoarsedPerforation => '粗糙穿孔',
+ CombPerforation => '梳状穿孔',
+ CompoundPerforation => 'æ··åˆç©¿å­”',
+ DamagedPerforation => 'ç ´å了的穿孔',
+ DoublePerforation => 'åŒå­”',
+ HarrowPerforation => '耙状孔',
+ LinePerforation => '线孔',
+ NoPerforation => 'æ— å­”',
+
+ CancellationToOrder => 'æ•´ç†æ³¨é”€æˆ³',
+ FancyCancellation => '精致注销戳',
+ FirstDayCancellation => '首日戳',
+ NumeralCancellation => '数字戳',
+ PenMarked => '笔戳',
+ RailroadCancellation => 'é“路戳',
+ SpecialCancellation => '特殊戳',
+
+ Superb => 'åŽä¸½',
+ ExtraFine => 'æžç²¾è‡´',
+ VeryFine => 'éžå¸¸ç²¾è‡´',
+ FineVeryFine => '精致/很精致',
+ Fine => '精致',
+ Average => '一般',
+ Poor => 'å·®',
+
+ Owned => 'æŒæœ‰è€…',
+ Ordered => '已排åº',
+ Sold => '已售',
+ ToSell => 'å¾…å”®',
+ Wanted => '需è¦',
+
+ LightCancellation => '轻戳',
+ HeavyCancellation => 'é‡æˆ³',
+ ModerateCancellation => '中等戳',
+
+ MintNeverHinged => '未铰',
+ MintLightHinged => '轻铰',
+ HingedRemnant => '残余铰',
+ HeavilyHinged => 'é‡é“°',
+ LargePartOriginalGum => '大é¢ç§¯åŽŸå§‹èƒ¶',
+ SmallPartOriginalGum => 'å°é¢ç§¯åŽŸå§‹èƒ¶',
+ NoGum => '无胶',
+
+ Perfect => '完美',
+ VeryNice => 'éžå¸¸å¥½',
+ Nice => '好',
+ Incomplete => 'ä¸å®Œæ•´',
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm b/lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm
new file mode 100644
index 0000000..536c543
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCModels/GCwines.pm
@@ -0,0 +1,65 @@
+{
+ package GCLang::ZH_CN::GCModels::GCwines;
+
+ use utf8;
+
+# Copyright 2007 Yves Martin
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ CollectionDescription => 'è‘¡è„酒收è—',
+ Items => {0 => '瓶葡è„é…’',
+ 1 => '瓶葡è„é…’',
+ X => 'è‘¡è„é…’'},
+ NewItem => 'æ–°çš„è‘¡è„é…’',
+
+ Name => 'å称',
+ Designation => '称呼',
+ Vintage => '制造年份',
+ Vineyard => '酿造地',
+ Type => 'ç§ç±»',
+ Grapes => 'è‘¡è„å“ç§',
+ Soil => '土壤类型',
+ Producer => '制造者',
+ Country => '国家',
+ Volume => '容é‡(毫å‡)',
+ Alcohol => '酒精浓度(%)',
+ Medal => '奖章',
+
+ Storage => '储存',
+ Location => 'ä½ç½®',
+ ShelfIndex => '架上索引',
+ Quantity => 'æ•°é‡',
+ Acquisition => '获得',
+ PurchaseDate => '进货日期',
+ PurchasePrice => '进货价格',
+ Gift => 'èµ å“',
+ BottleLabel => '瓶上的标签',
+ Website => '网路上的å‚考资料',
+
+ Tasted => 'å·²å“å°',
+ Comments => '评论',
+ Serving => 'æœåŠ¡',
+ TastingField => 'èµå‘³ç¬”è®°',
+
+ General => '一般',
+ Details => '细节',
+ Tasting => 'èµå‘³',
+
+ TastedNo => '未å“å°è¿‡',
+ TastedYes => 'å·²å“å°',
+
+ FilterRange => '范围',
+ FilterTastedNo => '还没å“å°(_N)',
+ FilterTastedYes => 'å·²ç»å“å°è¿‡äº†ï¼ˆ_t)',
+ FilterRatingSelect => '评价至少到(_l)...'
+
+ );
+}
+
+1;
diff --git a/lib/gcstar/GCLang/ZH_CN/GCstar.pm b/lib/gcstar/GCLang/ZH_CN/GCstar.pm
new file mode 100644
index 0000000..9346a51
--- /dev/null
+++ b/lib/gcstar/GCLang/ZH_CN/GCstar.pm
@@ -0,0 +1,653 @@
+{
+ package GCLang::ZH_CN;
+
+ use utf8;
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+ use strict;
+ use base 'Exporter';
+
+ our @EXPORT = qw(%lang);
+
+ our %lang = (
+
+ 'LangName' => '中文(简体)',
+
+ 'Separator' => ': ',
+
+ 'Warning' => '<b>警告</b>:
+
+é€è¿‡æ’件从网站上下载的资讯<b>ä»…é™æ–¼ä¸ªäººä½¿ç”¨</b>。
+
+没有<b>获å–é¢å¤–授æƒ</b>的任何二次转å‘行为都是éžæ³•çš„。
+
+若想确认哪个网站拥有这些资讯,您å¯ä»¥ä½¿ç”¨<b>项目细节下的按钮</b>。',
+
+ 'AllItemsFiltered' => '没有{X}匹é…过滤器è¦æ±‚',
+
+#Installation
+ 'InstallDirInfo' => '安装到',
+ 'InstallMandatory' => 'å¿…è¦ç»„件',
+ 'InstallOptional' => 'å¯é€‰ç»„件',
+ 'InstallErrorMissing' => '错误:以下Perl组件必须被安装:',
+ 'InstallPrompt' => '安装的根目录[/usr/local]: ',
+ 'InstallEnd' => '安装完毕',
+ 'InstallNoError' => '没有错误',
+ 'InstallLaunch' => '想使用这个应用程åºï¼Œè¯·ç‚¹å‡»ä¸€ä¸‹',
+ 'InstallDirectory' => '安装目录',
+ 'InstallTitle' => 'GCstar 安装程åº',
+ 'InstallDependencies' => 'ä¾èµ–组件',
+ 'InstallPath' => '路径',
+ 'InstallOptions' => '选项',
+ 'InstallSelectDirectory' => '选择安装目录',
+ 'InstallWithClean' => '删除安装目录中的文件',
+ 'InstallWithMenu' => 'å°†GCstar添加到应用程åºèœå•',
+ 'InstallNoPermission' => '错误:您没有写入指定目录的æƒé™',
+ 'InstallMissingMandatory' => 'å¿…è¦ä¾èµ–组件ä¸å­˜åœ¨ã€‚在获å–这些组件å‰ï¼Œæ‚¨ä¸èƒ½å¤Ÿå®‰è£…GCstar。',
+ 'InstallMissingOptional' => '部份选择ä¾èµ–组件ä¸å­˜åœ¨ã€‚详细列表显示于下。 GCstar或许å¯ä»¥å®‰è£…,但部份功能将会失效。',
+ 'InstallMissingNone' => '没有任何ä¾èµ–问题,您å¯ä»¥ç»§ç»­å¹¶å®‰è£…GCstar',
+ 'InstallOK' => '完æˆ',
+ 'InstallMissing' => 'ä¸å­˜åœ¨',
+ 'InstallMissingFor' => 'ä¸å­˜åœ¨',
+ 'InstallCleanDirectory' => '删除目录中的GCstar文件:',
+ 'InstallCopyDirectory' => '将文件å¤åˆ¶åˆ°ç›®å½•ï¼š',
+ 'InstallCopyDesktop' => 'å¤åˆ¶æ¡Œé¢æ–‡ä»¶ï¼š',
+
+#Update
+ 'UpdateUseProxy' => '使用代ç†(如果没有使用代ç†ç›´æŽ¥æŒ‰ä¸‹ENTER):',
+ 'UpdateNoPermission' => '这个目录没有写入æƒé™ï¼š',
+ 'UpdateNone' => '没有å‘现更新',
+ 'UpdateFileNotFound' => '文件ä¸å­˜åœ¨',
+
+#Splash
+ 'SplashInit' => 'åˆå§‹åŒ–',
+ 'SplashLoad' => '加载收è—',
+ 'SplashDisplay' => '正在显示收è—',
+ 'SplashSort' => '排åºæ”¶è—',
+ 'SplashDone' => '准备完æˆ',
+
+#Import from GCfilms
+ 'GCfilmsImportQuestion' => '您似乎以å‰ç”¨è¿‡GCfilms,您想è¦å¯¼å…¥GCfilms资料到GCstar中å—(è¿™ä¸ä¼šç ´å您的GCfilms资料)?',
+ 'GCfilmsImportOptions' => '设置',
+ 'GCfilmsImportData' => '电影列表',
+
+#Menus
+ 'MenuFile' => '文件(_F)',
+ 'MenuNewList' => '新收è—(_N)',
+ 'MenuStats' => '统计',
+ 'MenuHistory' => '最近使用的收è—(_R)',
+ 'MenuLend' => '显示被借走的东西(_B)',
+ 'MenuImport' => '导入(_I)',
+ 'MenuExport' => '导出(_E)',
+ 'MenuAddItem' => '添加{1}(_A)', # Accepts model codes
+
+ 'MenuEdit' => '编辑(_E)',
+ 'MenuDuplicate' => 'å¤åˆ¶{1}(_p)',
+ 'MenuDuplicatePlural' => 'å¤åˆ¶{X}(_p)',
+ 'MenuEditSelectAllItems' => '选择所有{X}(_A)', # Accepts model codes
+ 'MenuEditDeleteCurrent' => '删除{1}(_R)',
+ 'MenuEditDeleteCurrentPlural' => '删除{X}(_R)',
+ 'MenuEditFields' => 'å˜æ›´æ”¶è—字段(_C)',
+ 'MenuEditLockItems' => 'é”定收è—(_L)',
+
+ 'MenuDisplay' => '过滤器(_i)',
+ 'MenuSavedSearches' => 'ä¿å­˜æœç´¢',
+ 'MenuSavedSearchesSave' => 'ä¿å­˜å½“å‰æœç´¢',
+ 'MenuSavedSearchesEdit' => 'å˜æ›´å·²ç»ä¿å­˜çš„æœç´¢',
+ 'MenuAdvancedSearch' => '高级æœç´¢(_d)',
+ 'MenuViewAllItems' => '显示全部{X}(_A)',
+ 'MenuNoFilter' => '全部(_A)',
+
+ 'MenuConfiguration' => '设置(_S)',
+ 'MenuDisplayMenu' => 'Display',
+ 'MenuDisplayFullScreen' => 'Full screen',
+ 'MenuDisplayMenuBar' => 'Menus',
+ 'MenuDisplayToolBar' => 'Toolbar',
+ 'MenuDisplayStatusBar' => 'Bottom bar',
+ 'MenuDisplayOptions' => '显示信æ¯(_D)',
+ 'MenuBorrowers' => '出借对象(_B)',
+ 'MenuToolbarConfiguration' => '工具æ æŽ§åˆ¶(_T)',
+ 'MenuDefaultValues' => 'Default values for new item', # Accepts model codes
+ 'MenuGenresConversion' => '类型转æ¢(_C)',
+
+ 'MenuBookmarks' => '我的收è—(_C)',
+ 'MenuBookmarksAdd' => '添加到当å‰æ”¶è—(_A)',
+ 'MenuBookmarksEdit' => '编辑添加到书签的收è—(_E)',
+
+ 'MenuHelp' => '帮助(_H)',
+ 'MenuHelpContent' => '内容(_C)',
+ 'MenuAllPlugins' => '查看æ’件(_P)',
+ 'MenuBugReport' => '报告问题',
+ 'MenuAbout' => '关于GCstar(_A)',
+
+ 'MenuNewWindow' => '在新窗å£ä¸­æ˜¾ç¤º{1}(_N)',
+ 'MenuNewWindowPlural' => '在新窗å£ä¸­æ˜¾ç¤º{X}(_N)',
+
+ 'ContextExpandAll' => '展开全部',
+ 'ContextCollapseAll' => '折å å…¨éƒ¨',
+ 'ContextChooseImage' => '选择图片(_I)',
+ 'ContextOpenWith' => '用指定程åºæ‰“å¼€(_h)...',
+ 'ContextImageEditor' => '图åƒç¼–辑器',
+ 'ContextImgFront' => 'å°é¢',
+ 'ContextImgBack' => 'å°åº•',
+ 'ContextChooseFile' => '请选择è¦ä½¿ç”¨çš„文件',
+ 'ContextChooseFolder' => '选择一个目录',
+
+ 'DialogEnterNumber' => '请输入数值',
+
+ 'RemoveConfirm' => '您确定è¦åˆ é™¤è¿™ä¸ª{X}?',
+ 'RemoveConfirmPlural' => '您确定è¦åˆ é™¤è¿™ä¸ª{X}?',
+ 'DefaultNewItem' => 'æ–°{X}',
+ 'NewItemTooltip' => '添加一个新{1}',
+ 'NoItemFound' => '没有å‘现,想è¦æœç´¢å…¶ä»–站点å—?',
+ 'OpenList' => '请选择收è—',
+ 'SaveList' => '请选择è¦å°†è¿™ä¸ªæ”¶è—ä¿å­˜åœ¨å“ªé‡Œï¼Ÿ',
+ 'SaveListTooltip' => 'ä¿å­˜å½“å‰çš„收è—',
+ 'SaveUnsavedChanges' => '您收è—中的å˜æ›´è¿˜æœªä¿å­˜ï¼ŒçŽ°åœ¨ä¿å­˜å—?',
+ 'SaveDontSave' => 'ä¸ä¿å­˜',
+ 'PreferencesTooltip' => '设置',
+ 'ViewTooltip' => '改å˜æ”¶è—显示',
+ 'PlayTooltip' => '针对{1}å¯åŠ¨æ–‡ä»¶å…³è”',
+ 'PlayFileNotFound' => '在指定ä½ç½®ä¸Šæ²¡æœ‰å‘现目标文件:',
+ 'PlayRetry' => 'é‡è¯•',
+
+ 'StatusSave' => 'ä¿å­˜ä¸­...',
+ 'StatusLoad' => '载入中...',
+ 'StatusSearch' => 'æœç´¢æ­£åœ¨è¿›è¡Œ...',
+ 'StatusGetInfo' => 'å–得资讯...',
+ 'StatusGetImage' => 'å–得图片...',
+
+ 'SaveError' => 'ä¸èƒ½ä¿å­˜é¡¹ç›®åˆ—表,请检查文件存å–æƒé™ä¸Žå‰©ä½™è½¯ç›˜ç©ºé—´ã€‚',
+ 'OpenError' => 'ä¸èƒ½å¼€å¯é¡¹ç›®åˆ—表,请检查文件存å–æƒé™ã€‚',
+ 'OpenFormatError' => 'ä¸èƒ½å¼€å¯é¡¹ç›®åˆ—表,因为文件格å¼ä¸æ­£ç¡®ã€‚',
+ 'OpenVersionWarning' => '本收è—由更新版本的GCstar建立。如果您ä¿å­˜ï¼Œæ‚¨å¯èƒ½ä¼šå¤±åŽ»æŸäº›ä¿¡æ¯ã€‚',
+ 'OpenVersionQuestion' => '您ä¾ç„¶æƒ³ç»§ç»­å—?',
+ 'ImageError' => '选择ä¿å­˜å›¾ç‰‡çš„目录ä¸æ­£ç¡®ï¼Œè¯·é€‰æ‹©å¦ä¸€ä¸ªã€‚',
+ 'OptionsCreationError'=> 'ä¸èƒ½å»ºç«‹è®¾ç½®æ¡£ã€‚',
+ 'OptionsOpenError'=> 'ä¸èƒ½æ‰“开设置档:',
+ 'OptionsSaveError'=> 'ä¸èƒ½ä¿å­˜è®¾ç½®æ¡£ï¼š',
+ 'ErrorModelNotFound' => '未å‘现模å—:',
+ 'ErrorModelUserDir' => '使用者定义模å—在:',
+
+ 'RandomTooltip' => '今天晚上看什么?',
+ 'RandomError'=> '没有{X}å¯ä¾›é€‰æ‹©',
+ 'RandomEnd'=> '没有更多{X}',
+ 'RandomNextTip'=> '下一个建议',
+ 'RandomOkTip'=> '接å—这个建议',
+
+ 'AboutTitle' => '关于GCstar',
+ 'AboutDesc' => '个人收è—å“管ç†å™¨',
+ 'AboutVersion' => '版本',
+ 'AboutTeam' => '团队',
+ 'AboutWho' => 'Christian Jodar (Tian): 项目管ç†, 程åºå‘˜
+Nyall Dawson (Zombiepig): 程åºå‘˜
+TPF: 程åºå‘˜
+Adolfo González: 程åºå‘˜
+',
+ 'AboutLicense' => '以GNU GPL授æƒå‘佈
+Logos Copyright le Spektre',
+ 'AboutTranslation' => '简体中文翻译由白文斯密制作',
+ 'AboutDesign' => 'Åukasz Kowalczk (Qoolman): 皮肤设计
+Logo和网络设计: le Spektre',
+
+ 'UnsavedCollection' => '未ä¿å­˜çš„收è—',
+ 'ModelsSelect' => '选择一个收è—类型',
+ 'ModelsPersonal' => '个人模å—',
+ 'ModelsDefault' => '默认模å—',
+ 'ModelsList' => '收è—定义',
+ 'ModelSettings' => '收è—设置',
+ 'ModelNewType' => '新的收è—类型',
+ 'ModelName' => '收è—类型的å字:',
+ 'ModelFields' => '字段',
+ 'ModelOptions' => '选项',
+ 'ModelFilters' => '过滤器',
+ 'ModelNewField' => '新字段',
+ 'ModelFieldInformation' => '资讯',
+ 'ModelFieldName' => '字段å称:',
+ 'ModelFieldType' => '类型:',
+ 'ModelFieldGroup' => '组別:',
+ 'ModelFieldValues' => '值',
+ 'ModelFieldInit' => '默认:',
+ 'ModelFieldMin' => '最å°ï¼š',
+ 'ModelFieldMax' => '最大:',
+ 'ModelFieldList' => '列表:',
+ 'ModelFieldListLegend' => '<i>用åŠè§’逗å·åˆ†éš”</i>',
+ 'ModelFieldDisplayAs' => '显示æˆï¼š',
+ 'ModelFieldDisplayAsText' => '文字',
+ 'ModelFieldDisplayAsGraphical' => '评分æ¡',
+ 'ModelFieldTypeShortText' => '短文字',
+ 'ModelFieldTypeLongText' => '长文字',
+ 'ModelFieldTypeYesNo' => '布尔值',
+ 'ModelFieldTypeNumber' => 'æ•°å­—',
+ 'ModelFieldTypeDate' => '日期',
+ 'ModelFieldTypeOptions' => '预定义选择列表',
+ 'ModelFieldTypeImage' => '图片',
+ 'ModelFieldTypeSingleList' => '简表',
+ 'ModelFieldTypeFile' => '文件',
+ 'ModelFieldTypeFormatted' => 'ä¾èµ–其他字段',
+ 'ModelFieldParameters' => 'å˜é‡',
+ 'ModelFieldHasHistory' => '使用历å²ä¿¡æ¯',
+ 'ModelFieldFlat' => 'å•è¡Œæ˜¾ç¤º',
+ 'ModelFieldStep' => '步长:',
+ 'ModelFieldFileFormat' => '文件格å¼ï¼š',
+ 'ModelFieldFileFile' => '一般文件',
+ 'ModelFieldFileImage' => '图片',
+ 'ModelFieldFileVideo' => '影片',
+ 'ModelFieldFileAudio' => '音频',
+ 'ModelFieldFileProgram' => '程åº',
+ 'ModelFieldFileUrl' => '统一资æºå®šä¹‰ç¬¦(URL)',
+ 'ModelFieldFileEbook' => '电å­ä¹¦',
+ 'ModelOptionsFields' => '使用字段',
+ 'ModelOptionsFieldsAuto' => '自动',
+ 'ModelOptionsFieldsNone' => 'æ— ',
+ 'ModelOptionsFieldsTitle' => '作为标题',
+ 'ModelOptionsFieldsId' => '作为ID',
+ 'ModelOptionsFieldsCover' => '作为å°é¢',
+ 'ModelOptionsFieldsPlay' => '连接播放按钮',
+ 'ModelCollectionSettings' => '收è—设置',
+ 'ModelCollectionSettingsLending' => 'å¯è¢«å€Ÿå‡º',
+ 'ModelCollectionSettingsTagging' => 'å¯åŠ æ ‡ç­¾',
+ 'ModelFilterActivated' => '收录进æœç´¢æ¡†å†…',
+ 'ModelFilterComparison' => '比较',
+ 'ModelFilterContain' => 'å«æœ‰',
+ 'ModelFilterDoesNotContain' => '未å«æœ‰',
+ 'ModelFilterRegexp' => '正则表示å¼',
+ 'ModelFilterRange' => '范围',
+ 'ModelFilterNumeric' => '以数字比较',
+ 'ModelFilterQuick' => '建立一个快速过滤器',
+ 'ModelTooltipName' => '建立å字以供其他收è—使用。如果空白,相关设置会直接ä¿å­˜åœ¨æ”¶è—里é¢ã€‚',
+ 'ModelTooltipLabel' => '用æ¥æ˜¾ç¤ºçš„字段å称',
+ 'ModelTooltipGroup' => '供字段的分组使用,ä¸è®¾ç½®ä¼šå°†å­—段归入默认分组',
+ 'ModelTooltipHistory' => '过去的输入值将会被建æˆåˆ—表供选择',
+ 'ModelTooltipFormat' => 'æ ¼å¼å°†ä¼šå†³å®šæ’­æ”¾æŒ‰é’®å…³è”到什么程åº',
+ 'ModelTooltipLending' => '这会在收è—里添加一些字段æ¥ç®¡ç†å€Ÿå‡ºèµ„讯',
+ 'ModelTooltipTagging' => '这会添加一些字段æ¥ç®¡ç†æ ‡ç­¾',
+ 'ModelTooltipNumeric' => '这个值将会被当作数字æ¥æ¯”较',
+ 'ModelTooltipQuick' => '这将会在“过滤器â€ä¸‹æ·»åŠ ä¸€ä¸ªå­èœå•',
+
+ 'ResultsTitle' => '选择一个{X}',
+ 'ResultsNextTip' => 'æœç´¢ä¸‹ä¸€ä¸ªç½‘ç«™',
+ 'ResultsPreview' => '预览',
+ 'ResultsInfo' => '借由按ä½Ctrl或shift键,您å¯ä»¥æ·»åŠ å¤šä¸ªé¡¹ç›®åˆ°æ”¶è—中',
+
+ 'OptionsTitle' => '设置',
+ 'OptionsExpertMode' => '专家模å¼',
+ 'OptionsPrograms' => '对ä¸åŒç±»åž‹çš„文件用ä¸åŒçš„程åºå¼€å¯ï¼Œè‹¥ç•™ç™½åˆ™ä½¿ç”¨ç³»ç»Ÿé»˜è®¤å€¼',
+ 'OptionsBrowser' => '网页æµè§ˆå™¨',
+ 'OptionsPlayer' => '影片播放器',
+ 'OptionsAudio' => '音频播放器',
+ 'OptionsImageEditor' => '图åƒç¼–辑器',
+ 'OptionsCdDevice' => 'CD设备',
+ 'OptionsImages' => '图片目录',
+ 'OptionsUseRelativePaths' => '对图片使用相对路径',
+ 'OptionsLayout' => '窗å£å¸ƒå±€æ–¹å¼',
+ 'OptionsStatus' => '显示状æ€æ¡',
+ 'OptionsUseStars' => '使用星å·æ¥æ˜¾ç¤ºè¯„分',
+ 'OptionsWarning' => '警告:改å˜è¿™ä¸ªæ ‡ç­¾é¡µåŽå¿…é¡»è¦é‡å¯ç¨‹åºæ‰ä¼šç”Ÿæ•ˆã€‚',
+ 'OptionsRemoveConfirm' => '在项目删除å‰è¦æ±‚确认',
+ 'OptionsAutoSave' => '自动ä¿å­˜æ”¶è—',
+ 'OptionsAutoLoad' => '在å¯åŠ¨æ—¶è½½å…¥å…ˆå‰çš„收è—',
+ 'OptionsSplash' => '显示å¯åŠ¨ç”»é¢',
+ 'OptionsTearoffMenus' => 'å…许撕开èœå•',
+ 'OptionsSpellCheck' => '在长文字字段使用语法检查',
+ 'OptionsProgramTitle' => '选择使用的程åº',
+ 'OptionsPlugins' => '从哪些网站å–得项目资料',
+ 'OptionsAskPlugins' => '询问 (全部网站)',
+ 'OptionsPluginsMulti' => '多数网站',
+ 'OptionsPluginsMultiAsk' => '询问 (多数网站)',
+ 'OptionsPluginsMultiPerField' => '多个网站(æ¯ä¸ªå­—段)',
+ 'OptionsPluginsMultiPerFieldWindowTitle' => '多个网站的顺åº',
+ 'OptionsPluginsMultiPerFieldDesc' => 'æ¯ä¸ªå­—段将填入从左开始第一个éžç©ºä¿¡æ¯',
+ 'OptionsPluginsMultiPerFieldFirst' => '第一',
+ 'OptionsPluginsMultiPerFieldLast' => '最åŽ',
+ 'OptionsPluginsMultiPerFieldRemove' => '删除',
+ 'OptionsPluginsMultiPerFieldClearSelected' => '清空选择字段列表',
+ 'OptionsPluginsList' => '设置列表',
+ 'OptionsAskImport' => '选择字段æ¥æ±‡å…¥',
+ 'OptionsProxy' => '使用代ç†',
+ 'OptionsCookieJar' => '使用cookie jar文件',
+ 'OptionsLang' => '语言',
+ 'OptionsMain' => '主è¦',
+ 'OptionsPaths' => '路径',
+ 'OptionsInternet' => '网络',
+ 'OptionsConveniences' => '其他特å¾',
+ 'OptionsDisplay' => '显示',
+ 'OptionsToolbar' => '工具列',
+ 'OptionsToolbars' => {0 => 'æ— ', 1 => 'å°', 2 => '大', 3 => '系统设置'},
+ 'OptionsToolbarPosition' => 'ä½ç½®',
+ 'OptionsToolbarPositions' => {0 => '上', 1 => '下', 2 => 'å·¦', 3 => 'å³'},
+ 'OptionsExpandersMode' => '过长的文字',
+ 'OptionsExpandersModes' => {'asis' => 'ä¸ç®¡å®ƒ', 'cut' => '切断', 'wrap' => '自动æ¢è¡Œ'},
+ 'OptionsDateFormat' => '日期格å¼',
+ 'OptionsDateFormatTooltip' => '使用strftime(3)æ ¼å¼ï¼Œé»˜è®¤å€¼ä¸º%d/%m/%Y',
+ 'OptionsView' => '项目列表',
+ 'OptionsViews' => {0 => '文字', 1 => '图片', 2 => '细节'},
+ 'OptionsColumns' => 'æ ',
+ 'OptionsMailer' => '寄信程åº',
+ 'OptionsSMTP' => 'æœåŠ¡å™¨',
+ 'OptionsFrom' => '您的e-mail',
+ 'OptionsTransform' => '将冠è¯æ”¾åœ¨æ ‡é¢˜çš„末尾',
+ 'OptionsArticles' => '冠è¯(用逗点分开)',
+ 'OptionsSearchStop' => 'å…许æœç´¢è¢«æ”¾å¼ƒ',
+ 'OptionsBigPics' => '在å¯ä»¥çš„状况下使用大图片',
+ 'OptionsAlwaysOriginal' => '如果没有原始标题用主è¦æ ‡é¢˜ä»£æ›¿',
+ 'OptionsRestoreAccelerators' => 'æ¢å¤åŠ é€Ÿ',
+ 'OptionsHistory' => '历å²å¤§å°',
+ 'OptionsClearHistory' => '清除历å²',
+ 'OptionsStyle' => 'é¢æ¿',
+ 'OptionsDontAsk' => '別å†è¯¢é—®',
+ 'OptionsPathProgramsGroup' => '程åº',
+ 'OptionsProgramsSystem' => '使用系统定义的程åº',
+ 'OptionsProgramsUser' => 'å¤å†™é»˜è®¤çš„程åº',
+ 'OptionsProgramsSet' => '设置程åº',
+ 'OptionsPathImagesGroup' => '图片',
+ 'OptionsInternetDataGroup' => '资料汇入',
+ 'OptionsInternetSettingsGroup' => '设置',
+ 'OptionsDisplayInformationGroup' => 'ä¿¡æ¯æ˜¾ç¤ºæ–¹å¼',
+ 'OptionsDisplayArticlesGroup' => '冠è¯',
+ 'OptionsImagesDisplayGroup' => '显示',
+ 'OptionsImagesStyleGroup' => '风格',
+ 'OptionsDetailedPreferencesGroup' => '设置',
+ 'OptionsFeaturesConveniencesGroup' => '便利',
+ 'OptionsPicturesFormat' => '图片å‰ç¼€ï¼š',
+ 'OptionsPicturesFormatInternal' => 'gcstar__',
+ 'OptionsPicturesFormatTitle' => 'å…³è”项目的标题或åå­—',
+ 'OptionsPicturesWorkingDir' => '%WORKING_DIR% 或 . 被用æ¥ä»£æŒ‡æ”¶è—目录(在路径的开始处)',
+ 'OptionsPicturesFileBase' => '%FILE_BASE% 被用æ¥ä»£æŒ‡æ²¡æœ‰åŽç¼€çš„收è—æ¡£å(.gcs)',
+ 'OptionsPicturesWorkingDirError' => '%WORKING_DIR% åªèƒ½è¢«ç”¨åœ¨å›¾ç‰‡è·¯å¾„的开头',
+ 'OptionsConfigureMailers' => '设置邮件程åº',
+
+ 'ImagesOptionsButton' => '设置',
+ 'ImagesOptionsTitle' => '设置图片列表',
+ 'ImagesOptionsSelectColor' => '选择一个颜色',
+ 'ImagesOptionsUseOverlays' => '使用图åƒå±‚å ',
+ 'ImagesOptionsBg' => '背景',
+ 'ImagesOptionsBgPicture' => '使用背景图片',
+ 'ImagesOptionsFg'=> '选择',
+ 'ImagesOptionsBgTooltip' => '改å˜èƒŒæ™¯è‰²',
+ 'ImagesOptionsFgTooltip'=> '改å˜é€‰æ‹©é¢œè‰²',
+ 'ImagesOptionsResizeImgList' => '自动改å˜æ çš„æ•°å­—',
+ 'ImagesOptionsAnimateImgList' => 'Use animations',
+ 'ImagesOptionsSizeLabel' => '尺寸',
+ 'ImagesOptionsSizeList' => {0 => 'æžå°', 1 => 'å°', 2 => '中', 3 => '大', 4 => 'æžå¤§'},
+ 'ImagesOptionsSizeTooltip' => '选择图片尺寸',
+
+ 'DetailedOptionsTitle' => '设置细节列表',
+ 'DetailedOptionsImageSize' => '图片尺寸',
+ 'DetailedOptionsGroupItems' => '项目分组ä¾æ®',
+ 'DetailedOptionsSecondarySort' => '为å­å­—段排åº',
+ 'DetailedOptionsFields' => '选择显示字段',
+ 'DetailedOptionsGroupedFirst' => '将孤儿项目放在一起',
+ 'DetailedOptionsAddCount' => '显示类型中项目的数目',
+
+ 'ExtractButton' => 'ä¿¡æ¯',
+ 'ExtractTitle' => '文件信æ¯',
+ 'ExtractImport' => '使用值',
+
+ 'FieldsListOpen' => '从文件载入字段列表',
+ 'FieldsListSave' => 'ä¿å­˜å­—段列表到文件',
+ 'FieldsListError' => '这个字段列表ä¸èƒ½è¢«ç”¨åœ¨è¿™ä¸ªç±»åž‹çš„收è—上',
+ 'FieldsListIgnore' => '--- 忽略',
+
+ 'ExportTitle' => '汇出项目列表',
+ 'ExportFilter' => '仅汇出显示的项目',
+ 'ExportFieldsTitle' => '字段被汇出',
+ 'ExportFieldsTip' => '选择您想汇出的字段',
+ 'ExportWithPictures' => 'å¤åˆ¶å­ç›®å½•ä¸­çš„图片',
+ 'ExportSortBy' => '排åºä¾æ®',
+ 'ExportOrder' => '次åº',
+
+ 'ImportListTitle' => '汇入å¦ä¸€ä¸ªé¡¹ç›®åˆ—表',
+ 'ImportExportData' => '资料',
+ 'ImportExportFile' => '文件',
+ 'ImportExportFieldsUnused' => '未使用字段',
+ 'ImportExportFieldsUsed' => '使用字段',
+ 'ImportExportFieldsFill' => '添加全部',
+ 'ImportExportFieldsClear' => '删除全部',
+ 'ImportExportFieldsEmpty' => '您至少必须选择一个字段',
+ 'ImportExportFileEmpty' => '您必须指定一个文件å称',
+ 'ImportFieldsTitle' => 'è¦å¯¼å…¥çš„字段',
+ 'ImportFieldsTip' => '选择您想汇入的字段',
+ 'ImportNewList' => '建立一个新的收è—',
+ 'ImportCurrentList' => '添加到当å‰çš„收è—',
+ 'ImportDropError' => '至少有一个文件打开错误,将加载之å‰çš„列表。',
+ 'ImportGenerateId' => '对æ¯ä¸ªé¡¹ç›®äº§ç”ŸID',
+
+ 'FileChooserOpenFile' => '请选择è¦ä½¿ç”¨çš„文件',
+ 'FileChooserDirectory' => '目录',
+ 'FileChooserOpenDirectory' => '选择一个目录',
+ 'FileChooserOverwrite' => '这个文件已ç»å­˜åœ¨ï¼Œæ‚¨è¦è¦†ç›–它å—?',
+ 'FileAllFiles' => '所有文件',
+ 'FileVideoFiles' => '视频文件',
+ 'FileEbookFiles' => '电å­ä¹¦',
+ 'FileAudioFiles' => '音频文件',
+ 'FileGCstarFiles' => 'GCstar收è—',
+
+ #Some default panels
+ 'PanelCompact' => '简æ´',
+ 'PanelReadOnly' => 'åªè¯»',
+ 'PanelForm' => '分页',
+
+ 'PanelSearchButton' => '获å–资讯',
+ 'PanelSearchTip' => 'æœç´¢ç½‘路上关于这个å字的资讯',
+ 'PanelSearchContextChooseOne' => '选择一个网站...',
+ 'PanelSearchContextMultiSite' => '使用"多网站"',
+ 'PanelSearchContextMultiSitePerField' => '使用"æ¯ä¸ªå­—段多个网站"',
+ 'PanelSearchContextOptions' => '改å˜é€‰é¡¹...',
+ 'PanelImageTipOpen' => '点击图片以选择å¦ä¸€ä¸ªã€‚',
+ 'PanelImageTipView' => '点击图片æµè§ˆçœŸå®žå°ºå¯¸ã€‚',
+ 'PanelImageTipMenu' => ' 更多选择请按å³é”®',
+ 'PanelImageTitle' => '选择一张图片',
+ 'PanelImageNoImage' => '没有图片',
+ 'PanelSelectFileTitle' => '选择一个文件',
+ 'PanelLaunch' => '打开',
+ 'PanelRestoreDefault' => 'å¤åŽŸåˆ°é»˜è®¤å€¼',
+ 'PanelRefresh' => 'æ›´æ–°',
+ 'PanelRefreshTip' => '从网络上更新',
+
+ 'PanelFrom' =>'从',
+ 'PanelTo' =>'至',
+
+ 'PanelWeb' => 'æµè§ˆèµ„讯',
+ 'PanelWebTip' => 'æµè§ˆç½‘路上关于这个项目的资讯',
+ 'PanelRemoveTip' => '删除当å‰é¡¹ç›®',
+
+ 'PanelDateSelect' => '选择',
+ 'PanelNobody' => '没有人',
+ 'PanelUnknown' => '未知',
+ 'PanelAdded' => '添加日期',
+ 'PanelRating' => '评价',
+ 'PanelPressRating' => '媒体评价',
+ 'PanelLocation' => 'ä½ç½®',
+
+ 'PanelLending' => '出借状况',
+ 'PanelBorrower' => '借出对象',
+ 'PanelLendDate' => '出借日期',
+ 'PanelHistory' => '出借记录',
+ 'PanelReturned' => '物å“归还',
+ 'PanelReturnDate' => '归还日期',
+ 'PanelLendedYes' => '出借中',
+ 'PanelLendedNo' => 'å¯ç”¨',
+
+ 'PanelTags' => '标签',
+ 'PanelFavourite' => '最爱',
+ 'TagsAssigned' => '标签',
+
+ 'PanelUser' => '使用者字段',
+
+ 'CheckUndef' => '未定义',
+ 'CheckYes' => '是',
+ 'CheckNo' => 'ä¸æ˜¯',
+
+ 'ToolbarRandom' => 'éšæœºé€‰å–',
+ 'ToolbarAll' => 'æµè§ˆå…¨éƒ¨',
+ 'ToolbarAllTooltip' => 'æµè§ˆå…¨éƒ¨é¡¹ç›®',
+ 'ToolbarGroupBy' => '分组ä¾æ®',
+ 'ToolbarGroupByTooltip' => '选择一个字段给项目列表分组',
+ 'ToolbarQuickSearch' => '快速æœç´¢',
+ 'ToolbarQuickSearchLabel' => 'æœç´¢',
+ 'ToolbarQuickSearchTooltip' => '选择这个字段æ¥æœç´¢ï¼Œè¾“å…¥è¦æœç´¢çš„字串åŽæŒ‰ENTER。',
+ 'ToolbarSeparator' => '分隔',
+
+ 'PluginsTitle' => 'æœç´¢ä¸€ä¸ªé¡¹ç›®',
+ 'PluginsQuery' => '查询',
+ 'PluginsFrame' => 'æœç´¢ç«™ç‚¹',
+ 'PluginsLogo' => 'Logo',
+ 'PluginsName' => 'åå­—',
+ 'PluginsSearchFields' => 'æœç´¢å­—段',
+ 'PluginsAuthor' => '作者',
+ 'PluginsLang' => '语言',
+ 'PluginsUseSite' => '使用被选择的站点供未æ¥æœç´¢',
+ 'PluginsPreferredTooltip' => 'GCstar推è站点',
+ 'PluginDisabled' => '无效',
+
+ 'BorrowersTitle' => '出借对象设置',
+ 'BorrowersList' => '出借对象',
+ 'BorrowersName' => 'åå­—',
+ 'BorrowersEmail' => 'E-mail',
+ 'BorrowersAdd' => '添加',
+ 'BorrowersRemove' => '删除',
+ 'BorrowersEdit' => '编辑',
+ 'BorrowersTemplate' => '邮件模æ¿',
+ 'BorrowersSubject' => '邮件主题',
+ 'BorrowersNotice1' => '%1 将会被å–代为出借对象的åå­—',
+ 'BorrowersNotice2' => '%2 将会被å–代为物å“å称',
+ 'BorrowersNotice3' => '%3 将会被å–代为出借日期',
+
+ 'BorrowersImportTitle' => '导入出借对象的信æ¯',
+ 'BorrowersImportType' => '文件格å¼ï¼š',
+ 'BorrowersImportFile' => '文件:',
+
+ 'BorrowedTitle' => '被借走的东西',
+ 'BorrowedDate' => '从',
+ 'BorrowedDisplayInPanel' => '在主窗å£æ˜¾ç¤ºç‰©å“',
+
+ 'MailTitle' => 'å‘一å°email',
+ 'MailFrom' => '寄信人:',
+ 'MailTo' => '收信人:',
+ 'MailSubject' => '主题:',
+ 'MailSmtpError' => '连线到SMTPæœåŠ¡å™¨æ—¶å‡ºçŽ°é—®é¢˜',
+ 'MailSendmailError' => '寄é€ä¿¡ä»¶æ—¶å‡ºçŽ°é—®é¢˜',
+
+ 'SearchTooltip' => 'æœç´¢æ‰€æœ‰é¡¹ç›®',
+ 'SearchTitle' => '项目æœç´¢',
+ 'SearchNoField' => 'æœç´¢æ²¡æœ‰é€‰æ‹©ä»»ä½•å­—段。
+在收è—设置中的过滤器标签中加入。',
+
+ 'QueryReplaceField' => '替æ¢å­—段',
+ 'QueryReplaceOld' => '当å‰å€¼',
+ 'QueryReplaceNew' => '新值',
+ 'QueryReplaceLaunch' => '替æ¢',
+
+ 'ImportWindowTitle' => '选择è¦å¯¼å…¥çš„字段',
+ 'ImportViewPicture' => 'æµè§ˆå›¾ç‰‡',
+ 'ImportSelectAll' => '全选',
+ 'ImportSelectNone' => '全部ä¸é€‰',
+
+ 'MultiSiteTitle' => '用æ¥æœç´¢çš„网站',
+ 'MultiSiteUnused' => '未使用的æ’件',
+ 'MultiSiteUsed' => '被使用的æ’件',
+ 'MultiSiteLang' => '添加英语æ’件至列表',
+ 'MultiSiteEmptyError' => '您的站点列表为空',
+ 'MultiSiteClear' => '清除列表',
+
+ 'DisplayOptionsTitle' => '显示项目',
+ 'DisplayOptionsAll' => '全选',
+ 'DisplayOptionsSearch' => '选择按钮',
+
+ 'GenresTitle' => '类型转æ¢',
+ 'GenresCategoryName' => '使用类型',
+ 'GenresCategoryMembers' => '替æ¢ç±»åž‹',
+ 'GenresLoad' => '读å–一个列表',
+ 'GenresExport' => '将列表存到文件',
+ 'GenresModify' => '编辑转æ¢',
+
+ 'PropertiesName' => '收è—å称',
+ 'PropertiesLang' => '语言编ç ',
+ 'PropertiesOwner' => '拥有者',
+ 'PropertiesEmail' => 'Email',
+ 'PropertiesDescription' => 'æè¿°',
+ 'PropertiesFile' => '文件信æ¯',
+ 'PropertiesFilePath' => '完整路径',
+ 'PropertiesItemsNumber' => '项目数目',
+ 'PropertiesFileSize' => '大å°',
+ 'PropertiesFileSizeSymbols' => ['字节', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
+ 'PropertiesCollection' => '收è—属性',
+ 'PropertiesDefaultPicture' => '默认图片',
+
+ 'MailProgramsTitle' => '寄件软体',
+ 'MailProgramsName' => 'åå­—',
+ 'MailProgramsCommand' => '指令行',
+ 'MailProgramsRestore' => '回å¤é»˜è®¤å€¼',
+ 'MailProgramsAdd' => '添加一个程åº',
+ 'MailProgramsInstructions' => '在指令行中,您å¯ä»¥ç”¨ä¸‹é¢çš„å˜é‡æ¥æ›¿æ¢ï¼š
+ %f å¯è¢«æ›¿æ¢ä¸ºä½¿ç”¨è€…的电å­é‚®ä»¶åœ°å€ã€‚
+ %t å¯è¢«æ›¿æ¢ä¸ºæŽ¥æ”¶åœ°å€ã€‚
+ %s å¯è¢«æ›¿æ¢ä¸ºé‚®ä»¶ä¸»é¢˜ã€‚
+ %b å¯è¢«æ›¿æ¢ä¸ºé‚®ä»¶ä¿¡æ¯ã€‚',
+
+ 'BookmarksBookmarks' => '书签',
+ 'BookmarksFolder' => '目录',
+ 'BookmarksLabel' => '书签å',
+ 'BookmarksPath' => '路径',
+ 'BookmarksNewFolder' => '新目录',
+
+ 'AdvancedSearchType' => 'æœç´¢ç±»åž‹',
+ 'AdvancedSearchTypeAnd' => '项目匹é…所有æ¡ä»¶',
+ 'AdvancedSearchTypeOr' => '项目匹é…至少一个æ¡ä»¶',
+ 'AdvancedSearchCriteria' => 'æ¡ä»¶',
+ 'AdvancedSearchAnyField' => '所有字段',
+ 'AdvancedSearchSaveTitle' => 'ä¿å­˜æœç´¢',
+ 'AdvancedSearchSaveName' => 'å称',
+ 'AdvancedSearchSaveOverwrite' => '一个使用相åŒåå­—çš„æœç´¢å·²ç»å­˜åœ¨ï¼Œè¯·ä½¿ç”¨å¦ä¸€ä¸ªå字。',
+ 'AdvancedSearchUseCase' => '大å°å†™æ•æ„Ÿ',
+ 'AdvancedSearchIgnoreDiacritics' => '忽略é‡éŸ³ç­‰å‘音记å·',
+
+ 'BugReportSubject' => 'GCstar生æˆé”™è¯¯æŠ¥å‘Š',
+ 'BugReportVersion' => '版本',
+ 'BugReportPlatform' => 'æ“作系统',
+ 'BugReportMessage' => '错误信æ¯',
+ 'BugReportInformation' => '附加资讯',
+
+#Statistics
+ 'StatsFieldToUse' => '使用字段',
+ 'StatsSortByNumber' => '按{lowercaseX}数目排åº',
+ 'StatsGenerate' => '生æˆ',
+ 'StatsKindOfGraph' => '统计图类型',
+ 'StatsBars' => '柱状',
+ 'StatsPie' => '饼状',
+ 'Stats3DPie' => '三维饼状',
+ 'StatsArea' => '范围',
+ 'StatsHistory' => '历å²',
+ 'StatsWidth' => '宽度',
+ 'StatsHeight' => '高度',
+ 'StatsFontSize' => '字体大å°',
+ 'StatsDisplayNumber' => '显示数字',
+ 'StatsSave' => 'ä¿å­˜ç»Ÿè®¡å›¾',
+ 'StatsAccumulate' => '累计值',
+ 'StatsShowAllDates' => '显示所有数æ®',
+
+ 'DefaultValuesTip' => 'Values set in this window will be used as the default values when creating a new {lowercase1}',
+ );
+}
+1;
diff --git a/lib/gcstar/GCMail.pm b/lib/gcstar/GCMail.pm
new file mode 100644
index 0000000..a6c4649
--- /dev/null
+++ b/lib/gcstar/GCMail.pm
@@ -0,0 +1,474 @@
+package GCMail;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+our $muas = 0;
+
+our %defaultMua = (
+ 'Evolution' => 'evolution "mailto:%t?subject=%s&body=%b"',
+ 'Claws Mail' => 'sylpheed-claws --compose "mailto:%t?subject=%s&body=%b"',
+ 'Thunderbird' => 'thunderbird -compose "mailto:%t?subject=%s&body=%b"',
+);
+
+our $mailersConfigurationFile = 'GCmailers.conf';
+
+sub getMailers
+{
+ my $mailers;
+ if (!$muas)
+ {
+ if (-f $ENV{GCS_CONFIG_HOME}."/$mailersConfigurationFile")
+ {
+ open MAILERS, $ENV{GCS_CONFIG_HOME}."/$mailersConfigurationFile";
+ my $xmlString = do {local $/; <MAILERS>};
+ close MAILERS;
+ my $xs = XML::Simple->new;
+ $mailers = $xs->XMLin($xmlString,
+ ContentKey => '-content');
+ $muas = $mailers->{mailer};
+ }
+ else
+ {
+ $muas = \%defaultMua;
+ }
+ }
+ return $muas;
+}
+
+{
+ package GCMailDialog;
+ use base "Gtk2::Dialog";
+ use Net::SMTP;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ if ($self->run eq 'ok')
+ {
+ my $mail = $self->formatMail;
+
+ $self->sendMail($self->{from}->get_text, $self->{to}->get_text, $mail);
+ }
+ $self->hide;
+ }
+
+ sub sendMail
+ {
+ my ($self, $from, $to, $mail) = @_;
+
+ $to =~ s/.*?<|>.*?//g;
+
+ if ($self->{options}->mailer eq 'Sendmail')
+ {
+ $! = '';
+ if (open(MAILER, "| sendmail -t -ba"))
+ {
+ print MAILER "$mail\r\n.\r\n";
+ close MAILER;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{MailSendmailError}."\n\n$!");
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run;
+ $dialog->destroy;
+ }
+ }
+ else
+ {
+ my $smtp = Net::SMTP->new($self->{options}->smtp);
+ if (!$smtp)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{parent}->{lang}->{MailSmtpError});
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run;
+ $dialog->destroy;
+ return;
+ }
+ $smtp->mail($from);
+ $smtp->to($to);
+ $smtp->data;
+ $smtp->datasend($mail);
+ $smtp->dataend;
+ $smtp->quit;
+ }
+ }
+
+ sub formatMail
+ {
+ my $self = shift;
+
+ my $mail = '';
+
+ $mail .= "From: ".$self->{from}->get_text."\r\n";
+ $mail .= "To: ".$self->{to}->get_text."\r\n";
+ $mail .= "Subject: ".$self->{subject}->get_text."\r\n\r\n";
+
+ my $buffer = $self->{mailContent}->get_buffer;
+
+ $mail .= $buffer->get_text($buffer->get_start_iter, $buffer->get_end_iter, 1);
+
+ $mail .= "\r\n";
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $from, $to, $subject, $body) = @_;
+ my $class = ref($proto) || $proto;
+ (my $title = $parent->{lang}->{MailTitle}) =~ s/_//;
+ my $self = $class->SUPER::new($title,
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ bless ($self, $class);
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{parent} = $parent;
+ $self->{options} = $parent->{options};
+ my $items = $self->{parent}->{items};
+
+ my $table = new Gtk2::Table(2,2,0);
+ $table->set_row_spacings($GCUtils::margin);
+ $table->set_col_spacings(0);
+ $table->set_border_width($GCUtils::margin);
+
+ my $labelFrom = new Gtk2::Label($parent->{lang}->{MailFrom});
+ $labelFrom->set_alignment(0,0.5);
+ $self->{from} = new Gtk2::Entry;
+ $self->{from}->set_text($from);
+ my $labelTo = new Gtk2::Label($parent->{lang}->{MailTo});
+ $labelTo->set_alignment(0,0.5);
+ $self->{to} = new Gtk2::Entry;
+ $self->{to}->set_text($to);
+ my $labelSubject = new Gtk2::Label($parent->{lang}->{MailSubject});
+ $labelSubject->set_alignment(0,0.5);
+ $self->{subject} = new Gtk2::Entry;
+ $self->{subject}->set_text($subject);
+
+ $table->attach($labelFrom, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{from}, 1, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($labelTo, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{to}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($labelSubject, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $table->attach($self->{subject}, 1, 2, 2, 3, 'fill', 'fill', 0, 0);
+
+ $self->{mailContent} = new Gtk2::TextView;
+ $self->{mailContent}->set_editable(1);
+ $self->{mailContent}->set_wrap_mode('word');
+ $self->{mailContent}->get_buffer->set_text($body);
+ my $scrollContent = new Gtk2::ScrolledWindow;
+ $scrollContent->set_border_width(10);
+ $scrollContent->set_shadow_type('in');
+ $scrollContent->set_policy('automatic', 'automatic');
+ $scrollContent->set_size_request(-1,80);
+ $scrollContent->add($self->{mailContent});
+
+ $self->vbox->pack_start($table,0,0,10);
+ $self->vbox->pack_start($scrollContent,1,1,10);
+
+ return $self;
+ }
+
+}
+
+{
+ package GCMailer;
+
+ use URI::Escape qw(uri_escape_utf8);
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent};
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub sendBorrowerEmail
+ {
+ my ($self, $info) = @_;
+
+ my %mail = ();
+ my $options = $self->{parent}->{options};
+ $mail{from} = $options->from;
+
+ my @borrowers = split m/\|/, $options->borrowers;
+ my @emails = split m/\|/, $options->emails;
+ my $email;
+ for (my $i = 0; $i < scalar(@borrowers); $i++)
+ {
+ $email = $emails[$i];
+ last if $borrowers[$i] eq $info->{borrower};
+ }
+ $mail{to} = $info->{borrower}." <$email>";
+
+ $mail{subject} = $options->subject;
+ $mail{subject} =~ s/%1/$info->{borrower}/g;
+ $mail{subject} =~ s/%2/"$info->{title}"/g;
+ $mail{subject} =~ s/%3/$info->{lendDate}/g;
+
+ $mail{body} = $options->template;
+ $mail{body} =~ s/<br\/>/\n/g;
+ $mail{body} =~ s/%1/$info->{borrower}/g;
+ $mail{body} =~ s/%2/"$info->{title}"/g;
+ $mail{body} =~ s/%3/$info->{lendDate}/g;
+
+ $self->prepareEmailSending(\%mail);
+
+ #$self->showMe;
+ }
+
+ sub prepareEmailSending
+ {
+ my ($self, $mail) = @_;
+ if (($self->{parent}->{options}->mailer eq 'Sendmail')
+ || ($self->{parent}->{options}->mailer eq 'SMTP'))
+ {
+ my $dialog = new GCMailDialog($self->{parent}, $mail->{from}, $mail->{to},
+ $mail->{subject}, $mail->{body});
+ $dialog->show;
+ }
+ else
+ {
+ $mail->{body} = uri_escape_utf8($mail->{body});
+ my $clients = GCMail::getMailers();
+ my $command = $clients->{$self->{parent}->{options}->mailer};
+ $command =~ s/%f/$mail->{from}/gx;
+ $command =~ s/%t/$mail->{to}/gx;
+ $command =~ s/%s/$mail->{subject}/gx;
+ $command =~ s/%b/$mail->{body}/gx;
+ #system $command;
+ $self->{parent}->launch($command, 'program', 1);
+ }
+ }
+
+}
+
+{
+ package GCMailProgramsDialog;
+ use base 'GCModalDialog';
+ use XML::Simple;
+
+ sub initValues
+ {
+ my $self = shift;
+ use locale;
+
+ my $mailers = GCMail::getMailers;
+ @{$self->{mailers}->{data}} = ();
+ foreach (sort keys %$mailers)
+ {
+ my @infos = [$_, $mailers->{$_}];
+ push @{$self->{mailers}->{data}}, @infos;
+ }
+ $self->{mailers}->select(0);
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ $muas = {};
+ my $mailers;
+ foreach (@{$self->{mailers}->{data}})
+ {
+ push @{$mailers->{mailer}}, {name => $_->[0], content => $_->[1]};
+ $muas->{$_->[0]} = $_->[1];
+ }
+ my $xs = XML::Simple->new;
+ my $xmlData = $xs->XMLout($mailers,
+ XMLDecl => '<?xml version="1.0" encoding="UTF-8"?>',
+ RootName => 'mailers'
+ );
+ open MAILERS, '>'.$ENV{GCS_CONFIG_HOME}."/$mailersConfigurationFile";
+ print MAILERS $xmlData;
+ close MAILERS;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $result = $self->run;
+ $self->saveValues if $result eq 'ok';
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ return ($result eq 'ok');
+ }
+
+ sub restoreDefault
+ {
+ my $self = shift;
+ $muas = \%defaultMua;
+ $self->initValues;
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ my @idx = $self->{mailers}->get_selected_indices;
+ splice @{$self->{mailers}->{data}}, $idx[0], 1;
+ }
+
+ sub add
+ {
+ my $self = shift;
+
+ my $dialog = new Gtk2::Dialog($self->{parent}->{lang}->{MailProgramsAdd},
+ $self,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ my $table = new Gtk2::Table(2,2,0);
+
+ my $labelName = new GCLabel($self->{parent}->{lang}->{MailProgramsName});
+ $table->attach($labelName, 0, 1, 0, 1, 'fill', 'fill', 5, 5);
+ my $name = new Gtk2::Entry;
+ $table->attach($name, 1, 2, 0, 1, 'expand', 'fill', 5, 5);
+
+ my $labelEmail = new GCLabel($self->{parent}->{lang}->{MailProgramsCommand});
+ $table->attach($labelEmail, 0, 1, 1, 2, 'fill', 'fill', 5, 5);
+ my $email = new Gtk2::Entry;
+ $table->attach($email, 1, 2, 1, 2, 'expand', 'fill', 5, 5);
+
+ $dialog->vbox->pack_start($table,1,1,0);
+ $dialog->vbox->show_all;
+
+ if ($dialog->run eq 'ok')
+ {
+ unshift @{$self->{mailers}->{data}}, [$name->get_text, $email->get_text];
+ }
+
+ $dialog->destroy;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{MailProgramsTitle},
+ );
+
+ bless ($self, $class);
+
+ #$self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(400,400);
+
+ $self->{reverse} = 0;
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $parent->{options};
+
+ my $hbox = new Gtk2::HBox(0,0);
+
+ $self->{mailers} = new Gtk2::SimpleList($parent->{lang}->{MailProgramsName} => "text",
+ $parent->{lang}->{MailProgramsCommand} => "text");
+ $self->{mailers}->set_column_editable(0, 1);
+ $self->{mailers}->set_column_editable(1, 1);
+ $self->{mailers}->set_rules_hint(1);
+
+ $self->{mailers}->get_column(0)->set_sort_column_id(0);
+ $self->{mailers}->get_model->set_sort_column_id(0, 'ascending');
+
+ for my $i (0..1)
+ {
+ $self->{mailers}->get_column($i)->set_resizable(1);
+ }
+ $self->{order} = 1;
+ $self->{sort} = -1;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->set_border_width(0);
+ $scrollPanelList->add($self->{mailers});
+
+ my $vboxButtons = new Gtk2::VBox(0,0);
+ my $addButton = Gtk2::Button->new_from_stock('gtk-add');
+ $addButton->signal_connect('clicked' => sub {
+ $self->add;
+ });
+ my $removeButton = Gtk2::Button->new_from_stock('gtk-remove');
+ $removeButton->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+
+ my $restoreButton = Gtk2::Button->new($parent->{lang}->{MailProgramsRestore});
+ $restoreButton->signal_connect('clicked' => sub {
+ $self->restoreDefault;
+ });
+
+ $vboxButtons->pack_start($addButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($removeButton,0,0,$GCUtils::halfMargin);
+ $vboxButtons->pack_start($restoreButton,0,0,$GCUtils::halfMargin);
+
+ my $instructions = new GCLabel($parent->{lang}->{MailProgramsInstructions});
+ $instructions->set_padding($GCUtils::margin, $GCUtils::halfMargin);
+
+ $hbox->pack_start($scrollPanelList,1,1,0);
+ $hbox->pack_start($vboxButtons,0,0,$GCUtils::margin);
+ $hbox->set_border_width($GCUtils::margin);
+ $self->vbox->pack_start($hbox,1,1,0);
+ $self->vbox->pack_start($instructions,0,0,0);
+
+ return $self;
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCMainWindow.pm b/lib/gcstar/GCMainWindow.pm
new file mode 100644
index 0000000..b08bd40
--- /dev/null
+++ b/lib/gcstar/GCMainWindow.pm
@@ -0,0 +1,4124 @@
+package GCMainWindow;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+
+use strict;
+use Gtk2;
+
+{
+ package GCFrame;
+
+ use Glib::Object::Subclass
+ Gtk2::Window::
+ ;
+
+ @GCFrame::ISA = ('Gtk2::Window');
+
+ # Internal modules
+ use GCDialogs;
+ use GCPlugins;
+ use GCModel;
+ use GCGraphicComponents::GCBaseWidgets;
+ use GCMenu;
+ use GCPanel;
+ use GCUtils 'glob';
+ use GCOptions;
+ use GCStyle;
+ use GCBorrowings;
+ use GCExtract;
+ use GCExport;
+ use GCImport;
+ use GCSplash;
+ use GCLang;
+ use GCDisplay;
+ use GCData;
+ use GCMail;
+ use GCBookmarks;
+ use GCStats;
+
+ use GCItemsLists::GCTextLists;
+ use GCItemsLists::GCImageLists;
+
+ #use GCGenres;
+
+ # Pragmas
+ use filetest 'access';
+
+ # External modules
+ use LWP;
+ use URI::Escape;
+ use File::Basename;
+ use File::Spec;
+ use File::Copy;
+ use File::Path;
+ use IO::Handle;
+ use Storable qw(store_fd fd_retrieve);
+ use File::Temp qw(tempdir);
+ use Encode;
+
+ sub showMe
+ {
+ my $self = shift;
+ $self->present;
+ }
+
+ sub beforeDestroy
+ {
+ my $self = shift;
+ $self->leave;
+ return 1;
+ }
+
+ sub savePreferences
+ {
+ my $self = shift;
+ $self->{itemsView}->savePreferences($self->{model}->{preferences})
+ if $self->{itemsView} && $self->{model} && $self->{model}->{preferences};
+ }
+
+ sub leave
+ {
+ my $self = shift;
+
+ return if !$self->checkAndSave;
+
+ my ($width, $height) = $self->get_size;
+ $self->{options}->file('')
+ if $self->{options}->noautoload;
+ $self->{options}->width($width);
+ $self->{options}->height($height);
+ $self->{options}->split($self->{pane}->get_position) if ($self->{pane});
+ $self->{options}->listPaneSplit($self->{listPane}->get_position) if ($self->{listPane});
+
+ $self->{options}->save;
+ $self->savePreferences;
+ $self->{model}->save
+ if $self->{model};
+
+ $self->{items}->clean;
+
+ if (($^O !~ /win32/i) && ($self->{searchJob}->{pid}))
+ {
+ store_fd {type => 'exit'}, $self->{searchJob}->{command};
+ my $command = $self->{searchJob}->{command};
+ print $command "EXIT\n";
+ close $self->{searchJob}->{command};
+ close $self->{searchJob}->{data};
+ kill 9, $self->{searchJob}->{pid};
+ wait;
+ }
+ $self->{menubar}->save();
+ $self->destroy;
+ }
+
+ sub deleteCurrentItem
+ {
+ my $self = shift;
+ my $response = 'yes';
+ my $confirm = 0;
+
+ if ($self->{options}->confirm)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'question',
+ 'cancel',
+ $self->{items}->{multipleMode} ? $self->{lang}->{RemoveConfirmPlural} :
+ $self->{lang}->{RemoveConfirm});
+
+ my $delButton = Gtk2::Button->new_from_stock('gtk-delete');
+ $delButton->can_default(1);
+ $dialog->add_action_widget($delButton, 'yes');
+ $delButton->show_all;
+ $dialog->set_default_response('yes');
+ $dialog->set_position('center-on-parent');
+ my $check = new Gtk2::CheckButton($self->{lang}->{OptionsDontAsk});
+ $dialog->vbox->pack_start($check,0,0,5);
+ $dialog->vbox->pack_start(Gtk2::HSeparator->new,0,0,5);
+ $dialog->vbox->show_all;
+ $response = $dialog->run;
+ $confirm = ($check->get_active ? 0 : 1);
+ $dialog->destroy;
+ }
+
+ if ($response eq 'yes')
+ {
+ $self->markAsUpdated;
+ $self->{items}->removeCurrentItems;
+ $self->setNbItems;
+ $self->{options}->confirm($confirm);
+ $self->{panel}->hide if ! $self->{itemsView}->getNbItems;
+ }
+ }
+
+ sub newItem
+ {
+
+ my ($self, $self2, $noDisplay) = @_;
+ $self = $self2 if $self2;
+
+ #$self->{options}->lockPanel(0);
+ # Uncomment to memorize
+ #$self->{panel}->changeState($self->{panel}, 0);
+ $self->{menubar}->setCollectionLock(0);
+
+ my $info = $self->{model}->getDefaultValues;
+ $self->addItem($info, 1, undef, 1);
+
+ $self->displayInWindow(undef, 'item', 1)
+ if $self->{panel}->isReadOnly && !$noDisplay;
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ $self->{itemsView}->selectAll;
+ }
+
+ sub duplicateItem
+ {
+
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ my @added;
+ my $indexes = $self->{itemsView}->getCurrentItems;
+ foreach my $idx(@$indexes)
+ {
+ my $newItem = Storable::dclone(($self->{items}->getItemsListFiltered)->[$idx]);
+ # Duplicate all the managed pictures
+ foreach (@{$self->{model}->{managedImages}})
+ {
+ (my $origPic = $newItem->{$_}) =~ /^(.*)(\.[^\.]*)$/;
+ next if !$origPic;
+ my ($base, $suffix) = ($1, $2);
+ my $newPic;
+ my $count = 0;
+ $count++ while (-e ($newPic = $base.'_'.$count.$suffix));
+ copy($origPic,$newPic);
+ $self->{items}->markToBeAdded($newPic);
+ $newItem->{$_} = $newPic;
+ }
+ push @added, $newItem;
+ }
+
+ foreach my $info(@added)
+ {
+ $self->addItem($info, 1);
+ }
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url, $existing) = @_;
+
+ my $baseUrl;
+ my $plugin;
+
+ foreach (values %{$self->{model}->getAllPlugins})
+ {
+ ($baseUrl = $_->getItemUrl) =~ s/http:\/\/(w{3})?//;
+ $plugin = $_;
+
+ last if ((($baseUrl) && ($url =~ m/$baseUrl/))
+ && (($plugin->testURL($url)) || (!$plugin->needsLanguageTest())));
+ }
+
+ return unless $url =~ m/$baseUrl/;
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+
+ # Create a new item if we're not wanting to update the existing one
+ $self->newItem
+ if (!$existing);
+ $plugin->{bigPics} = $self->{options}->bigPics;
+ my $info = $plugin->loadUrl($url);
+ $self->restoreCursor;
+ return if ! $info->{$self->{model}->{commonFields}->{title}};
+
+ if ($existing)
+ {
+ # We only want to update blank fields during the refresh
+ foreach my $field (keys(%{$info}))
+ {
+ # Loop through fields returned and check if they were previously blank
+ # or an empty array. Only exception is the press rating field,
+ # which we'll always want to update
+ if ((($self->{panel}->$field) && ($field ne 'ratingpress'))
+ && !((ref($self->{panel}->$field)) && ( @{$self->{panel}->$field} == 0)))
+ {
+ # Ignore field
+ $info->{$field} = $self->{ignoreString};
+ }
+ }
+
+ }
+
+ $self->addItem($info, 0);
+ }
+
+ sub refreshItemForPanel
+ {
+ my ($self, $panel, $url) = @_;
+
+ $self->{previousPanel} = $self->{panel};
+ $self->{panel} = $panel;
+
+ # Clear the ## part off the end of stored urls
+ $url =~ s/#.*$//;
+
+ # Fetch information from the stored url
+ $self->loadUrl($url, 1);
+
+ $self->{panel} = $self->{previousPanel} if ($panel);
+ delete $self->{previousPanel};
+ }
+
+ sub searchItemForPanel
+ {
+ my ($self, $panel, $pluginType) = @_;
+
+ if ($panel)
+ {
+ $self->{previousPanel} = $self->{panel};
+ $self->{panel} = $panel;
+ }
+ my $query;
+ my $field;
+ my %queries;
+ foreach (@{$self->{model}->getSearchFields})
+ {
+ $queries{$_} = $self->{panel}->getValue($_);
+ if (!$query)
+ {
+ $query = $queries{$_};
+ $field = $_;
+ }
+ }
+ $self->searchItem($query, $pluginType, 0, $field, \%queries);
+ $self->{panel} = $self->{previousPanel} if ($panel);
+ delete $self->{previousPanel};
+ }
+
+ sub searchItem
+ {
+ my ($self, $query, $pluginType, $currentPlugin, $searchField, $queries) = @_;
+
+ # Search for information on websites thanks to plugins
+
+ # This will contain the plugin that should be used to fetch the information
+ my $plugin;
+ # When information are previewed, they are stored in this map to avoid getting twice
+ # the same information. The key is the index in the list of results.
+ $self->{previewCache} = {};
+
+ # Fetch mode, if not forced take it from prefs
+ $pluginType=$self->{model}->{preferences}->plugin if !$pluginType;
+
+ # Many sites per field
+ if ($pluginType eq 'multiperfield')
+ {
+ my $whenMultiple='Ask';
+ my $info=$self->searchItemInfoWithPluginList($query, $whenMultiple, $currentPlugin, $searchField, $queries);
+ $self->addItem($info, 0);
+ return;
+ }
+ # Many sites
+ elsif ($pluginType eq 'multi')
+ {
+ # Here we get the next plugin in the list if the user set a list
+ my $pluginName = $self->getDialog('MultiSite')->getPlugin($currentPlugin);
+ $plugin = $self->{model}->getPlugin($pluginName);
+ if (!$plugin)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{lang}->{MultiSiteEmptyError});
+
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $dialog->destroy;
+ return;
+ }
+ }
+ # Ask (within in a specific list)
+ elsif ($pluginType eq 'multiask')
+ {
+ # Display the list of plugins to use
+ $self->getDialog('PluginsAsk')->setModel($self->{model},
+ $self->{model}->{preferences}->multisite);
+ $self->getDialog('PluginsAsk')->query($query, $searchField, $queries);
+ $self->getDialog('PluginsAsk')->show;
+ $plugin = $self->getDialog('PluginsAsk')->plugin;
+ return if !$plugin;
+ ($query, $searchField) = $self->getDialog('PluginsAsk')->query;
+ }
+ # Ask (All sites)
+ # Also activated if forced by user (e.g. if a search returned no result)
+ elsif ($pluginType eq 'ask' || ! $self->{plugin})
+ {
+ $self->getDialog('Plugins')->query($query, $searchField, $queries);
+ $self->getDialog('Plugins')->show;
+ $plugin = $self->getDialog('Plugins')->plugin;
+ return if !$plugin;
+ ($query, $searchField) = $self->getDialog('Plugins')->query;
+ }
+ # Explicit plugin
+ else
+ {
+ $plugin = $self->{plugin};
+ }
+
+ # Loop through search/select routine for plugin's desired number of passes
+ for (my $pass = 1; $pass <= $plugin->getNumberPasses; $pass++)
+ {
+ # Force values of query and search field if they are incompatible with current plugin
+ my $compatible = 1;
+ $compatible = grep /^$searchField$/, @{$plugin->getSearchFieldsArray}
+ if $searchField;
+ if (!$compatible)
+ {
+ # If it is not, we use the 1st compatible one
+ $searchField = $plugin->getSearchFieldsArray->[0];
+ $query = $queries->{$searchField};
+ }
+
+ # If the search cannot be stopped
+ if (! $self->{options}->searchStop)
+ {
+ # Prepare the plugin with required information
+ $plugin->setProxy($self->{options}->proxy);
+ $plugin->setCookieJar($self->{options}->cookieJar);
+
+ # Title to search
+ $plugin->{title} = $query;
+ $plugin->{pass} = $pass;
+ # Type set to load means a search on the website
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{bigPics} = $self->{options}->bigPics;
+ $plugin->{searchField} = $searchField;
+
+ $self->setWaitCursor($self->{lang}->{StatusSearch}.' ('.$plugin->getName.')');
+ # Perform the load
+ $plugin->load;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Prepare the information for search
+ # Nearly the same as the ones set directly on plugin when search cannot be stopped
+ my $info = {
+ name => $plugin->getName,
+ model => $self->{model}->getName,
+ proxy => $self->{options}->proxy,
+ cookieJar => $self->{options}->cookieJar,
+ query => $query,
+ field => $searchField,
+ type => 'load',
+ urlField => $self->{model}->{commonFields}->{url},
+ bigPics => $self->{options}->bigPics,
+ pass => $pass,
+ nextUrl => $plugin->{nextUrl}
+ };
+ # Send the information to the other process that will perform the actual search
+ store_fd $info, $self->{searchJob}->{command};
+ my $getInfo = 0;
+ # Dialog with progress bar and cancel button
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusSearch} . "\n" . $plugin->getName);
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialog->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # If there is already something in the pipe...
+ my $rin = '';
+ vec($rin,fileno($self->{searchJob}->{data}),1) = 1;
+ if (select($rin,undef,undef,0.01))
+ {
+ # ... We just get it to empty the pipe
+ my $trash = fd_retrieve($self->{searchJob}->{data});
+ }
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialog;
+ # Close the dialog window
+ $dialog->response('cancel');
+ # Set variable to indicate we got some data
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialog->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialog->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialog->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $plugin = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ return;
+ }
+ }
+
+ # Get the number of retrieved items
+ my $itemNumber = $plugin->getItemsNumber();
+ $self->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+
+ # If there is none, we will use next plugin ('multi' mode) or ask the user
+ # to select another one
+ if ($itemNumber == 0)
+ {
+ my $force = 0;
+ my $idx = 0;
+ if (($pluginType eq 'multi') && (($currentPlugin + 1) < $self->getDialog('MultiSite')->getPluginsNumber))
+ {
+ $idx = $currentPlugin + 1;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'yes-no',
+ $self->{lang}->{NoItemFound});
+
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $dialog->destroy;
+ return if $response ne 'yes';
+ $pluginType = 'ask';
+ }
+ # Call the same method again with new plugin
+ $self->searchItem($query, $pluginType, $idx, $searchField, $queries);
+ }
+ # Just one item, directly fetch its information
+ elsif ($itemNumber == 1)
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item info
+ $self->downloadItemInfoFromPlugin($plugin, 0);
+ }
+ else
+ {
+ # Still have more passes to do, find the next url to parse
+ my @items = $plugin->getItems();
+ $plugin->{nextUrl} = $items[0]->{nextUrl};
+ }
+ }
+ else
+ {
+ # Should we display the Next button to perform the search on the next website?
+ my $withNext = 0;
+ $withNext = 1 if ($pluginType eq 'multi') && (($currentPlugin + 1) < $self->getDialog('MultiSite')->getPluginsNumber);
+
+ # Get an array with all the results
+ my @items = $plugin->getItems();
+ # Dialog that will contain them
+ my $resultsDialog = $self->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection($pass == $plugin->getNumberPasses);
+ $resultsDialog->setWithNext($withNext);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList('', @items);
+ my $next = $resultsDialog->show;
+ # If the user selected one of the results
+ if ($resultsDialog->{validated})
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item information
+
+ my $indexes = $resultsDialog->getItemsIndexes;
+ # Fetch the information from the website
+ $self->downloadItemInfoFromPlugin($plugin, $indexes->[0]);
+ # If more than one were selected, other items are automatically created
+ # and their information fetched
+ if (scalar(@$indexes) > 1)
+ {
+ shift @$indexes;
+ foreach my $idx(@$indexes)
+ {
+ if ((exists $self->{previousPanel})
+ && ($self->{previousPanel}->isReadOnly))
+ {
+ $self->updateSelectedItemInfoFromGivenPanelAndSelect($self->{panel}, $idx);
+ }
+ if ($pass == $plugin->getNumberPasses)
+ {
+ $self->newItem(undef, 0);
+ }
+ $self->downloadItemInfoFromPlugin($plugin, $idx);
+ }
+ }
+ }
+ else
+ {
+ # More passes to do, so find next url to parse
+ # TODO - make sure we stop users from selecting more than one item
+ # on anything but the last pass. At the moment this will ignore
+ # everything but the first item selected
+ if ($resultsDialog->{validated})
+ {
+ my $indexes = $resultsDialog->getItemsIndexes;
+ $plugin->{nextUrl} = @items[$indexes->[0]]->{nextUrl};
+ }
+ }
+ }
+ # If the user pressed Next button, call the same method again with next plugin
+ elsif ($next)
+ {
+ $self->searchItem($query, $pluginType, $currentPlugin + 1, $searchField, $queries);
+ }
+ }
+ }
+ }
+
+ sub searchItemInfoWithPluginList
+ {
+ my ($self, $query, $whenMultiple, $currentPlugin, $searchField, $queries, $otherSourcesNames,$otherSources) = @_;
+
+ # Search for information on websites thanks to plugins
+ # Get info for each fields in the priority asked by $pluginListOrderPerField
+
+ # Get the list of fields and plugin
+ my $myHelperSourcesPerField=$self->getDialog('MultiSitePerField');
+ $myHelperSourcesPerField->setModel($self->{model});
+ my $otherSourcesMenu;
+ $otherSourcesMenu=map { value=>$_,displayed =>$otherSourcesNames->{$_} }, keys %$otherSourcesNames if ($otherSourcesNames);
+ $myHelperSourcesPerField->setSourceList(1, $otherSourcesMenu);
+
+ $myHelperSourcesPerField->resetCurrentFetchingStatus;
+ my $infoPerPlugin={};
+ PLUGIN: while(1){
+ # This will contain the plugin that should be used to fetch the information
+ my $pluginName=$myHelperSourcesPerField->getNextSourceNeeded;
+ last PLUGIN unless ($pluginName);
+ if(grep /$pluginName/, keys %$otherSources)
+ {
+ $infoPerPlugin->{$pluginName}=$otherSources->{$pluginName};
+ }
+ else
+ {
+ my $plugin=$myHelperSourcesPerField->getPlugin($pluginName);
+ # Now we have the plugin to use
+ $infoPerPlugin->{$pluginName} = $self->searchOneItemInfoWithPlugin($query, $whenMultiple, $plugin, $searchField, $queries);
+ }
+ # TODO update the query to avoid re asking if multiple results for next plugin i.e. add info from fetched data to the query
+
+ # Update fields fetched with this plugin
+ $myHelperSourcesPerField->doneWithSourceName($pluginName,$infoPerPlugin->{$pluginName});
+ }
+ my $info=$myHelperSourcesPerField->joinInfo($infoPerPlugin);
+ # TODO manage multiple url, for instance we throw them
+ return $info;
+ }
+
+ sub searchOneItemInfoWithPlugin
+ {
+ my ($self, $query, $whenMultiple, $plugin, $searchField, $queries) = @_;
+ # Search for information on websites thanks to plugins
+ # Return $info
+
+ # When information are previewed, they are stored in this map to avoid getting twice
+ # the same information. The key is the index in the list of results.
+ $self->{previewCache} = {};
+ my $info={};
+ # Loop through search/select routine for plugin's desired number of passes
+ for (my $pass = 1; $pass <= $plugin->getNumberPasses; $pass++)
+ {
+ # Force values of query and search field if they are incompatible with current plugin
+ my $compatible = grep /^$searchField$/, @{$plugin->getSearchFieldsArray};
+ if (!$compatible)
+ {
+ # If it is not, we use the 1st compatible one
+ $searchField = $plugin->getSearchFieldsArray->[0];
+ $query = $queries->{$searchField};
+ }
+
+ # If the search cannot be stopped
+ if (! $self->{options}->searchStop)
+ {
+ # Prepare the plugin with required information
+ $plugin->setProxy($self->{options}->proxy);
+ $plugin->setCookieJar($self->{options}->cookieJar);
+
+ # Title to search
+ $plugin->{title} = $query;
+ $plugin->{pass} = $pass;
+ # Type set to load means a search on the website
+ $plugin->{type} = 'load';
+ $plugin->{urlField} = $self->{model}->{commonFields}->{url};
+ $plugin->{bigPics} = $self->{options}->bigPics;
+ $plugin->{searchField} = $searchField;
+
+ $self->setWaitCursor($self->{lang}->{StatusSearch}.' ('.$plugin->getName.')');
+ # Perform the load
+ $plugin->load;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Prepare the information for search
+ # Nearly the same as the ones set directly on plugin when search cannot be stopped
+ my $info = {
+ name => $plugin->getName,
+ model => $self->{model}->getName,
+ proxy => $self->{options}->proxy,
+ cookieJar => $self->{options}->cookieJar,
+ query => $query,
+ field => $searchField,
+ type => 'load',
+ urlField => $self->{model}->{commonFields}->{url},
+ bigPics => $self->{options}->bigPics,
+ pass => $pass,
+ nextUrl => $plugin->{nextUrl}
+ };
+ # Send the information to the other process that will perform the actual search
+ store_fd $info, $self->{searchJob}->{command};
+ my $getInfo = 0;
+ # Dialog with progress bar and cancel button
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusSearch} . "\n" . $plugin->getName);
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialog->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # If there is already something in the pipe...
+ my $rin = '';
+ vec($rin,fileno($self->{searchJob}->{data}),1) = 1;
+ if (select($rin,undef,undef,0.01))
+ {
+ # ... We just get it to empty the pipe
+ my $trash = fd_retrieve($self->{searchJob}->{data});
+ }
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialog;
+ # Close the dialog window
+ $dialog->response('cancel');
+ # Set variable to indicate we got some data
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialog->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialog->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialog->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $plugin = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ return;
+ }
+ }
+
+ # Get the number of retrieved items
+ my $itemNumber = $plugin->getItemsNumber();
+ $self->{defaultPictureSuffix} = $plugin->getDefaultPictureSuffix;
+ # If there is none, we will use next plugin ('multi' mode) or ask the user
+ # to select another one
+ if ($itemNumber == 0)
+ {
+
+ }
+ # Just one item, directly fetch its information
+ elsif ($itemNumber == 1 || $whenMultiple eq 'TakeFirst')
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item info
+ $info=$self->fetchItemInfoFromPlugin($plugin, 0);
+ }
+ else
+ {
+ # Still have more passes to do, find the next url to parse
+ my @items = $plugin->getItems();
+ $plugin->{nextUrl} = $items[0]->{nextUrl};
+ }
+ }
+ else
+ {
+ if($whenMultiple eq 'Ask')
+ {
+ # Get an array with all the results
+ my @items = $plugin->getItems();
+ # Dialog that will contain them
+ my $resultsDialog = $self->getDialog('Results');
+ $resultsDialog->setModel($self->{model}, $self->{model}->{fieldsInfo});
+ $resultsDialog->setMultipleSelection(0);
+ $resultsDialog->setWithNext(0);
+ $resultsDialog->setSearchPlugin($plugin);
+ $resultsDialog->setList('', @items);
+ my $next = $resultsDialog->show;
+ # If the user selected one of the results
+ if ($resultsDialog->{validated})
+ {
+ if ($pass == $plugin->getNumberPasses)
+ {
+ # Final pass, so grab item information
+ my $indexes = $resultsDialog->getItemsIndexes;
+ # Fetch the information from the website
+ $info=$self->fetchItemInfoFromPlugin($plugin, $indexes->[0]);
+ }
+ else
+ {
+ # More passes to do, so find next url to parse
+ if ($resultsDialog->{validated})
+ {
+ my $indexes = $resultsDialog->getItemsIndexes;
+ $plugin->{nextUrl} = @items[$indexes->[0]]->{nextUrl};
+ }
+ }
+ }
+ }
+ }
+ }
+ return $info;
+ }
+
+ sub fetchItemInfoFromPlugin
+ {
+ my ($self, $plugin, $idx) = @_;
+
+ my $info;
+
+ # Gets from cache if we already previewed it
+ if ($self->{previewCache}->{$idx})
+ {
+ $info = $self->{previewCache}->{$idx};
+ }
+ else
+ {
+ # Tell the plugin what we want
+ $plugin->{wantedIdx} = $idx;
+ $plugin->{type} = 'info';
+
+ if (! $self->{options}->searchStop)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+ # Fetch the information
+ $info = $plugin->getItemInfo;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Send directly the plugin to the other process
+ store_fd $plugin, $self->{searchJob}->{command};
+ # Indicates if something was returned by plugin
+ my $getInfo = 0;
+ my $dialogGet = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusGetInfo});
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialogGet->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialogGet;
+ $dialogGet->response('cancel');
+ # Set the flag when we got something
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialogGet->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialogGet->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialogGet->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $info = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ }
+ }
+ }
+ return $info;
+ }
+
+ sub downloadItemInfoFromPlugin
+ {
+ my ($self, $plugin, $idx, $withPreview) = @_;
+
+ my $info;
+
+ # Gets from cache if we already previewed it
+ if ($self->{previewCache}->{$idx})
+ {
+ $info = $self->{previewCache}->{$idx};
+ }
+ else
+ {
+ # Tell the plugin what we want
+ $plugin->{wantedIdx} = $idx;
+ $plugin->{type} = 'info';
+
+ if (! $self->{options}->searchStop)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+ # Fetch the information
+ $info = $plugin->getItemInfo;
+ $self->restoreCursor;
+ }
+ else
+ {
+ # Send directly the plugin to the other process
+ store_fd $plugin, $self->{searchJob}->{command};
+ # Indicates if something was returned by plugin
+ my $getInfo = 0;
+ my $dialogGet = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'cancel',
+ $self->{lang}->{StatusGetInfo});
+
+ my $progress = new Gtk2::ProgressBar;
+ $dialogGet->vbox->pack_start($progress,1,1,10);
+ $progress->set_pulse_step(0.05);
+ $progress->show_all;
+ my $pulseTimeout = Glib::Timeout->add(50 , sub {
+ # $getInfo will be set by the watcher that looks for data from the other process
+ return 0 if $getInfo;
+ $progress->pulse;
+ return 1;
+ });
+
+ # Monitor the pipe from process
+ my $watch = Glib::IO->add_watch(fileno($self->{searchJob}->{data}),
+ 'in',
+ sub {
+ return if !$dialogGet;
+ $dialogGet->response('cancel');
+ # Set the flag when we got something
+ $getInfo = 1;
+ return 0;
+ });
+
+ $dialogGet->set_position('center-on-parent');
+ # It will run until we get some information, or the user press cancel
+ $dialogGet->run if !$getInfo;
+ # Stop everything
+ Glib::Source->remove($watch);
+ Glib::Source->remove($pulseTimeout);
+ $dialogGet->destroy;
+ my $command = $self->{searchJob}->{command};
+ # Did we get something?
+ if ($getInfo)
+ {
+ # Then we read the data from pipe
+ $info = fd_retrieve($self->{searchJob}->{data});
+ # And we inform the process we got it
+ print $command "OK\n";
+ }
+ else
+ {
+ # Tell the process the information is no more required
+ print $command "STOP\n";
+ return;
+ }
+ }
+ }
+
+ # If we are doing a preview instead of really fetching the data
+ if ($withPreview)
+ {
+ # Stores in cache
+ $self->{previewCache}->{$idx} = $info;
+ $self->getDialog('ImportFields')->info($info);
+ $self->getDialog('ImportFields')->setReadOnly(1);
+ $self->getDialog('ImportFields')->show;
+ }
+ else
+ {
+ # If user want to select the fields to fetch
+ if ($self->{options}->askImport)
+ {
+ $self->getDialog('ImportFields')->info($info);
+ $self->getDialog('ImportFields')->setReadOnly(0);
+ return if ! $self->getDialog('ImportFields')->show;
+ $info = $self->getDialog('ImportFields')->info;
+ }
+ # Set the information (2nd parameter set to 0 means no item creation).
+ $self->addItem($info, 0);
+ }
+ }
+
+ sub checkDefaultImage
+ {
+ my $self = shift;
+ my $previous = $self->{defaultImage};
+ my $specific = $self->{items}->getInformation->{defaultImage};
+ if ($specific && (-f $specific))
+ {
+ $self->{defaultImage} = $specific;
+ }
+ elsif (-f $self->{model}->{defaultImage})
+ {
+ $self->{defaultImage} = $self->{model}->{defaultImage};
+ }
+ else
+ {
+ if (-f $self->{logosDir}.'no.png')
+ {
+ $self->{defaultImage} = $self->{logosDir}.'no.png';
+ }
+ else
+ {
+ $self->{defaultImage} = $ENV{GCS_SHARE_DIR}.'/no.jpg';
+ }
+ }
+ $self->setItemsList
+ if !$self->{initializing} && $self->{itemsView} && ($previous ne $self->{defaultImage});
+ }
+
+ sub getImagesDir
+ {
+ my $self = shift;
+
+ my $imagesDir = '';
+ $imagesDir = $self->{items}->getInformation->{images}
+ if $self->{items};
+ my $i = 0;
+ #We use the global one if none exists in the collection
+ $imagesDir ||= $self->{options}->images;
+ if ($self->{options}->file)
+ {
+ $imagesDir =~ s/^(%WORKING_DIR%|\.)/dirname($self->{options}->file)/e;
+ $imagesDir =~ s/%FILE_BASE%/basename($self->{options}->file, '.gcs')/e;
+ }
+ else
+ {
+ # If value contains one of the variables and we don't have a directory name
+ # we store everything in the temporary directory
+ $imagesDir = $self->{tmpImageDir}
+ if ($imagesDir =~ m/^(%WORKING_DIR%|\.)/)
+ || ($imagesDir =~ m/%FILE_BASE%/);
+ }
+
+ return GCUtils::pathToUnix($imagesDir);
+ }
+
+ sub getUniqueImageFileName
+ {
+ my ($self, $suffix, $itemTitle, $imagesDir) = @_;
+
+ # If none specified, we use the default one
+ $imagesDir ||= $self->getImagesDir;
+ $imagesDir =~ s+([^/])$+$1/+;
+ my $imagePrefix;
+ if ($self->{options}->useTitleForPics)
+ {
+ $imagePrefix = GCUtils::getSafeFileName($itemTitle);
+ $imagePrefix .= '_';
+ }
+ else
+ {
+ $imagePrefix = $self->{imagePrefix};
+ }
+
+ if ( ! -e $imagesDir)
+ {
+ mkdir($imagesDir);
+ }
+
+ my $filePrefix = $imagesDir.$imagePrefix;
+ my @tmp_filenames;
+ @tmp_filenames = glob $filePrefix.'*.*';
+ my $sysPrefix = $filePrefix;
+ $sysPrefix =~ s/\\/\\\\/g if ($^O =~ /win32/i);
+ my @numbers = sort {$b <=> $a} map {
+ /$sysPrefix([0-9]*)\./ && $1;
+ } @tmp_filenames;
+ my $mostRecent = $numbers[0] || 0;
+
+ my $picture = $filePrefix.$mostRecent.$suffix;
+
+ while (-e $picture)
+ {
+ $mostRecent++;
+ $picture = $filePrefix.$mostRecent.$suffix;
+ }
+ return $picture;
+ }
+
+ sub isManagedPicture
+ {
+ my ($self, $pic) = @_;
+ my $file = GCUtils::getDisplayedImage($pic, '', $self->{options}->file);
+ my $imagePrefix = $self->{imagePrefix};
+ my $imageDir = $self->getImagesDir;
+ if (($file =~ /(\/|\\)$imagePrefix[0-9]*\./)
+ && ($file =~ m|^\Q$imageDir\E|))
+ {
+ return $file;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ sub checkPictureToBeRemoved
+ {
+ my ($self, $pic) = @_;
+ if (my $file = $self->isManagedPicture($pic))
+ {
+ $self->{items}->markToBeRemoved($file);
+ }
+ }
+
+# sub changeInfo
+# {
+# my ($self, $info) = @_;
+#
+# my @genres = split /,/, $info->{type};
+# my $newGenres = '';
+#
+# foreach (@genres)
+# {
+# $newGenres .= $self->getDialog('GenresGroups')->{convertor}->convert($_).',';
+# }
+# $newGenres =~ s/.$//;
+#
+# $info->{type} = $newGenres;
+# }
+
+ sub addItem
+ {
+ my ($self, $info, $newItem, $keepId, $defaultValues) = @_;
+
+ #$self->changeInfo($info);
+ my $ignore = $self->{ignoreString};
+
+ if ($newItem)
+ {
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ $self->markAsUpdated;
+ my $id = $self->{items}->addItem($info, $keepId);
+ my @picFields = ();
+ for my $field (@{$self->{model}->{fieldsNames}})
+ {
+ if ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ push @picFields, $field;
+ next;
+ }
+ $self->{panel}->$field($info->{$field});
+ }
+ $self->{panel}->selectTitle;
+ my $title = $info->{$self->{model}->{commonFields}->{title}};
+ my $imagePrefix = $self->{imagePrefix};
+ foreach my $pic(@picFields)
+ {
+ if ($info->{$pic} && ($info->{$pic} ne $ignore))
+ {
+ $self->checkPictureToBeRemoved($self->{panel}->$pic);
+ ($info->{$pic}, my $picture) = $self->downloadPicture($info->{$pic}, $title)
+ if !$defaultValues;
+
+ # Only set the picture if one was returned. Otherwise the download was rejected, so stick with
+ # the existing picture
+ if ($info->{$pic})
+ {
+ $self->{panel}->$pic($info->{$pic})
+ }
+ else
+ {
+ $info->{$pic} = $ignore;
+ }
+ }
+ }
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ $self->{panel}->show if $self->{itemsView}->getNbItems;
+ $self->setNbItems;
+ my $idField = $self->{model}->{commonFields}->{id};
+ $self->{panel}->$idField($id);
+ }
+ else
+ {
+ my $previous = $self->{panel}->getAsHash;
+ my @picFields = ();
+ foreach my $field(@{$self->{model}->{fieldsNames}})
+ {
+ if ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'image')
+ {
+ push @picFields, $field;
+ next;
+ }
+ #next if ($field eq $cover);
+ if (($self->{model}->{fieldsInfo}->{$field}->{imported} ne 'true')
+ || ($info->{$field} eq $ignore)
+ || ($info->{$field} eq ''))
+ {
+ $info->{$field} = $previous->{$field};
+ }
+ else
+ {
+ $self->{panel}->$field($info->{$field});
+ }
+ }
+ my $title = $info->{$self->{model}->{commonFields}->{title}};
+ my $imagePrefix = $self->{imagePrefix};
+ foreach my $pic(@picFields)
+ {
+ if ($info->{$pic} && ($info->{$pic} ne $ignore))
+ {
+ $self->checkPictureToBeRemoved($self->{panel}->$pic);
+ ($info->{$pic}, my $picture) = $self->downloadPicture($info->{$pic}, $title);
+
+ # Only set the picture if one was returned. Otherwise the download was rejected, so stick with
+ # the existing picture
+ if ($info->{$pic})
+ {
+ $self->{panel}->$pic($info->{$pic})
+ }
+ else
+ {
+ $info->{$pic} = $ignore;
+ }
+ }
+ $info->{$pic} = $previous->{$pic} if $info->{$pic} eq $ignore;
+ }
+
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ $self->{itemsView}->showCurrent;
+ }
+ $self->{panel}->dataChanged;
+ }
+
+ sub downloadPicture
+ {
+ my ($self, $pictureUrl, $title) = @_;
+
+ $title ||= $self->{panel}->getValue($self->{model}->{commonFields}->{title});
+
+ my ($name,$path,$suffix) = fileparse($pictureUrl, "\.gif", "\.jpg", "\.jpeg", "\.png");
+ $suffix ||= $self->{defaultPictureSuffix};
+ my $picture = $self->getUniqueImageFileName($suffix, $title);
+
+ if ($pictureUrl =~ m|^http://|)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetImage});
+ GCUtils::downloadFile($pictureUrl, $picture, $self);
+ $self->restoreCursor;
+
+ # Check for file size of returned file. If it's less than 1000, we'll reject it, since it's
+ # most likely a corrupt file
+ my $filesize = -s $picture;
+ if ($filesize < 1000)
+ {
+ unlink $picture;
+ $picture = "";
+ }
+ }
+ else
+ {
+ copy $pictureUrl, $picture;
+ }
+ $self->{items}->markToBeAdded($picture)
+ if ($picture);
+ return ($self->transformPicturePath($picture), $picture);
+ }
+
+ sub transformPicturePath
+ {
+ my ($self, $path, $file) = @_;
+ return '' if !$path;
+ $file ||= $self->{options}->file;
+ $path = GCUtils::getDisplayedImage($path, $path, $file);
+ my $dir = undef;
+ $dir = dirname($file) if $file;
+ return GCUtils::pathToUnix(File::Spec->rel2abs($path,$dir), 1)
+ if !$self->{options}->useRelativePaths;
+ return GCUtils::pathToUnix(File::Spec->abs2rel($path,$dir));
+ }
+
+ sub addBookmark
+ {
+ my $self = shift;
+
+ my $dialog = $self->getDialog('BookmarkAdder');
+ $dialog->setBookmark($self->{options}->file, $self->{items}->getInformation->{name});
+ $dialog->setBookmarksFolders($self->{bookmarksLoader}->{bookmarks});
+ if ($dialog->show)
+ {
+ $self->{bookmarksLoader}->save($dialog->getBookmarks);
+ }
+ }
+
+ sub editBookmark
+ {
+ my $self = shift;
+
+ #my $dialog = $self->getDialog('BookmarksEdit');
+ my $dialog = new GCBookmarksEditDialog($self);
+
+ $dialog->setBookmarksFolders($self->{bookmarksLoader}->{bookmarks});
+ if ($dialog->show)
+ {
+ $self->{bookmarksLoader}->save($dialog->getBookmarks);
+ }
+ }
+
+ sub addFileHistory
+ {
+ my ($self, $filename) = @_;
+
+ $filename =~ s|/|\\|g if $^O =~ /win32/i;
+ $self->{options}->historysize(5) if !$self->{options}->exists('historysize');
+ my $maxSize = $self->{options}->historysize;
+ my @historyArray = split(/\|/, $self->{options}->history);
+ my $idx = 0;
+ # Remove previous occurence in history if any
+ foreach my $file(@historyArray)
+ {
+ if ($filename eq $file)
+ {
+ splice @historyArray, $idx, 1;
+ last;
+ }
+ $idx++;
+ }
+ # Prepend filename
+ splice @historyArray, 0, 0, $filename;
+ # Shrink array if too big
+ if (scalar @historyArray > $maxSize)
+ {
+ $#historyArray = $maxSize - 1;
+ }
+ $self->{options}->history(join '|', @historyArray);
+ $self->{menubar}->{menuHistoryItem}->remove_submenu;
+ $self->{menubar}->{menuHistory} = new Gtk2::Menu;
+ $self->{menubar}->addHistoryMenu(\@historyArray);
+ }
+
+ sub openFile
+ {
+ my ($self, $filename) = @_;
+ return if !$self->checkAndSave;
+ my ($success, $error) = (1, undef);
+ $self->initProgress($self->{lang}->{StatusLoad});
+ $self->{openingFile} = 1;
+ my $previousFile = $self->{options}->file;
+ $self->setFile($filename);
+ $self->savePreferences;
+ my $previousModel;
+ $previousModel = $self->{model}->getName
+ if $self->{model};
+ my @collectionVersion = split(/\./, $self->{items}->getVersion($filename));
+ if (@collectionVersion)
+ {
+ my @softVersion = split (/\./, $self->{version});
+
+ # We only use 2 major numbers. Last one should not impact data
+ if (($collectionVersion[0] > $softVersion[0])
+ || (($collectionVersion[0] == $softVersion[0])
+ && ($collectionVersion[1] > $softVersion[1])))
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'warning',
+ 'yes-no',
+ $self->{lang}->{OpenVersionWarning}
+ ."\n\n"
+ .$self->{lang}->{OpenVersionQuestion});
+ $dialog->set_default_response('cancel');
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $success = 0 if $response eq 'no';
+ $dialog->destroy;
+ }
+ }
+
+ if ($success)
+ {
+ ($success, $error) = $self->{items}->load($filename, $self, 1);
+ if ($success)
+ {
+ $self->checkDefaultImage;
+ $self->{filterSearch}->clear if $previousModel ne $self->{model}->getName;
+ $self->refreshFilters;
+ $self->viewAllItems;
+ $self->addFileHistory($filename);
+ $self->{options}->save;
+ $self->selectFirst;
+ $self->refreshTitle;
+ $self->{menubar}->setLock($self->{items}->getLock);
+ $self->endProgress;
+ }
+ else
+ {
+ my $dialog = new GCCriticalErrorDialog(
+ $self,
+ GCUtils::formatOpenSaveError(
+ $self->{lang},
+ $filename,
+ $error
+ )
+ );
+ $dialog->show;
+ }
+ }
+
+ if (!$success)
+ {
+ if ($previousFile)
+ {
+ $self->openFile($previousFile);
+ }
+ else
+ {
+ $self->endProgress;
+ }
+ }
+ $self->{openingFile} = 0;
+ # Just to be sure
+ $self->{saveIsNeeded} = 0;
+ }
+
+ sub openList
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{lang}->{OpenList}, $self, 'open', 1);
+ $fileDialog->set_pattern_filter([$self->{lang}->{FileGCstarFiles}, '*.gcs']);
+
+ $fileDialog->set_filename($self->{options}->file);
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ my $fileName = $fileDialog->get_filename;
+ $fileDialog->destroy;
+ $self->openFile($fileName);
+ }
+ else
+ {
+ $fileDialog->destroy;
+ }
+ }
+
+ sub newList
+ {
+ my ($self, $modelName, $modelAlreadySet, $saveAlreadyDone) = @_;
+ return if !$saveAlreadyDone && !$self->checkAndSave;
+
+ if (!$modelAlreadySet)
+ {
+ if ($modelName)
+ {
+ $self->setCurrentModel(
+ $self->{modelsFactory}->getModel($modelName)
+ );
+ }
+ else
+ {
+ if ($self->getDialog('Models')->show)
+ {
+ if ($self->getDialog('Models')->isImporting)
+ {
+ $self->import($self->getDialog('Models')->getImporter);
+ return;
+ }
+ else
+ {
+ my $model = $self->getDialog('Models')->getModel;
+ if ($model->isEmpty)
+ {
+ $self->{model} = $model;
+ $self->editModel;
+ }
+ else
+ {
+ $self->setCurrentModel($model);
+ }
+ }
+ }
+ else
+ {
+ return if !$self->{initializing};
+ $self->setCurrentModel('GCfilms');
+ }
+ }
+ }
+
+ $self->{items}->clearList;
+ $self->reloadDone(1);
+ $self->setFile('');
+ $self->{menubar}->setAddBookmarkActive(0);
+ $self->refreshTitle;
+ }
+
+ sub saveAs
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{lang}->{SaveList}, $self, 'save', 1, 1);
+ $fileDialog->set_pattern_filter([$self->{lang}->{FileGCstarFiles}, '*.gcs']);
+ $fileDialog->set_filename($self->{options}->file);
+ my $response;
+ while (1)
+ {
+ $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ my $filename = $fileDialog->get_filename;
+ my $previousFile = $self->{options}->file;
+ my $prevImages = $self->getImagesDir;
+ $self->setFile($filename);
+ # We re-generate it because it could have changed with new file name
+ my $newImages = $self->getImagesDir;
+ if (($prevImages ne $newImages) || ($previousFile && ($previousFile ne $filename)))
+ {
+ # The last parameter is for copy. When saving a new file, we move.
+ $self->{items}->setNewImagesDirectory($newImages, $prevImages,
+ $previousFile ? 1 : 0);
+ $self->{items}->setPreviousFile($previousFile)
+ if ($previousFile ne $filename);
+ }
+ if ($self->saveList)
+ {
+ $self->addFileHistory($filename);
+ $self->{options}->save;
+ $self->refreshTitle;
+ last;
+ }
+ else
+ {
+ $self->setFile($previousFile);
+ }
+ }
+ last if ($response ne 'ok')
+ }
+ $fileDialog->destroy;
+
+ # Check if the user has cancelled the dialog without giving a filename, if so
+ # return false to the save as request
+ if ($response eq 'ok')
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+
+ sub checkAndSave
+ {
+ my $self = shift;
+ # Return value 1 means everything is OK.
+ # 0 means the user clicked cancel for save confirmation and then
+ # the process should be stopped.
+ if (!$self->{items}->getNbItems)
+ {
+ $self->removeUpdatedMark;
+ return 1;
+ }
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ return 1 if !$self->{saveIsNeeded};
+ if (($self->{options}->autosave) && ($self->{options}->file))
+ {
+ $self->saveList;
+ return 1;
+ }
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'warning',
+ 'none',
+ $self->{lang}->{SaveUnsavedChanges});
+ my $noButton = Gtk2::Button->new($self->{lang}->{SaveDontSave});
+ $dialog->add_action_widget($noButton, 'no');
+ my $cancelButton = Gtk2::Button->new_from_stock('gtk-cancel');
+ $dialog->add_action_widget($cancelButton, 'cancel');
+ my $saveButton = Gtk2::Button->new_from_stock('gtk-save');
+ $saveButton->can_default(1);
+ $dialog->add_action_widget($saveButton, 'yes');
+ $noButton->show_all;
+ $cancelButton->show_all;
+ $saveButton->show_all;
+ $dialog->set_default_response('yes');
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run();
+ $dialog->destroy;
+
+ if ($response eq 'yes')
+ {
+ my $saveResponse = $self->saveList;
+ # If save request has returned false, we need to cancel the current operation
+ return 0 if (!$saveResponse);
+ }
+
+
+ return 0 if $response eq 'cancel';
+ $self->removeUpdatedMark;
+
+ return 1;
+ }
+
+ sub saveList
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+ my $response = 'yes';
+ #$self->{itemsView}->{filter}->refilter;
+ if ($self->{options}->file)
+ {
+ my ($success, $error) = $self->{items}->save($self);
+ if ($success)
+ {
+ return 1;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ GCUtils::formatOpenSaveError(
+ $self->{lang},
+ $self->{options}->file,
+ $error
+ ));
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+ return 0;
+ }
+# $self->{items}->save($self);
+ }
+ else
+ {
+ # Run save as dialog
+ my $result = $self->saveAs;
+ # If result of dialog is false, user has cancelled without choosing a filename, so we return false
+ # to the save request to cancel operation
+ if ($result)
+ {
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+ }
+
+ sub selectFirst
+ {
+ my $self = shift;
+
+ $self->{items}->display($self->{items}->select(-1));
+ }
+
+ sub removeSearch
+ {
+ my ($self, $noRefresh) = @_;
+ $self->setFilter('', '', $noRefresh);
+ # Clear search mode
+ $self->{filterSearch}->setMode;
+ $self->{toolbar}->removeSearch
+ if $self->{toolbar};
+ }
+
+ sub search
+ {
+ my ($self, $self2, $value) = @_;
+ $self = $self2 if ($self2 ne 'all') && ($self2 ne 'displayed');
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ $self->{items}->displayCurrent;
+ my $type = 'all';
+ $type = $value if ($self != $self2);
+
+ $self->getDialog('Search')->show;
+
+ my $info = $self->getDialog('Search')->search;
+ return if ! $info;
+
+ $self->{menubar}->selectAll if $type eq 'all';
+ $self->setSearch($info);
+ }
+
+ sub advancedSearch
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('AdvancedSearch');
+ $dialog->initSearch($self->{filterSearch}->getCurrentSearch);
+ $dialog->show;
+ my $info = $dialog->search;
+ return if ! $info;
+ $self->setSearchWithTypes(info => $info,
+ mode => $dialog->getMode,
+ case => $dialog->getCase,
+ ignoreDiacritics => $dialog->getIgnoreDiacritics);
+ }
+
+ sub addUserFilter
+ {
+ my ($self, $filter) = @_;
+ $self->{model}->addUserFilter($filter);
+ $self->{menubar}->createUserFilters($self->{model});
+ $self->{toolbar}->createUserFilters($self->{model});
+ }
+
+ sub saveCurrentSearch
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('AdvancedSearch');
+ $dialog->initSearch($self->{filterSearch}->getCurrentSearch);
+ $dialog->saveSearch;
+ }
+
+ sub editSavedSearches
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('UserFilters');
+ $self->{model}->saveUserFilters;
+ $dialog->setModel($self->{model});
+ if ($dialog->show)
+ {
+ $self->{model}->setUserFilters($dialog->getUserFilters);
+ $self->{model}->deleteUserFilters($dialog->getDeletedFilters);
+ $self->{menubar}->createUserFilters($self->{model});
+ $self->{toolbar}->createUserFilters($self->{model});
+ }
+ }
+
+ sub showBorrowed
+ {
+ my $self = shift;
+ $self->{items}->updateSelectedItemInfoFromPanel;
+ $self->getDialog('Borrowed')->setList($self->{items}, $self->{model});
+ $self->getDialog('Borrowed')->show;
+ }
+
+ sub export
+ {
+ my ($self, $exporter) = @_;
+ $self->getDialog('Export')->setModule($exporter);
+ $self->getDialog('Export')->show;
+ }
+
+ sub import
+ {
+ my ($self, $importer) = @_;
+ $self->getDialog('Import')->setModule($importer);
+ $self->getDialog('Import')->show;
+ }
+
+ sub importWithDetect
+ {
+ my ($self, $file, $realPath) = @_;
+
+ if (!$realPath)
+ {
+ $file =~ s/^file:\/\/(.*)\W*$/$1/;
+ $file =~ s/.$//ms;
+ }
+
+ foreach my $importer(@GCImport::importersArray)
+ {
+ my $current = $importer->getSuffix;
+ next if !$current;
+ #if ($current eq $suffix)
+ if ($file =~ /$current$/)
+ {
+ $self->setWaitCursor($self->{lang}->{StatusGetInfo});
+ my %options;
+ $options{parent} = $self;
+ $options{newList} = 0;
+ $options{file} = $file;
+ $options{lang} = $self->{lang};
+ $importer->process(\%options);
+ #$self->restoreCursor;
+ return 1;
+ }
+ }
+ return 0;
+ }
+
+ sub optionsError
+ {
+ my ($self, $type, $errmsg) = @_;
+
+ my $msg;
+ if ($type eq 'open')
+ {
+ $msg = $self->{lang}->{OptionsOpenError};
+ }
+ elsif ($type eq 'create')
+ {
+ $msg = $self->{lang}->{OptionsCreateError};
+ }
+ else
+ {
+ $msg = $self->{lang}->{OptionsSaveError};
+ }
+
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $msg.$self->{options}->{file}."\n$errmsg");
+
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy ;
+
+ $self->destroy;
+ }
+
+ sub checkImagesDirectory
+ {
+ my ($self, $withDialog) = @_;
+ my $error = 0;
+ my $imagesDir = $self->getImagesDir;
+ if ( ! -e $imagesDir)
+ {
+ eval {mkpath $imagesDir};
+ $error = 1 if (! -e $imagesDir) && (-e $self->{options}->file);
+ }
+ else
+ {
+ #$error = 1 if !( -d _ && -r _ && -w _ && -x _ )
+ # _ cannot be used when filtest access is on
+ $error = 1 if !( -d $imagesDir && -r $imagesDir && -w $imagesDir && -x $imagesDir );
+ }
+ if ($error)
+ {
+ my $itemsImagesDir = '';
+ $itemsImagesDir = $self->{items}->getInformation->{images}
+ if $self->{items};
+ if ($itemsImagesDir)
+ {
+ # Problem was because of a specific image dir, we clear it
+ $self->{items}->getInformation->{images} = '';
+ # And we check again
+ $error = $self->checkImagesDirectory(0);
+ }
+ }
+ return $error if !$withDialog;
+ if ($error)
+ {
+ $self->{splash}->hide if $self->{splash};
+ my $fileDialog = new GCFileChooserDialog($self->{lang}->{FileChooserOpenDirectory}, $self, 'select-folder');
+ my $errorDialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{lang}->{ImageError});
+
+ $errorDialog->set_position('center-on-parent');
+ $fileDialog->set_filename($imagesDir);
+ my $response;
+ do
+ {
+ $errorDialog->run();
+ $errorDialog->hide();
+ $response = '';
+ $response = $fileDialog->run;
+ exit 1 if $response ne 'ok';
+ $self->{options}->images($fileDialog->get_filename);
+ } while ($self->checkImagesDirectory(0));
+ $errorDialog->destroy;
+ $fileDialog->destroy;
+ }
+ return $error;
+ }
+
+ sub setFile
+ {
+ my ($self, $filename) = @_;
+
+ $self->{options}->file($filename);
+ $self->{menubar}->setAddBookmarkActive($filename ne '');
+ }
+
+ sub refreshTitle
+ {
+ my $self = shift;
+ my $name = '';
+ if ($self->{options}->file)
+ {
+ $name = $self->{items}->getInformation->{name}
+ if $self->{items};
+ $name ||= basename($self->{options}->file);
+ }
+ else
+ {
+ $name = $self->{lang}->{UnsavedCollection};
+ }
+ $self->{windowTitle} = $name.' - GCstar';
+ $self->set_title($self->{windowTitle});
+ }
+
+ sub properties
+ {
+ my $self = shift;
+
+ my $prevImages = $self->getImagesDir;
+
+ my $dialog = $self->getDialog('Properties');
+ $dialog->setProperties($self->{items}->getInformation,
+ $self->{options}->file,
+ $self->{items}->getNbItems);
+ if ($dialog->show)
+ {
+ $self->{items}->setInformation($dialog->getProperties);
+ $self->checkDefaultImage;
+ $self->refreshTitle;
+ # We check if it has changed
+ my $newImages = $self->getImagesDir;
+ if ($prevImages ne $newImages)
+ {
+ # Here we want to move pictures
+ $self->{items}->setNewImagesDirectory($newImages, $prevImages, 0);
+ }
+ $self->checkSpellChecking;
+ #$self->moveImages($prevImages, $self->{items}->getInformation->{images});
+ $self->markAsUpdated;
+ }
+ }
+
+ sub markAsUpdated
+ {
+ my $self = shift;
+ $self->{saveIsNeeded} = 1;
+ $self->set_title('*'.$self->{windowTitle});
+ $self->{menubar}->setSaveActive(1);
+ $self->{toolbar}->setSaveActive(1);
+ }
+
+ sub removeUpdatedMark
+ {
+ my $self = shift;
+ $self->{saveIsNeeded} = 0;
+ $self->set_title($self->{windowTitle});
+ $self->{menubar}->setSaveActive(0);
+ $self->{toolbar}->setSaveActive(0);
+
+ # Make sure the panel status is resetted
+ for my $field (@{$self->{model}->{fieldsNotFormatted}})
+ {
+ $self->{panel}->{$field}->resetChanged
+ if $self->{panel}->{$field};
+ }
+ $GCGraphicComponent::somethingChanged = 0;
+ }
+
+ sub refreshFilters
+ {
+ my $self = shift;
+ $self->{menubar}->refreshFilters;
+ }
+
+ sub setWaitCursor
+ {
+ my ($self, $message) = @_;
+ $self->setStatus($message);
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('watch'));
+ GCUtils::updateUI;
+ }
+ sub restoreCursor
+ {
+ my $self = shift;
+ $self->restoreStatus;
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('left_ptr'));
+ GCUtils::updateUI;
+ }
+
+ sub setFilter
+ {
+ my ($self, $filter, $parameter, $noRefresh) = @_;
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ $self->{filterSearch}->setFilter($filter, $parameter,
+ $self->{model}->getFilterType($filter),
+ $self->{model});
+ $self->filter(1) unless $noRefresh;
+ }
+
+ sub setQuickSearch
+ {
+ my ($self, $field, $value) = @_;
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ my $isNumeric = ($self->{model}->{fieldsInfo}->{$field}->{type} eq 'number');
+ $self->{filterSearch}->setFilter($field, $value,
+ ['contain', $isNumeric, undef],
+ $self->{model});
+ $self->filter(1);
+ }
+
+ sub setSearch
+ {
+ my ($self, $info) = @_;
+ $self->{filterSearch}->clear;
+ $self->{filterSearch}->setFilter($_,
+ $info->{$_},
+ $self->{model}->getFilterType($_),
+ $self->{model})
+ foreach (keys %$info);
+
+ $self->filter(1);
+ }
+
+ sub setSearchWithTypes
+ {
+ my ($self, %searchParameters) = @_;
+
+ $self->{filterSearch}->clear;
+ $self->{filterSearch}->setMode($searchParameters{mode});
+ $self->{filterSearch}->setCase($searchParameters{case});
+ $self->{filterSearch}->setIgnoreDiacritics($searchParameters{ignoreDiacritics});
+ foreach (@{$searchParameters{info}})
+ {
+ $self->{filterSearch}->setFilter($_->{field},
+ $_->{value},
+ $_->{filter},
+ $self->{model},
+ 1);
+ }
+ $self->filter(1);
+ #$self->{filterSearch}->removeTemporaryFilters;
+
+ # What's the point of this line? It clears the filter mode so all filters return to "and" types
+ # resulting in filtered exports giving unexpected results.
+ # Removed 28/10/2009 by zombiepig, but I'm not sure if there'll be unexpected side effects
+ # $self->{filterSearch}->setMode;
+ }
+
+ sub checkPanelVisibility
+ {
+ my $self = shift;
+ if ($self->{itemsView}->getNbItems)
+ {
+ $self->{panel}->show;
+ }
+ else
+ {
+ $self->{panel}->hide(1);
+ }
+ }
+
+ sub filter
+ {
+ my ($self, $refresh, $splash) = @_;
+ $self->{filterSearch}->setModel($self->{model});
+ my $current = $self->{itemsView}->setFilter($self->{filterSearch},
+ $self->{items}->getItemsListFiltered,
+ $refresh,
+ $splash);
+ $self->{items}->display($current);
+ $self->{itemsView}->select($current, 1);
+
+ $self->checkPanelVisibility;
+
+ $self->setNbItems;
+ }
+
+ sub reloadDone
+ {
+ my ($self, $noFilter, $splash) = @_;
+ my $reloadOnDone = $self->{initializing};
+ my $needFilter = ! ($reloadOnDone || $noFilter);
+ if ($self->{itemsView})
+ {
+ $self->{itemsView}->setSortOrder(undef, $splash, $needFilter);
+ $self->{itemsView}->done($splash, $reloadOnDone);
+ }
+ $self->filter(1, $splash) if $needFilter;
+ $self->setNbItems;
+ }
+
+ sub getDialog
+ {
+ my ($self, $name) = @_;
+
+ if ($name eq 'PluginsAsk')
+ {
+ $self->{PluginsAskDialog} = new GCPluginsDialog($self)
+ if !$self->{PluginsAskDialog};
+ }
+ elsif ($name eq 'MultiSite')
+ {
+ $self->{MultiSiteDialog}->{$self->{model}->getName} = new GCMultiSiteDialog($self, $self->{model})
+ if !$self->{MultiSiteDialog}->{$self->{model}->getName};
+ return $self->{MultiSiteDialog}->{$self->{model}->getName};
+ }
+
+ elsif ($name eq 'MultiSitePerField')
+ {
+ $self->{MultiSitePerFieldDialog}->{$self->{model}->getName} = new GCMultiSitePerFieldDialog($self, $self->{model},1)
+ if !$self->{MultiSitePerFieldDialog}->{$self->{model}->getName};
+ return $self->{MultiSitePerFieldDialog}->{$self->{model}->getName};
+ }
+ elsif ($name eq 'About')
+ {
+ $self->{AboutDialog} = new GCAboutDialog($self, $self->{version})
+ if ! $self->{AboutDialog};
+ }
+ elsif ($name eq 'Models')
+ {
+ $self->{ModelsDialog} = new GCModelsDialog($self,
+ $self->{modelsFactory},
+ 1)
+ if ! $self->{ModelsDialog};
+ }
+ else
+ {
+ my $className = 'GC'.$name.'Dialog';
+ if (! $self->{$name.'Dialog'})
+ {
+ $self->{$name.'Dialog'} = new $className($self);
+ # Actually Plugins, Export and Import don't need the parameter, but
+ # it has no impact and make the code more simple
+ $self->{$name.'Dialog'}->setModel($self->{model})
+ if $name =~ /^(AdvancedSearch|Search|Options|QueryReplace|Plugins|Export|Import)$/
+ && $self->{model};
+ }
+ }
+
+ return $self->{$name.'Dialog'};
+ }
+
+ sub options
+ {
+ my ($self, $self2,$tabToShow) = @_;
+ $self = $self2 if $self2;
+ my $transform = $self->{options}->transform;
+ my $articles = $self->{options}->articles;
+ my $formats = $self->{options}->formats;
+ my $layout = $self->{model}->{preferences}->layout;
+ my $panelStyle = $self->{options}->panelStyle;
+ my $toolbar = $self->{options}->toolbar;
+ my $toolbarPosition = $self->{options}->toolbarPosition;
+ my $prevImages = $self->getImagesDir;
+ my $expandersMode = $self->{options}->expandersMode;
+ my $dateFormat = $self->{options}->dateFormat;
+ my $spellCheck = $self->{options}->spellCheck;
+ my $imageEditor = $self->{options}->imageEditor;
+ my $programs = $self->{options}->programs;
+ my $useStars = $self->{options}->useStars;
+
+ $self->savePreferences;
+
+ $self->getDialog('Options')->show($tabToShow);
+
+ my $newImages = $self->getImagesDir;
+ if ($prevImages ne $newImages)
+ {
+ # Here we want to move pictures
+ $self->{items}->setNewImagesDirectory($newImages, $prevImages, 0);
+ $self->markAsUpdated;
+ }
+
+ $self->checkTransform
+ if ($self->{options}->articles ne $articles)
+ || ($self->{options}->transform != $transform);
+
+ # Need to reload the panel if the layout or style has changed
+ $self->changePanel(0,0)
+ if ($self->{model}->{preferences}->layout ne $layout)
+ || ($self->{options}->panelStyle ne $panelStyle)
+ || ($self->{options}->useStars ne $useStars);
+
+ $self->{panel}->setExpandersMode($self->{options}->expandersMode)
+ if $expandersMode ne $self->{options}->expandersMode;
+
+ if ($dateFormat ne $self->{options}->dateFormat)
+ {
+ $self->{panel}->setDateFormat($self->{options}->dateFormat);
+
+ # TODO We could optimize this with a method setDateFormat on
+ # items view that would only change what needed
+ if ($self->{itemsView} # We have a view
+ && ($self->{itemsView}->isUsingDate) # It uses the date format
+ && (!$self->getDialog('Options')->{viewChanged})) # And we didn't already change it
+ {
+ $self->setItemsList(0, 1); # Then we re-create it
+ }
+ }
+
+ if ($spellCheck ne $self->{options}->spellCheck)
+ {
+ $self->checkSpellChecking;
+ }
+
+ $self->checkToolbarPosition
+ if ($self->{options}->toolbarPosition ne $toolbarPosition) || ($self->{options}->toolbar ne $toolbar);
+
+ $self->{menubar}->setDisplayToolbarState($self->{options}->toolbar == 0 ? 0 : 1)
+ if $self->{options}->toolbar != $toolbar;
+
+ $self->checkPlugin;
+ $self->checkView;
+ #$self->checkToolbarOptions
+ }
+
+ sub displayOptions
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ my $dialog = $self->getDialog('DisplayOptions');
+ my $hidden = $self->{model}->{preferences}->hidden;
+ $dialog->show;
+ if ($self->{model}->{preferences}->hidden ne $hidden)
+ {
+ $self->checkPanelContent;
+ $self->markAsUpdated
+ if $self->{model}->isInline;
+ }
+
+ }
+
+ sub toolbarOptions
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ my $dialog = $self->getDialog('ToolbarOptions');
+ if ($dialog->show eq 'ok')
+ {
+ $self->removeToolbar;
+ $self->{toolbar}->destroy;
+ $self->{toolbar} = GCToolBar->new($self);
+ $self->{toolbar}->setModel($self->{model})
+ if $self->{model};
+ $self->checkToolbarOptions;
+ $self->checkToolbarPosition(1);
+ }
+ }
+
+ sub getUserModelsDirError
+ {
+ my $self = shift;
+ return $self->{lang}->{ErrorModelUserDir}
+ .$self->{modelsFactory}->{persoDirectory};
+ }
+
+ sub setCurrentModel
+ {
+ my ($self, $model) = @_;
+ $model = 'GCfilms' if ! $model;
+ $self->savePreferences;
+ $self->{model}->save if $self->{model} && (ref($self->{model}) ne 'HASH');
+ if ((ref $model) =~ /GCModelLoader/)
+ {
+ $self->{model} = $model;
+ }
+ else
+ {
+ $self->{model} = $self->{modelsFactory}->getModel($model)
+ }
+ if (!$self->{model})
+ {
+ return 0;
+ }
+ $self->{items}->initModel($self->{model});
+ return 1;
+ }
+
+ sub preloadModel
+ {
+ my ($self, $model) = @_;
+ # Preload the model into the factory cache
+ $self->{modelsFactory}->getModel($model);
+ }
+
+ sub setCurrentModelFromInline
+ {
+ my ($self, $container) = @_;
+ my $model = GCModelLoader->newFromInline($self, $container);
+ $self->setCurrentModel($model);
+ }
+
+ sub addFieldsToDefaultModel
+ {
+ my ($self, $inlineModel) = @_;
+ my $model = GCModelLoader->newFromInline($self, {inlineModel => $inlineModel, defaultModifier => 1});
+ $self->{model}->addFields($model);
+ $self->notifyModelChange;
+ }
+
+ sub setGrouping
+ {
+ my ($self, $field) = @_;
+ # Automatically switch to detailed list if the current one is text list
+ $self->{options}->view(2)
+ if $self->{options}->view == 0;
+ $self->{model}->{preferences}->groupBy($field);
+ $self->setItemsList(0);
+ }
+
+ sub setLock
+ {
+ my ($self, $value) = @_;
+ $self->{items}->setLock($value);
+ $self->{panel}->changeState($self->{panel}, $value);
+ $self->markAsUpdated;
+ }
+
+ sub notifyModelChange
+ {
+ my ($self, $modelUpdated) = @_;
+
+ # Might need to recreate the Tonight window
+ $self->{remakeItemWindow}->{random} = 1
+ if exists($self->{itemWindow}->{random});
+ $self->{remakeItemWindow}->{item} = 1
+ if exists($self->{itemWindow}->{item});
+ $self->{remakeItemWindow}->{defaultValues} = 1
+ if exists($self->{itemWindow}->{defaultValues});
+
+ # Update strings to reflect model change
+ $self->GCLang::updateModelSpecificStrings;
+
+ #We deactivate some updates
+ my $previousInitializing = $self->{initializing};
+ $self->{initializing} = 1;
+ $self->checkDefaultImage;
+ $self->setItemsList(1, 1);
+ $self->getDialog('DisplayOptions')->createContent($self->{model});
+ $self->changePanel(1, $modelUpdated);
+ if (%{$self->{panel}})
+ {
+ $self->{panel}->createContent($self->{model});
+ $self->{panel}->deactivate if $self->{items}->getLock;
+ }
+ $self->{menubar}->setModel($self->{model});
+ $self->{toolbar}->setModel($self->{model});
+ # Update strings in dialogs if needed
+ $self->updateDialogStrings;
+ $self->checkToolbarOptions;
+
+ $self->getDialog('Search')->setModel($self->{model})
+ if $self->{SearchDialog};
+ $self->getDialog('AdvancedSearch')->setModel($self->{model})
+ if $self->{AdvancedSearchDialog};
+ $self->getDialog('Options')->setModel($self->{model})
+ if $self->{OptionsDialog};
+ $self->getDialog('QueryReplace')->setModel($self->{model})
+ if $self->{QueryReplaceDialog};
+ $self->getDialog('Plugins')->setModel
+ if $self->{PluginsDialog};
+ $self->getDialog('ImportFields')->setModel($self->{model})
+ if $self->{ImportFieldsDialog};
+ $self->getDialog('Export')->setModel
+ if $self->{ExportDialog};
+ $self->getDialog('Import')->setModel
+ if $self->{ImportDialog};
+
+ $self->checkPlugin;
+
+ $self->{initializing} = $previousInitializing;
+ }
+
+ sub updateDialogStrings
+ {
+ my $self = shift;
+
+ # Update model-specific text strings in dialog boxes
+ $self->getDialog('Properties')->{info}->{itemsLabel}->set_label($self->{lang}->{PropertiesItemsNumber});
+ $self->getDialog('Borrowed')->set_title($self->{lang}->{BorrowedTitle});
+ $self->getDialog('Borrowed')->{returned}->get_children->set_label($self->{lang}->{PanelReturned});
+ $self->getDialog('Borrowed')->{display}->get_children->set_label($self->{lang}->{BorrowedDisplayInPanel});
+ $self->getDialog('Search')->set_title($self->{lang}->{SearchTitle});
+ $self->getDialog('AdvancedSearch')->set_title($self->{lang}->{SearchTitle});
+ }
+
+ sub editModel
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('ModelsSettings');
+ my $isPersonal = $self->{model}->isPersonal;
+ $dialog->setPersonalMode($isPersonal);
+ $dialog->setDescription($self->{model}->getDescription);
+ if ($isPersonal)
+ {
+ $dialog->initFields($self->{model}->getOriginalCollection->{fields}->{field},
+ $self->{model}->getGroups,
+ $self->{model}->getCommonFields,
+ $self->{model}->{hasLending},
+ $self->{model}->{hasTags});
+ $dialog->initFilters($self->{model}->{filters});
+ }
+ else
+ {
+ $dialog->initFields($self->{model}->getAddedFields,
+ $self->{model}->getAddedGroups);
+ }
+ if ($dialog->show)
+ {
+ $self->markAsUpdated;
+ if ($isPersonal)
+ {
+ my $file;
+ ($self->{model}->{collection}->{description}, $self->{model}->{collection}->{name}, $file)
+ = $dialog->getName;
+
+ my %fields = (
+ id => $dialog->getIdField,
+ title => $dialog->getTitleField,
+ cover => $dialog->getCoverField,
+ play => $dialog->getPlayField,
+ );
+ $self->{model}->setOptions(\%fields, 'no.png');
+ $self->{model}->setGroups($dialog->getGroups);
+ $self->{model}->setFields($dialog->{fields}, $dialog->hasLending, $dialog->hasTags);
+ $self->{model}->setFilters($dialog->getFilters($self->{model}->{fieldsInfo}));
+ if ($self->{model}->{collection}->{name})
+ {
+ $self->{model}->saveToFile($file);
+ # This is done twice, because the 1st time the model thought it is online
+ $self->{model}->loadPreferences;
+ }
+ }
+ else
+ {
+ $self->{model}->updateAddedFields($dialog->{fields}, $dialog->getGroups);
+ }
+ #$self->notifyModelChange;
+ $self->{items}->initModel($self->{model}, 1);
+ $self->reloadList;
+ }
+ }
+
+ sub borrowers
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ $self->getDialog('Borrowers')->show;
+ $self->checkBorrowers;
+ # Some models could use the borrower as a filter
+ # TODO only refresh filters when needed (see previous line)
+ $self->refreshFilters;
+ }
+
+# sub genresConversion
+# {
+# my ($self, $self2) = @_;
+# $self = $self2 if $self2;
+#
+# $self->getDialog('GenresGroups')->show;
+# }
+
+ sub queryReplace
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ if ($self->getDialog('QueryReplace')->show)
+ {
+ $self->{items}->queryReplace($self->getDialog('QueryReplace')->{field},
+ $self->getDialog('QueryReplace')->{oldValue},
+ $self->getDialog('QueryReplace')->{newValue},
+ $self->getDialog('QueryReplace')->{caseSensitive});
+ $self->markAsUpdated;
+ }
+ }
+
+ sub about
+ {
+ my $self = shift;
+
+ $self->getDialog('About')->show;
+ }
+
+ sub stats
+ {
+ my $self = shift;
+ my $dialog = $self->getDialog('Stats');
+ (my $title = $self->{windowTitle}) =~ s/ - GCstar$//;
+ $dialog->setData($self->{model}, $self->{items}->getItemsListFiltered, $title);
+ $dialog->show;
+ #my $dialog = new GCStatsDialog($self);
+ #$dialog->setData($self->{model}, $self->{items}->getItemsListFiltered);
+ #$dialog->show;
+ }
+
+ sub showDependencies
+ {
+ my $self = shift;
+ $self->getDialog('Dependencies')->show;
+ }
+
+ sub showAllPlugins
+ {
+ my $self = shift;
+ $self->getDialog('AllPlugins')->show;
+ }
+
+ sub help
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ $self->launch('http://wiki.gcstar.org/', 'url');
+ }
+
+ sub reportBug
+ {
+ my ($self, $self2, $subject, $message) = @_;
+ $self = $self2 if $self2;
+
+ my %topicIds = (
+ EN => '4',
+ FR => '9'
+ );
+
+ my $id = $topicIds{$self->{options}->lang} || $topicIds{EN};
+
+ my $url;
+ if ($message)
+ {
+ # TODO: Move this part across to launchpad when https://bugs.launchpad.net/malone/+bug/552142 is fixed
+ $url = 'http://forums.gcstar.org/postbug.php?req_subject='.uri_escape($subject).'&req_message='.uri_escape($message).'&fid='.$id;
+ $url =~ s/\(/%28/g;
+ $url =~ s/\)/%29/g;
+ }
+ else
+ {
+ $url = 'https://bugs.launchpad.net/gcstar/+filebug';
+ }
+ $self->launch($url, 'url');
+ }
+
+ sub playItem
+ {
+ my $self = shift;
+ my $field = $self->{model}->{commonFields}->{play};
+ my $format = $self->{model}->{fieldsInfo}->{$field}->{format};
+ $self->launch($self->{panel}->$field, $format);
+ }
+
+ sub launch
+ {
+ my ($self, $file, $format, $withParams, $windowParent) = @_;
+
+ $format ||= 'program';
+ my $command;
+ # For image, we have an internal viewer
+ if ($format eq 'image')
+ {
+ $file = GCUtils::getDisplayedImage($file, '', $self->{options}->file);
+ my $dialog = new GCImageDialog($self, $file, $windowParent);
+ $dialog->show;
+ $dialog->destroy;
+
+ if ((exists $self->{itemWindow}->{item}) && ($self->{itemWindow}->{item}->visible))
+ {
+ $self->{itemWindow}->{item}->showMe;
+ }
+ return;
+ }
+ elsif ($format eq 'program')
+ {
+ if ($^O =~ /win32/i)
+ {
+ # Encode filename to work with foreign characters
+ $file = Encode::encode("iso-8859-1", $file);
+
+ if ($withParams)
+ {
+ $command = $file;
+ }
+ else
+ {
+ $file =~ s/([^\\])"/$1\\"/g;
+ $command = '"'.$file.'"';
+ }
+ }
+ else
+ {
+ $command = $file;
+ }
+ }
+ else
+ {
+ # For the other ones, we use external programs
+
+ if ($self->{options}->programs eq 'user')
+ {
+ $command = $self->{options}->browser if $format eq 'url';
+ $command = $self->{options}->player if $format eq 'video';
+ $command = $self->{options}->audio if $format eq 'audio';
+ }
+
+ # If using system default programs, or user has not overriden system default
+ if (( $self->{options}->programs eq 'system' ) || ( !$command ))
+ {
+ $command = ($^O =~ /win32/i) ? ''
+ : ($^O =~ /macos/i) ? '/usr/bin/open'
+ : $ENV{GCS_SHARE_DIR}.'/helpers/xdg-open';
+ }
+
+ if ($file && ($format ne 'url'))
+ {
+ if ($file !~ /^(http|ftp)/)
+ {
+ my $dialog;
+
+ # Encode filename to work with foreign characters under Win32
+ $file = Encode::encode("iso-8859-1", $file) if ($^O =~ /win32/i);
+
+ while (! -e $file)
+ {
+ if (!$dialog)
+ {
+ $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'warning',
+ 'none',
+ $self->{lang}->{PlayFileNotFound}."\n\n".$file);
+ my $cancelButton = Gtk2::Button->new_from_stock('gtk-cancel');
+ $dialog->add_action_widget($cancelButton, 'cancel');
+ my $retryButton = Gtk2::Button->new($self->{lang}->{PlayRetry});
+ $retryButton->can_default(1);
+ $dialog->add_action_widget($retryButton, 'yes');
+ $cancelButton->show_all;
+ $retryButton->show_all;
+ $dialog->set_default_response('yes');
+ $dialog->set_position('center-on-parent');
+ }
+ my $response = $dialog->run;
+ last if $response eq 'cancel';
+ }
+ $dialog->destroy if $dialog;
+ return if ! -e $file;
+ }
+ }
+
+ if ($^O =~ /win32/i)
+ {
+ $command = '"'.$command.'"' if $command;
+ $file =~ s/([^\\])"/$1\\"/g;
+ $command .= ' "'.$file.'"';
+ }
+ else
+ {
+ $file =~ s/([^\\])"/$1\\"/g;
+ #"
+ $command .= ' "'.$file.'"';
+ }
+
+ }
+
+ return if !$command;
+ # Finalize the command line
+ if ($^O =~ /win32/i)
+ {
+ system("start \"\" $command");
+ }
+ else
+ {
+ system "$command &";
+ }
+ if ($ENV{GCS_SET_FAVOURITE_AFTER_PLAY})
+ {
+ my $current = $self->{panel}->favourite;
+ $self->{panel}->favourite($current ? 0 : 1);
+ $self->{items}->updateSelectedItemInfoFromPanel(1);
+ }
+ }
+
+ sub sendBorrowerEmail
+ {
+ my ($self, $info) = @_;
+
+ $self->{mailer} = new GCMailer($self) if ! $self->{mailer};
+ $self->{mailer}->sendBorrowerEmail($info);
+ }
+
+ sub extractInfo
+ {
+ my ($self, $file, $panel) = @_;
+
+ my $infoExtractor = $self->{model}->getExtracter($self, $file, $panel, $self->{model});
+ #$self->getDialog('Extract')->setInfo($infoExtractor->getInfo, $panel);
+ #$self->getDialog('Extract')->show;
+ my $dialog = new GCExtractDialog($self, $self->{model}, $infoExtractor);
+ $dialog->setInfo($infoExtractor, $panel);
+ $dialog->show;
+ }
+
+ sub setStatus
+ {
+ my ($self, $status) = @_;
+ $self->{status}->push(1, $status) if ($self->{status});
+ }
+
+ sub restoreStatus
+ {
+ my $self = shift;
+ $self->{status}->pop(1);
+ }
+
+ sub setNbItems
+ {
+ my $self = shift;
+
+ return if !$self->{itemsView};
+ my $number = $self->{itemsView}->getNbItems;
+ my $status = " $number ".$self->{model}->getDisplayedItems($number);
+ $self->setStatus($status);
+ }
+
+ sub updateSelectedItemInfoFromGivenPanelAndSelect
+ {
+ my ($self, $panel, $idx) = @_;
+ $self->{items}->updateSelectedItemInfoFromGivenPanel($panel);
+ $self->{items}->displayInPanel($self->{panel}, $idx);
+ #Init combo boxes
+ foreach(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$_}->setValues($panel->getValues($_));
+ }
+ }
+
+ sub display
+ {
+ my ($self, @idx) = @_;
+ if ($self->{items}->display(@idx))
+ {
+ $self->setNbItems;
+ }
+ }
+
+ sub getItemWindow
+ {
+ my ($self, $type) = @_;
+
+ my $created = 0;
+
+ if ((! exists $self->{itemWindow}->{$type}) || ($self->{remakeItemWindow}->{$type}))
+ {
+ $self->{itemWindow}->{$type}->destroy
+ if exists $self->{itemWindow}->{$type};
+
+ $self->{itemWindow}->{$type} =
+ ($type eq 'item') ? new GCItemWindow($self, "") :
+ ($type eq 'random') ? new GCRandomItemWindow($self, "") :
+ ($type eq 'defaultValues') ? new GCDefaultValuesWindow($self, "") :
+ undef;
+ $created = 1;
+ $self->{remakeItemWindow}->{$type} = 0
+ }
+
+ my $window = $self->{itemWindow}->{$type};
+
+ if ($created && $self->{options}->exists('itemWindowWidth'))
+ {
+ $window->set_default_size(
+ $self->{options}->itemWindowWidth,
+ $self->{options}->itemWindowHeight
+ );
+ }
+
+ if ($self->{previousWindowPosition})
+ {
+ $window->move($self->{previousWindowPosition}->{x},
+ $self->{previousWindowPosition}->{y});
+ }
+ $window->{panel}->setBorrowers;
+ $window->{panel}->disableBorrowerChange;
+
+ return $window;
+ }
+
+ sub saveItemWindowSettings
+ {
+ my ($self, $window) = @_;
+
+ my ($width, $height) = $window->get_size;
+ $self->{options}->itemWindowWidth($width);
+ $self->{options}->itemWindowHeight($height);
+
+ ($self->{previousWindowPosition}->{x}, $self->{previousWindowPosition}->{y})
+ = $window->get_position;
+ }
+
+ sub displayInWindow
+ {
+ my ($self, $idx, $type, $select) = @_;
+
+ $type ||= 'item';
+
+ my $title = $self->{items}->getTitle($idx);
+
+ my $window = $self->getItemWindow($type);
+ $window->setTitle($title);
+
+ $self->{items}->displayInPanel($window->{panel}, $idx);
+ $window->{panel}->selectTitle if $select;
+
+ my $code = $window->show;
+
+ if (($type eq 'item') && ($code eq 'ok'))
+ {
+ $self->updateSelectedItemInfoFromGivenPanelAndSelect($window->{panel}, $idx);
+ $self->refreshFilters;
+ }
+
+ $self->saveItemWindowSettings($window);
+
+ $window->hide;
+
+ return $code;
+ }
+
+ sub randomItem
+ {
+ my ($self) = @_;
+ my @tmpArray = undef;
+ $self->{items}->updateSelectedItemInfoFromPanel;
+
+ my $message = '';
+
+ #Initialize items array.
+ $self->{randomPool} = [];
+ my $realId = 0;
+ my $filterSearch = new GCFilterSearch;
+ foreach my $filter(@{$self->{model}->{random}})
+ {
+ $filterSearch->setFilter($filter->{field},
+ $filter->{value},
+ [$filter->{comparison}, $filter->{numeric}],
+ $self->{model});
+ }
+
+ foreach (@{$self->{items}->getItemsListFiltered})
+ {
+ #if (!$_->{seen})
+ if ($filterSearch->test($_))
+ {
+ $_->{realId} = $realId;
+ push @{$self->{randomPool}}, $_;
+ }
+ $realId++;
+ }
+
+ if (scalar @{$self->{randomPool}} > 0)
+ {
+ my $code = 'no';
+ my $idx = 0;
+ while ($code eq 'no')
+ {
+ $idx = int rand(scalar @{$self->{randomPool}});
+ $realId = $self->{randomPool}->[$idx]->{realId};
+ $code = $self->displayInWindow($realId, 'random');
+ splice @{$self->{randomPool}}, $idx, 1;
+ last if ! @{$self->{randomPool}};
+ }
+ $message = $self->{lang}->{RandomEnd} if $code eq 'no';
+ if ($code eq 'ok')
+ {
+ foreach my $filter(@{$self->{model}->{random}})
+ {
+ next if !exists $filter->{after};
+ my $field = $filter->{field};
+ ($self->{items}->getItemsListFiltered)->[$realId]->{$field} = $filter->{after};
+ $self->{panel}->$field($filter->{after})
+ if $self->{items}->{currentItem} == $realId;
+ }
+ }
+ }
+ else
+ {
+ $message = $self->{lang}->{RandomError};
+ }
+
+ if ($message)
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'info',
+ 'ok',
+ $message);
+ $dialog->set_position('center-on-parent');
+ $dialog->run();
+ $dialog->destroy;
+ }
+
+ #Clean items array.
+ foreach (@{$self->{items}->getItemsListFiltered})
+ {
+ delete $_->{realId};
+ }
+ }
+
+ sub setSensitive
+ {
+ my ($self, $sensitive) = @_;
+ $self->{menubar}->set_sensitive($sensitive);
+ $self->{toolbar}->set_sensitive($sensitive);
+ $self->{pane}->set_sensitive($sensitive);
+ }
+
+ sub initProgress
+ {
+ my ($self, $label) = @_;
+ if ($label)
+ {
+ $self->setStatus($label);
+ $self->{restoreNeeded} = 1;
+ }
+ return if $self->{openingFile};
+ $self->setProgress(0.0);
+ $self->setSensitive(0);
+ }
+
+ sub endProgress
+ {
+ my $self = shift;
+ $self->setProgress(1.0);
+ if ($self->{restoreNeeded})
+ {
+ $self->{restoreNeeded} = 0;
+ $self->restoreStatus;
+ }
+ Glib::Timeout->add(500 , sub {
+ $self->setProgress(0.0);
+ return 0;
+ });
+ $self->checkSpellChecking;
+ $self->setSensitive(1);
+ }
+
+ sub setProgress
+ {
+ my ($self, $current) = @_;
+ $self->{progress}->set_fraction($current);
+ GCUtils::updateUI;
+ }
+
+ sub setItemsTotal
+ {
+ my ($self, $total) = @_;
+ $self->{step} = GCUtils::round($total / 7);
+ $self->{step} = 1 if $self->{step} < 1;
+ $self->{total} = $total;
+ }
+
+ sub setProgressForItemsLoad
+ {
+ my ($self, $current) = @_;
+ return if ! $self->{openingFile};
+ return if ($current % $self->{step});
+ if ($self->{total})
+ {
+ my $value = ($current / $self->{total}) / 2;
+ $value = 0.5 if $value > 0.5;
+ #$self->{progress}->set_fraction($value);
+ $self->setProgress($value);
+ }
+ else
+ {
+ #$self->{progress}->set_fraction(0.3);
+ $self->setProgress(0.3);
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsDisplay
+ {
+ my ($self, $current) = @_;
+ return if ($current % $self->{step});
+ if ($self->{total})
+ {
+ my $value = ($current / (2*$self->{total}));
+ $value = ($value / 2) + 0.5 if $self->{openingFile};
+ $value = 0.75 if $value > 0.75;
+ $self->setProgress($value);
+ #$self->{progress}->set_fraction($value);
+ }
+ else
+ {
+ $self->setProgress(0.5);
+ #$self->{progress}->set_fraction(0.5);
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsSort
+ {
+ my ($self, $current) = @_;
+ return if ($current % $self->{step});
+ if ($self->{total})
+ {
+ my $value = ($current / (2*$self->{total})) + 0.5;
+ $value = (($value - 0.5) / 2) + 0.75 if $self->{openingFile};
+ $value = 1.0 if $value > 1;
+ $self->setProgress($value);
+ $self->{progress}->set_fraction($value);
+ }
+ else
+ {
+ $self->setProgress(0.7);
+ $self->{progress}->set_fraction(0.7);
+ }
+ GCUtils::updateUI;
+ }
+
+ sub blockListUpdates
+ {
+ my ($self, $value) = @_;
+
+ $self->{items}->{block} = $value;
+ }
+
+ sub reloadList
+ {
+ my $self = shift;
+ $self->{items}->reloadList($self, 1);
+ $self->endProgress;
+ }
+
+ sub setItemsList
+ {
+ my ($self, $init, $doNotSavePreferences) = @_;
+
+ my $view = $self->{options}->view;
+ my $columns = $self->{options}->columns;
+ $columns = 0 if $self->{options}->resizeImgList;
+
+ my $current = -1;
+ if ($self->{itemsView})
+ {
+ $current = $self->{itemsView}->getCurrentIdx if !$init;
+ $self->{listPane}->remove($self->{itemsView}) if $self->{listPane};
+ $self->savePreferences if ! $doNotSavePreferences;
+ $self->{itemsView}->destroy;
+ }
+
+ if ($view == 0)
+ {
+ $self->{itemsView} = new GCTextList($self, $self->{model}->getDisplayedItems);
+ }
+ elsif ($view == 1)
+ {
+ $self->{itemsView} = new GCImageList($self, $columns);
+ }
+ else
+ {
+ $self->{itemsView} = new GCDetailedList($self);
+ }
+ $self->{itemsView}->{initializing} = 1;
+
+ $self->{listOptionsPanel}->setView($view);
+
+ $self->setExpandCollapseInContext($self->{itemsView}->couldExpandAll);
+
+ if ($self->{listPane})
+ {
+ $self->{listPane}->pack1($self->{itemsView},1,0);
+ $self->{itemsView}->show_all;
+ }
+ if ($self->{items})
+ {
+ $self->reloadList if ! $self->{initializing};
+ Glib::Timeout->add(100 ,\&showCurrent, $self);
+ }
+
+ #Change corresponding item in context menu
+ $self->{ignoreContextActivation} = 1;
+
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->{menuDisplayType}->set_active($view + 1);
+ }
+ else
+ {
+ $self->{context}->{menuDisplayType}->set_active($view);
+ }
+ $self->{context}->{menuDisplayType}->get_active->set_active(1);
+ $self->{ignoreContextActivation} = 0;
+ #Assign context menu to items list that will be in charge of displaying it.
+
+ if (!$init)
+ {
+ $self->checkToolbarOptions; # if !$doNotSavePreferences;
+ $self->{items}->display($current);
+ $self->{itemsView}->select($current);
+ }
+ }
+
+ sub checkToolbarOptions
+ {
+ my $self = shift;
+ $self->{toolbar}->{blocked} = 1;
+ # Text list doesn't support grouping
+ if ($self->{options}->view == 0)
+ {
+ $self->{toolbar}->setGroupField('')
+ }
+ else
+ {
+ $self->{toolbar}->setGroupField($self->{model}->{preferences}->groupBy);
+ }
+ $self->{toolbar}->setItemsList($self->{options}->view);
+ $self->{toolbar}->setLayout($self->{model}->{preferences}->layout);
+ $self->{toolbar}->{blocked} = 0;
+ }
+
+ sub createContextMenu
+ {
+ my $self = shift;
+
+ # Context menu creation. It is displayed when right clicking on a list item.
+ $self->{context} = new Gtk2::Menu;
+
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->append(Gtk2::TearoffMenuItem->new());
+ }
+
+ $self->{contextNewWindow} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuNewWindow});
+ $self->{contextNewWindow}->signal_connect("activate" , sub {
+ $self->displayInWindow(undef, 'item');
+ });
+ $self->{context}->append($self->{contextNewWindow});
+
+ $self->{contextExpand}->{expand} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{ContextExpandAll});
+ $self->{contextExpand}->{expand}->signal_connect('activate', sub {
+ $self->{itemsView}->expandAll;
+ });
+ $self->{context}->append($self->{contextExpand}->{expand});
+
+ $self->{contextExpand}->{collapse} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{ContextCollapseAll});
+ $self->{contextExpand}->{collapse}->signal_connect('activate', sub {
+ $self->{itemsView}->collapseAll;
+ });
+ $self->{context}->append($self->{contextExpand}->{collapse});
+
+
+ #$self->{contextExpand}->{separator} = new Gtk2::SeparatorMenuItem;
+ $self->{context}->append(Gtk2::SeparatorMenuItem->new);
+
+ $self->{contextDuplicateItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-dnd');
+ $self->{contextDuplicateItem}->set_accel_path('<main>/Edit/gtk-dnd');
+ $self->{contextDuplicateItem}->signal_connect('activate' , sub {
+ $self->duplicateItem;
+ });
+ $self->{context}->append($self->{contextDuplicateItem});
+
+ $self->{contextSelectAllItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-select-all',undef);
+ $self->{contextSelectAllItem}->signal_connect("activate" , sub {
+ $self->selectAll;
+ });
+ $self->{context}->append($self->{contextSelectAllItem});
+
+ $self->{contextItemDelete} = Gtk2::ImageMenuItem->new_from_stock('gtk-delete',undef);
+ $self->{contextItemDelete}->signal_connect("activate" , sub {
+ $self->deleteCurrentItem;
+ });
+ $self->{context}->append($self->{contextItemDelete});
+
+ $self->{context}->append(Gtk2::SeparatorMenuItem->new);
+ $self->{context}->{menuDisplayType} = new Gtk2::Menu;
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->{menuDisplayType}->append(Gtk2::TearoffMenuItem->new());
+ }
+ my %views = %{$self->{lang}->{OptionsViews}};
+ my $displayGroup = undef;
+ foreach (0..(scalar(keys %views) - 1))
+ {
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($displayGroup, $views{$_});
+ $item->signal_connect('activate', sub {
+ my ($widget, $self) = @_;
+ return if ($self->{ignoreContextActivation});
+ if ($widget->get_active)
+ {
+ my $group = $widget->get_group;
+ my $i = 0;
+ $i++ while ($views{$i} ne $widget->child->get_label);
+ $self->{options}->view($i);
+ $self->setItemsList(0)
+ if ! $self->{initializing};
+ $self->checkView;
+
+ }
+ }, $self);
+ $self->{context}->{menuDisplayType}->append($item);
+ $displayGroup = $item->get_group;
+ }
+
+ $self->{context}->{itemDisplayType} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{OptionsView});
+ $self->{context}->{itemDisplayType}->set_submenu($self->{context}->{menuDisplayType});
+ $self->{context}->append($self->{context}->{itemDisplayType});
+
+ $self->{context}->{displayItem} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuDisplayMenu});
+ $self->{context}->append($self->{context}->{displayItem});
+
+ $self->{context}->append(Gtk2::SeparatorMenuItem->new);
+
+ # Filters selection
+
+ my $menuDisplay = Gtk2::Menu->new();
+ my $filterItem = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuDisplay});
+
+ $self->{contextViewAllItems} = Gtk2::MenuItem->new_with_mnemonic($self->{lang}->{MenuViewAllItems});
+ $self->{contextViewAllItems}->signal_connect("activate" , sub {
+ $self->viewAllItems;
+ });
+ $menuDisplay->append($self->{contextViewAllItems});
+
+ my $searchSelectedItems = Gtk2::ImageMenuItem->new_from_stock('gtk-find',undef);
+ $searchSelectedItems->signal_connect("activate" , sub {
+ $self->search('displayed');
+ });
+ $menuDisplay->append($searchSelectedItems);
+
+ $filterItem->set_submenu($menuDisplay);
+ $self->{context}->append($filterItem);
+
+ $self->{context}->signal_connect('show' => sub {
+ $self->{menubar}->attachDisplayMenu($self->{context}->{displayItem});
+ });
+
+ $self->{context}->signal_connect('hide' => sub {
+ $self->{menubar}->attachDisplayMenu();
+ });
+
+ $self->{context}->show_all;
+
+ }
+
+ sub setExpandCollapseInContext
+ {
+ my ($self, $active) = @_;
+
+ foreach (keys %{$self->{contextExpand}})
+ {
+ $self->{contextExpand}->{$_}->set_sensitive($active);
+ }
+ }
+
+ sub contextDisplayChange
+ {
+ my ($self, $widget, $menuName, $number) = @_;
+
+ return if $widget && ! $widget->get_active;
+ return if $self->{menubar}->{contextUpdating};
+
+ $self->{menubar}->{contextUpdating} = 1;
+ $self->{menubar}->{$menuName}->set_active($number);
+ $self->{menubar}->{$menuName}->get_active->activate;
+ $self->{menubar}->{contextUpdating} = 0;
+ }
+
+ sub showCurrent
+ {
+ my $self = shift;
+ $self->{itemsView}->showCurrent;
+ return 0;
+ }
+
+ sub viewAllItems
+ {
+ my ($self, $self2) = @_;
+ $self = $self2 if $self2;
+
+ $self->{menubar}->selectAll;
+ }
+
+ sub transformTitle
+ {
+ my ($self, $title) = @_;
+
+ return $title if ! $self->{options}->{options}->{transform};
+
+ return $title if $title !~ $self->{articlesRegexp};
+ #'
+ #return $title if $title !~ /^($self->{articlesRegexp})(\s+|('))(.*)/i;
+ return ucfirst($4)." ($1$3)";
+ }
+
+ sub transformValue
+ {
+ my ($self, $value, $field, $withMulti) = @_;
+
+ my $type = '';
+ $type = $self->{model}->{fieldsInfo}->{$field}->{type}
+ if defined $self->{model}->{fieldsInfo}->{$field}->{type};
+ if ($field eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $value = $self->{lang}->{PanelNobody} if (! $value) || ($value eq 'none');
+ }
+ else
+ {
+ if ($type eq 'date')
+ {
+ $value = GCUtils::timeToStr($value, $self->{options}->dateFormat);
+ }
+ elsif ($type =~ /list$/o)
+ {
+ if ($withMulti)
+ {
+ $value = GCPreProcess::multipleListToArray($value);
+ }
+ else
+ {
+ $value = GCPreProcess::multipleList($value, $type);
+ }
+ }
+ elsif ($type eq 'options')
+ {
+ $value = $self->{items}->valueToDisplayed($value, $field) || $value;
+ }
+ if ($field eq $self->{model}->{commonFields}->{title})
+ {
+ $value = $self->transformTitle($value);
+ }
+ }
+ return $value;
+ }
+
+ sub new
+ {
+ my ($proto, $options, $version, $searchJob) = @_;
+
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new('toplevel');
+ bless ($self, $class);
+
+ $options->setParent($self);
+ $self->{options} = $options;
+ $self->{version} = $version;
+ $self->{searchJob} = $searchJob;
+
+ $self->{logosDir} = $ENV{GCS_SHARE_DIR}.'/logos/';
+ $self->{hasPictures} = (-f $self->{logosDir}.'splash.png');
+ $self->{tmpImageDir} = tempdir(CLEANUP => 1);
+
+ $self->{lang} = $GCLang::langs{$self->{options}->lang};
+
+ if (! $ENV{GCS_PROFILING})
+ {
+ #GCPlugins::loadPlugins;
+ GCExport::loadExporters;
+ GCImport::loadImporters;
+ }
+
+ if (! $options->exists('style'))
+ {
+ $options->style('Gtk') if ($^O !~ /win32/i);
+ $options->style('GCstar') if ($^O =~ /win32/i);
+ }
+ GCStyle::initStyles;
+ my $style = $GCStyle::styles{$options->style};
+
+ if ((! $options->exists('itemWindowWidth'))
+ || (! $options->exists('itemWindowHeight')))
+ {
+ $options->itemWindowWidth(600);
+ $options->itemWindowHeight(500);
+ }
+
+ $self->{style} = $style;
+
+ $self->{initializing} = 1;
+
+ if (($self->{options}->splash) || (! $self->{options}->exists('splash')))
+ {
+ $self->{splash} = new GCSplashWindow($self, $self->{version});
+ }
+ else
+ {
+ $self->init;
+ $self->loadPrevious;
+ $self->initEnd;
+ $self->{initializing} = 0;
+ $self->setSensitive(1);
+ }
+
+ return $self;
+ }
+
+ sub createStockItems
+ {
+ my $self = shift;
+
+ my $baseStock;
+ $baseStock->{translation_domain} = 'gtk20';
+ $baseStock->{keyval} = 0;
+ $baseStock->{modifier} = [ ];
+
+ $baseStock->{stock_id} = 'gtk-execute';
+ $baseStock->{label} = $self->{lang}->{ToolbarRandom};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-refresh';
+ $baseStock->{label} = $self->{lang}->{ToolbarAll};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-convert';
+ $baseStock->{label} = $self->{lang}->{MenuImport};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-revert-to-saved';
+ $baseStock->{label} = $self->{lang}->{MenuExport};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-dnd';
+ $baseStock->{label} = $self->{lang}->{MenuDuplicate};
+ Gtk2::Stock->add($baseStock);
+ my $iconFactory = Gtk2::IconFactory->new;
+ $iconFactory->add('gtk-dnd', (Gtk2::IconFactory->lookup_default ('gtk-copy')));
+ $iconFactory->add_default;
+
+ $baseStock->{stock_id} = 'gtk-jump-to';
+ $baseStock->{label} = $self->{lang}->{PanelSearchButton};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-help';
+ #$baseStock->{keyval} = 'F1';
+ #$baseStock->{modifier} = [];
+ $baseStock->{label} = $self->{lang}->{MenuHelpContent};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-about';
+ $baseStock->{label} = $self->{lang}->{MenuAbout};
+ Gtk2::Stock->add($baseStock);
+
+ $baseStock->{stock_id} = 'gtk-zoom-in';
+ $baseStock->{label} = $self->{lang}->{ResultsPreview};
+ Gtk2::Stock->add($baseStock);
+
+ my $addStock = Gtk2::Stock->lookup('gtk-add');
+ # Ctrl-T
+ $addStock->{keyval} = ord('T');
+ $addStock->{modifier} = [ 'control-mask' ];
+ Gtk2::Stock->add($addStock);
+
+ my $selectAllStock = Gtk2::Stock->lookup('gtk-select-all');
+ if (!$selectAllStock)
+ {
+ $baseStock->{stock_id} = 'gtk-select-all';
+ $baseStock->{label} = $self->{lang}->{DisplayOptionsAll};
+ $baseStock->{modifier} = [];
+ Gtk2::Stock->add($baseStock);
+ }
+
+ }
+
+ sub init
+ {
+ my $self = shift;
+ my $splash = shift;
+
+ $self->{options}->save if $self->checkImagesDirectory(1);
+
+ $self->createStockItems;
+ $splash->setProgress(0.01) if $splash;
+
+ $self->{modelsFactory} = new GCModelsCache($self);
+
+ Gtk2::Rc->parse($self->{style}->{rcFile});
+
+ $self->{AccelMapFile} = $ENV{GCS_CONFIG_HOME}.'/AccelMap';
+ $self->{agent} = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041111 Firefox/1.0';
+ $self->{ignoreString} = 'gcf_000_ignore';
+ $self->{imagePrefix} = 'gcstar_';
+
+ $self->{tooltips} = Gtk2::Tooltips->new();
+ if ($self->{searchJob}->{command})
+ {
+ $self->{searchJob}->{command}->autoflush(1);
+ $self->{searchJob}->{data}->autoflush(1);
+ }
+
+ $self->refreshTitle;
+ my $iconPrefix = $ENV{GCS_SHARE_DIR}.'/icons/gcstar_';
+ my $pixbuf16 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'16x16.png');
+ my $pixbuf32 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'32x32.png');
+ my $pixbuf48 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'48x48.png');
+ my $pixbuf64 = Gtk2::Gdk::Pixbuf->new_from_file($iconPrefix.'64x64.png');
+ $self->set_default_icon_list($pixbuf16, $pixbuf32, $pixbuf48, $pixbuf64);
+
+ $self->signal_connect(delete_event => \&beforeDestroy, $self);
+ $self->signal_connect(destroy => sub { Gtk2->main_quit; });
+
+ $self->createContextMenu;
+
+ $splash->setProgress(0.03) if $splash;
+
+ $self->{items} = new GCItems($self);
+ $self->{panel} = 0;
+
+ $self->{menubar} = new GCMenuBar($self, $self->{AccelMapFile});
+ $self->{menubar}->set_name('GCMenubar');
+
+ $self->{bookmarksLoader} = new GCBookmarksLoader($self, $self->{menubar});
+ $self->{toolbar} = GCToolBar->new($self);
+
+ $self->{mainVbox} = new Gtk2::VBox(0, 0);
+ $self->{mainHbox} = new Gtk2::HBox(0, 0);
+ $self->{pane} = new Gtk2::HPaned;
+ $self->{listPane} = new Gtk2::VPaned;
+
+ $self->{pane}->set_position($self->{options}->split);
+ $self->{listPane}->set_position($self->{options}->listPaneSplit);
+ $self->{pane}->pack1($self->{listPane},1,0);
+ $self->{listOptionsPanel} = new GCListOptionsPanel($self->{options}, $self);
+ $self->{listPane}->pack2($self->{listOptionsPanel},1,1);
+
+ $self->{mainVbox}->pack_start($self->{menubar}, 0, 0, 0);
+ $self->{mainHbox}->pack_start($self->{pane},1,1,0);
+ $self->{mainVbox}->pack_start($self->{mainHbox}, 1, 1, 0);
+
+ $self->{status} = Gtk2::Statusbar->new;
+ $self->{status}->set_has_resize_grip(1);
+ $self->{progress} = new Gtk2::ProgressBar;
+ $self->{progress}->set_size_request(100,-1);
+ $self->{status}->pack_start($self->{progress}, 0, 0, 5);
+ $self->{mainVbox}->pack_start($self->{status},0,0,0);
+
+ $self->setSensitive(0);
+ $self->checkToolbarPosition;
+ $self->add($self->{mainVbox});
+
+ $splash->setProgress(0.05) if $splash;
+
+ $self->set_default_size($self->{options}->width,$self->{options}->height);
+
+ $self->drag_dest_set('all', ['copy','private','default','move','link','ask']);
+
+ $self->signal_connect(drag_data_received => \&drop_handler, $self);
+
+ my $target_list = Gtk2::TargetList->new();
+ my $atom1 = Gtk2::Gdk::Atom->new('text/uri-list');
+ my $atom2 = Gtk2::Gdk::Atom->new('text/plain');
+ $target_list->add($atom1, 0, 0);
+ $target_list->add($atom2, 0, 0);
+ if ($^O =~ /win32/i)
+ {
+ my $atom3 = Gtk2::Gdk::Atom->new('DROPFILES_DND');
+ $target_list->add($atom3, 0, 0);
+ }
+
+ $self->drag_dest_set_target_list($target_list);
+
+ sub drop_handler {
+ my ($widget, $context, $widget_x, $widget_y, $data, $info, $time, $self) = @_;
+ my $type = $data->type->name;
+
+ if (($type eq 'text/uri-list')
+ || ($type eq 'DROPFILES_DND'))
+ {
+ my @files = split /\n/, $data->data;
+ my $numbers = scalar @files;
+ $numbers-- if ($files[$#files] =~ /^\W*$/);
+
+ my ($filename, undef, $extension) = fileparse($files[0],qr{\..*});
+ $extension =~ s/[^\.\w]//g;
+ $extension = lc($extension);
+
+ if (($numbers == 1)
+ && ($files[0] =~ /\.gcs.?$/))
+ {
+ # Special case when only one .gcs file is dropped
+ (my $fileName = $files[0]) =~ s/^file:\/\/(.*)\W*$/$1/;
+ $fileName =~ s/.$//ms;
+ $self->openFile($fileName);
+ }
+ elsif (($numbers == 1)
+ && ($files[0] =~ /^http:\/\//))
+ {
+ # One url has been dropped, parse it for item data
+ $self->loadUrl($files[0]);
+ }
+ elsif ((grep {$_ eq $extension} @GCBaseWidgets::videoExtensions)
+ && ($self->{model}->{collection}->{name} eq 'GCfilms'))
+ {
+ # At least one video file was dropped and a movie collection is open
+ $self->handleDroppedFiles(\@files, \@GCBaseWidgets::videoExtensions, 'trailer');
+ }
+ elsif ((grep {$_ eq $extension} @GCBaseWidgets::ebookExtensions)
+ && ($self->{model}->{collection}->{name} eq 'GCbooks'))
+ {
+ # At least one ebook file was dropped and a book collection is open
+ $self->handleDroppedFiles(\@files, \@GCBaseWidgets::ebookExtensions, 'digitalfile');
+ }
+ elsif ((grep {$_ eq $extension} @GCBaseWidgets::audioExtensions)
+ && ($self->{model}->{collection}->{name} eq 'GCmusics'))
+ {
+ # At least one audio file was dropped and a music collection is open
+ $self->handleDroppedFiles(\@files, \@GCBaseWidgets::audioExtensions, 'playlist');
+ }
+ else
+ {
+ my $fileName = $self->{options}->file;
+ #$self->newList;
+ foreach (@files)
+ {
+ if (!$self->importWithDetect($_))
+ {
+ my $dialog = Gtk2::MessageDialog->new($self,
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $self->{lang}->{ImportDropError});
+
+ $dialog->set_position('center-on-parent');
+ my $response = $dialog->run;
+ $dialog->destroy;
+
+ $self->openFile($fileName);
+ last;
+ }
+ }
+ #$self->{items}->setStatus;
+ $self->setNbItems;
+ }
+ }
+ elsif ((my $url = $data->data) =~ m/^http:\/\//)
+ {
+ $self->loadUrl($url);
+ }
+ }
+
+ $splash->setProgress(0.07) if $splash;
+
+ $self->show_all;
+
+ $self->checkDisplayed;
+ $self->checkView;
+ $self->checkTransform;
+
+ $self->{filterSearch} = new GCFilterSearch;
+
+ $splash->setProgress(0.09) if $splash;
+
+ $self->{options}->searchStop(0) if ($^O =~ /win32/i);
+ }
+
+ sub handleDroppedFiles
+ {
+ my ($self, $files, $acceptedExtensions, $field) = @_;
+
+ foreach (@$files)
+ {
+ # Split filename up into parts
+ my ($filename, undef, $extension) = fileparse($_,qr{\..*});
+ $extension =~ /(\.\w\w\w)/;
+ $extension = lc($1);
+
+ # Double check that the current file being handled is acceptable
+ if (grep {$_ eq $extension} @$acceptedExtensions)
+ {
+ # Extract a clean version of the filename
+ (my $file = $_) =~ s/\W*$//;
+ $file =~ s/^file:\/\///;
+
+ # Add a new item
+ $self->newItem;
+
+ # Set the file field to match the dropped filename
+ $self->{panel}->$field(uri_unescape($file));
+
+ # Fetch info
+ $filename = uri_unescape($filename);
+ $self->searchItem($filename, undef, 0, $self->{model}->{commonFields}->{title});
+ }
+ }
+ }
+
+ sub setPanel
+ {
+ my $self = shift;
+ my $panelInfo;
+ if (! $self->{model}->{preferences}->exists('layout') || (! $self->{model}->{preferences}->layout))
+ {
+ $panelInfo = $self->{model}->getDefaultPanel;
+ $self->{model}->{preferences}->layout($panelInfo->{name})
+ }
+ else
+ {
+ $panelInfo = $self->{model}->{panels}->{$self->{model}->{preferences}->layout};
+ }
+ if ($panelInfo->{editable} eq 'true')
+ {
+ $self->{panel} = new GCFormPanel($self, $self->{options}, $panelInfo);
+ }
+ else
+ {
+ $self->{panel} = new GCReadOnlyPanel($self, $self->{options}, $panelInfo);
+ }
+ $self->{panel}->setExpandersMode($self->{options}->expandersMode);
+ $self->{panel}->show_all;
+ }
+
+ sub changePanel
+ {
+ # $modelChanged means there was any change in the model and not that we are just
+ # changing the panel because the layout was changed in preferences
+ # $modelUpdated means the model is the same, but some fields were added/removed
+ my ($self, $modelChanged, $modelUpdated) = @_;
+
+ #Save previous histories
+ my %savedHistories;
+ if ($self->{panel})
+ {
+ # If there was no change or just an update, we save the history
+ if ((!$modelChanged) || $modelUpdated)
+ {
+ foreach(@{$self->{model}->{fieldsHistory}})
+ {
+ $savedHistories{$_} = $self->{panel}->getValues($_);
+ }
+ $self->{items}->updateSelectedItemInfoFromPanel if !$modelUpdated;
+ }
+ $self->{scrollPanelItem}->remove($self->{scrollPanelItem}->get_child);
+ $self->{panel}->destroy;
+ $self->{pane}->remove($self->{scrollPanelItem});
+ $self->{scrollPanelItem}->destroy;
+ }
+
+ $self->setPanel;
+ $self->{panel}->createContent($self->{model});
+
+ $self->{scrollPanelItem} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelItem}->set_policy ('automatic', 'automatic');
+ $self->{scrollPanelItem}->set_shadow_type('none');
+ $self->{scrollPanelItem}->add_with_viewport($self->{panel});
+ $self->{pane}->pack2($self->{scrollPanelItem},1,1);
+ $self->{scrollPanelItem}->show_all;
+ $self->{items}->setPanel($self->{panel});
+ $self->checkBorrowers;
+ $self->checkPanelContent;
+
+ if (%savedHistories)
+ {
+ #Restore histories
+ foreach(@{$self->{model}->{fieldsHistory}})
+ {
+ $self->{panel}->{$_}->setValues($savedHistories{$_});
+ }
+ }
+
+ $self->{items}->displayCurrent;
+ $self->checkToolbarOptions;
+ }
+
+ sub removeToolbar
+ {
+ my $self = shift;
+
+ #Remove previous if exists
+ if ($self->{toolbar})
+ {
+ $self->{mainHbox}->remove($self->{toolbar})
+ if ($self->{toolbar}->parent eq $self->{mainHbox});
+ $self->{mainVbox}->remove($self->{toolbar})
+ if ($self->{toolbar}->parent eq $self->{mainVbox});
+ };
+ }
+
+ sub checkToolbarPosition
+ {
+ my ($self, $deactivateRemoval) = @_;
+
+ $self->removeToolbar if !$deactivateRemoval;
+
+ my $position = $self->{options}->toolbarPosition;
+
+ # 0 => top
+ # 1 => bottom
+ # 2 => left
+ # 3 => right
+
+ if ($position > 1) # left or right
+ {
+ $self->{toolbar}->set_orientation('vertical');
+ $self->{mainHbox}->pack_start($self->{toolbar},0,0,0);
+ if ($position == 2) # left
+ {
+ $self->{mainHbox}->reorder_child($self->{toolbar},0);
+ }
+ else # right
+ {
+ $self->{mainHbox}->reorder_child($self->{toolbar},1);
+ }
+ }
+ else # top or bottom
+ {
+ $self->{toolbar}->set_orientation('horizontal');
+ $self->{mainVbox}->pack_start($self->{toolbar},0,0,0 );
+ if ($position == 1) # bottom
+ {
+ $self->{mainVbox}->reorder_child($self->{toolbar},2);
+ }
+ else # top
+ {
+ $self->{mainVbox}->reorder_child($self->{toolbar},1);
+ }
+ }
+ $self->{toolbar}->show_all;
+ $self->{toolbar}->setShowFieldsSelection($position <= 1);
+ }
+
+ sub checkDisplayed
+ {
+ my $self = shift;
+
+ $self->setDisplayMenuBar($self->{options}->displayMenuBar);
+ $self->setDisplayStatusBar($self->{options}->status);
+ $self->setDisplayToolBar($self->{options}->toolbar);
+ }
+
+ sub checkProxy
+ {
+ my $self= shift;
+
+ $self->{plugin}->setProxy($self->{options}->proxy) if ($self->{plugin});
+ }
+
+ sub checkCookieJar
+ {
+ my $self= shift;
+ $self->{plugin}->setCookieJar($self->{options}->cookieJar) if ($self->{plugin});
+ }
+
+ sub checkPlugin
+ {
+ my $self = shift;
+ $self->{plugin} = undef;
+ $self->{plugin} = $self->{model}->getPlugin($self->{model}->{preferences}->plugin);
+
+ $self->checkProxy;
+ $self->checkCookieJar;
+ }
+
+ sub checkBorrowers
+ {
+ my $self = shift;
+
+ #my @borrowers = split m/\|/, $self->{options}->borrowers;
+ $self->{panel}->setBorrowers;
+ }
+
+ sub checkView
+ {
+ my $self = shift;
+ if ($self->{options}->tearoffMenus)
+ {
+ $self->{context}->{menuDisplayType}->set_active($self->{options}->view + 1);
+ }
+ else
+ {
+ $self->{context}->{menuDisplayType}->set_active($self->{options}->view);
+ }
+ $self->{context}->{menuDisplayType}->get_active->set_active(1);
+ }
+
+ sub checkTransform
+ {
+ my $self = shift;
+
+ my @array = split m/,/, $self->{options}->articles;
+
+ my $tmpExpr = '';
+
+ foreach (@array)
+ {
+ s/^\s*//;
+ s/\s*$//;
+ $tmpExpr .= "\Q$_\E|";
+ }
+ chomp $tmpExpr;
+
+ $self->{articles} = \@array;
+ #$self->{articlesRegexp} = $tmpExpr;
+ $self->{articlesRegexp} = qr/^($tmpExpr)(\s+|('))(.*)/i;
+ #'
+ $self->reloadList if ! $self->{initializing};
+ }
+
+ sub checkPanelContent
+ {
+ my $self = shift;
+
+ my $hasToShow = 1;
+ $hasToShow = 0 if (! $self->{itemsView}->getNbItems);
+
+ $self->{panel}->setShowOption($self->getDialog('DisplayOptions')->{show}, $hasToShow);
+ }
+
+ sub checkSpellChecking
+ {
+ my $self = shift;
+ my $lang;
+ if ($self->{items})
+ {
+ $lang = $self->{items}->getInformation->{lang};
+ $lang =~ s/^(\w*).*$/$1/;
+ }
+ $self->{panel}->setSpellChecking($self->{options}->spellCheck,
+ $lang);
+ }
+
+ sub loadPrevious
+ {
+ my $self = shift;
+ my $splash = shift;
+ $self->{items}->setOptions($self->{options});
+ return if !$self->{options}->file;
+
+ #if ($self->{items}->setOptions($self->{options}, $splash))
+ my ($success, $error) = $self->{items}->load($self->{options}->file, $splash, 0);
+ if ($success)
+ {
+ $self->checkDefaultImage;
+ $self->refreshFilters;
+ $self->refreshTitle;
+ $self->{menubar}->setLock($self->{items}->getLock);
+ $self->addFileHistory($self->{options}->file);
+ $self->checkPanelContent;
+ $self->checkBorrowers;
+# $self->checkSpellChecking;
+ }
+ else
+ {
+ $splash->hide if $splash;
+ my $dialog = new GCCriticalErrorDialog(
+ $self,
+ GCUtils::formatOpenSaveError(
+ $self->{lang},
+ $self->{options}->file,
+ $error
+ )
+ );
+ $dialog->show;
+ $self->{options}->file('');
+
+ }
+
+ #$self->{itemsView}->setSortOrder;
+
+ #$splash->setProgress(0.99) if $splash;
+ }
+
+ sub initEnd
+ {
+ my $self = shift;
+
+ if ($self->{options}->{created})
+ {
+ $self->{options}->checkPreviousGCfilms($self);
+ }
+
+ if (! $self->{options}->file)
+ {
+ $self->{splash}->destroy
+ if $self->{splash};
+ $self->{splash} = 0;
+ $self->newList;
+ }
+
+ $self->reloadDone(0,$self->{splash});
+ #$self->{itemsView}->done;
+ $self->{items}->display($self->{items}->select(-1,1));
+
+ if ($ENV{GCS_PROFILING} > 2)
+ {
+ $self->leave;
+ }
+
+ $self->{changedChecked} = Glib::Timeout->add(2000 , sub {
+ if ($GCGraphicComponent::somethingChanged)
+ {
+ $self->markAsUpdated;
+ $GCGraphicComponent::somethingChanged = 0;
+ }
+ return 1;
+ });
+ }
+
+ sub setFullScreen
+ {
+ my ($self, $fullscreen) = @_;
+
+ if ($fullscreen)
+ {
+ $self->fullscreen;
+ }
+ else
+ {
+ $self->unfullscreen;
+ }
+ }
+
+ sub setDisplayMenuBar
+ {
+ my ($self, $show) = @_;
+
+ if ($show)
+ {
+ $self->{menubar}->show_all;
+ }
+ else
+ {
+ $self->{menubar}->hide;
+ }
+ $self->{options}->displayMenuBar($show);
+ }
+
+ sub setDisplayToolBar
+ {
+ my ($self, $show) = @_;
+
+ if ($show)
+ {
+ $self->{toolbar}->show_all;
+ }
+ else
+ {
+ $self->{toolbar}->hide;
+ }
+ $self->{options}->toolbar($show);
+ }
+
+ sub setDisplayStatusBar
+ {
+ my ($self, $show) = @_;
+
+ if ($show)
+ {
+ $self->{status}->show_all;
+ }
+ else
+ {
+ $self->{status}->hide;
+ }
+ $self->{options}->status($show);
+ }
+
+ sub setDefaultValues
+ {
+ my $self = shift;
+
+ my $window = $self->getItemWindow('defaultValues');
+ my $title = $self->{lang}->{MenuDefaultValues};
+
+ $window->setTitle($title);
+
+ my $info = $self->{model}->getDefaultValues;
+ $self->{items}->displayDataInPanel($window->{panel}, $info);
+ my $code = $window->show;
+
+ if ($code eq 'ok')
+ {
+ my ($changed, $info, $previous) = $self->{items}->getInfoFromPanel($window->{panel}, $info);
+ $self->{model}->setDefaultValues($info);
+ }
+
+ $self->saveItemWindowSettings($window);
+
+ $window->hide;
+
+ return $code;
+
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCMenu.pm b/lib/gcstar/GCMenu.pm
new file mode 100644
index 0000000..db6ebec
--- /dev/null
+++ b/lib/gcstar/GCMenu.pm
@@ -0,0 +1,1840 @@
+package GCMenu;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+use strict;
+{
+ package GCMenuBar;
+ use base 'Gtk2::MenuBar';
+
+ use GCExport;
+ use GCImport;
+ use GCStats;
+
+ sub addHistoryMenu
+ {
+ my ($self, $historyArray) = @_;
+ my $parent = $self->{parent};
+
+ my @tmpHistory;
+ if (! $historyArray)
+ {
+ my @tmpHistory = split(/\|/, $parent->{options}->history);
+ $historyArray = \@tmpHistory;
+ }
+ foreach my $filename(@$historyArray)
+ {
+ next if !$filename || ($filename eq 'none');
+ my $item = Gtk2::MenuItem->new_with_label($filename);
+ $item->signal_connect ('activate' => sub {
+ $parent->openFile($filename);
+ });
+ $self->{menuHistory}->append($item);
+ $item->show();
+ }
+ $self->{menuHistoryItem}->set_submenu($self->{menuHistory});
+ }
+
+ sub setBookmarks
+ {
+ my ($self, $bookmarks) = @_;
+ $self->{bookmarks} = $bookmarks;
+ $self->addBookmarksDir($self->{bookmarks}, undef);
+ $self->{menuBookmarks}->show_all;
+ }
+
+ sub clearBookmarks
+ {
+ my $self = shift;
+ my $i = 0;
+ foreach ($self->{menuBookmarks}->get_children)
+ {
+ $i++;
+ next if ($i < 4 + ($self->{parent}->{options}->tearoffMenus ? 1 : 0));
+ $self->{menuBookmarks}->remove($_);
+ $_->destroy;
+ }
+ }
+
+ sub addBookmarksDir
+ {
+ my ($self, $dir, $parent) = @_;
+ if ($parent)
+ {
+ my $subMenu = Gtk2::Menu->new();
+ my $item = Gtk2::MenuItem->new_with_mnemonic($dir->{name});
+ $item->set_submenu($subMenu);
+ $parent->append($item);
+ $parent = $subMenu;
+ $dir->{menu} = $subMenu;
+ }
+ else
+ {
+ $parent = $self->{menuBookmarks};
+ }
+ foreach my $sub(@{$dir->{dir}})
+ {
+ $self->addBookmarksDir($sub, $parent);
+ }
+ return if !$dir->{file};
+ foreach my $file(@{$dir->{file}})
+ {
+ $self->addBookmark($file, $parent);
+ }
+ }
+
+ sub addBookmark
+ {
+ my ($self, $bookmark, $parent) = @_;
+
+ my $item = Gtk2::MenuItem->new_with_mnemonic($bookmark->{name});
+ $item->signal_connect ('activate' => sub {
+ $self->{parent}->openFile($bookmark->{path});
+ });
+ $parent->append($item);
+
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{model} = $model;
+ $self->createFilters($model,
+ $model->{fieldsInfo});
+ $self->initExportImportList($model);
+
+ # Update menu labels which are collection dependant
+ $self->updateMenus;
+
+ }
+
+ sub updateItem
+ {
+ my ($self, $item, $label) = @_;
+ foreach my $child($item->get_children)
+ {
+ if ($child->isa('Gtk2::Label'))
+ {
+ $child->set_label($self->{parent}->{lang}->{$label});
+ }
+ }
+ }
+
+ sub updateMenus
+ {
+ my ($self) = @_;
+
+ # Update labels which are collection dependant
+ # list for each item is: [parent, item name, label index in language]
+ foreach (
+ # Menu labels
+ [$self, 'viewAllItems', 'MenuViewAllItems'],
+ [$self, 'menuLend', 'MenuLend'],
+ [$self, 'duplicateItem', 'MenuDuplicate'],
+ [$self, 'newitem', 'MenuAddItem'],
+ [$self, 'deleteCurrentItem', 'MenuEditDeleteCurrent'],
+ [$self, 'selectAllItem', 'MenuEditSelectAllItems'],
+ [$self, 'defaultValues', 'MenuDefaultValues'],
+ # Context menu labels
+ [$self->{parent}, 'contextNewWindow', 'MenuNewWindow'],
+ [$self->{parent}, 'contextDuplicateItem', 'MenuDuplicate'],
+ [$self->{parent}, 'contextSelectAllItem', 'MenuEditSelectAllItems'],
+ [$self->{parent}, 'contextItemDelete', 'MenuEditDeleteCurrent'],
+ [$self->{parent}, 'contextViewAllItems', 'MenuViewAllItems'],
+ )
+ {
+ $self->updateItem($_->[0]->{$_->[1]}, $_->[2]);
+ }
+ }
+
+ sub initFilters
+ {
+ my ($self, $info) = @_;
+
+ $self->selectAll(1);
+ $self->block;
+ my $fieldsInfo = $self->{fieldsInfo};
+ foreach (keys %$info)
+ {
+ my $activeIdx = 0;
+ my $filtersInfo = $self->{filtersInfo}->{$_};
+ next if !$filtersInfo;
+
+ if ($fieldsInfo->{$_}->{type} eq 'options')
+ {
+ foreach my $valueInfo(@{$self->{model}->getValues($fieldsInfo->{$_}->{'values'})})
+ {
+ last if $valueInfo->{value} eq $info->{$_};
+ $activeIdx++;
+ }
+ $activeIdx++ if $activeIdx >= $fieldsInfo->{$_}->{separator};
+ }
+ elsif ($fieldsInfo->{$_}->{type} eq 'number')
+ {
+ #The value that means no check
+ my $boundary = $fieldsInfo->{$_}->{min};
+ $boundary = $fieldsInfo->{$_}->{max}
+ if ($filtersInfo->{type}->{comparison} =~ /^l/);
+ if ($info->{$_} != $boundary)
+ {
+ $activeIdx = 1;
+ $self->{numberValues}->{$_} = $info->{$_};
+ }
+ }
+ elsif ($fieldsInfo->{$_}->{type} eq 'date')
+ {
+ #The value that means no check
+ if ($info->{$_})
+ {
+ $activeIdx = 1;
+ $self->{dateValues}->{$_} = $info->{$_};
+ }
+ }
+ elsif (($fieldsInfo->{$_}->{type} eq 'history text')
+ || ($fieldsInfo->{$_}->{type} eq 'single list'))
+ {
+ my @values;
+ @values = @{$self->{parent}->{panel}->getValues($_)}
+ if ($fieldsInfo->{$_}->{type} eq 'history text');
+ @values = @{$self->{parent}->{panel}->getValues($_)->[0]}
+ if ($fieldsInfo->{$_}->{type} eq 'single list');
+ foreach my $value(@values)
+ {
+ last if $value eq $info->{$_};
+ $activeIdx++;
+ }
+ $activeIdx = 0 if $activeIdx >= $#values;
+ }
+ elsif ($fieldsInfo->{$_}->{type} eq 'yesno')
+ {
+ $activeIdx = 1;
+ $activeIdx = 0 if (($filtersInfo->{values} eq 'off') && ($info->{$_} == 1))
+ || (($filtersInfo->{values} eq 'on') && ($info->{$_} == 0));
+ $activeIdx = 2 if ($filtersInfo->{values} eq 'both') && ($info->{$_} == 0);
+ }
+
+ $self->{'menuFilter'.$_}->set_active($activeIdx);
+ $self->{'menuFilter'.$_}->get_active->set_active(1);
+ }
+
+ $self->unblock;
+ }
+
+ sub initExportImportList
+ {
+ my ($self, $model) = @_;
+
+ my $modelName = $model->getName;
+ #It will hide the export/import modules that don't support current model
+ # This code may be factorized.
+ foreach my $exporter(@GCExport::exportersArray)
+ {
+ my $item = $self->{exporters}->{$exporter->getName};
+ my @models = @{$exporter->getModels};
+ my $show = 0;
+ $show = 1 if !@models;
+ foreach (@models)
+ {
+ $show = 1 if $modelName eq $_;
+ last if $show;
+ }
+ $item->hide if !$show;
+ $item->show if $show;
+ }
+ foreach my $importer(@GCImport::importersArray)
+ {
+ my $item = $self->{importers}->{$importer->getName};
+ my @models = @{$importer->getModels};
+ my $show = 0;
+ $show = 1 if (!$importer->shouldBeHidden || !@models);
+ foreach (@models)
+ {
+ $show = 1 if $modelName eq $_;
+ last if $show;
+ }
+ $item->hide if !$show;
+ $item->show if $show;
+ }
+ }
+
+ sub createFilters
+ {
+ my ($self, $model, $fieldsInfo) = @_;
+ foreach (@{$self->{existingFilters}})
+ {
+ $self->{menuDisplay}->remove($_);
+ $_->destroy;
+ }
+
+ $self->{existingFilters} = [];
+ $self->{existingFiltersMenu} = [];
+ $self->{dynamicFilters} = {};
+ $self->{fieldsInfo} = $fieldsInfo;
+ $self->{filtersInfo} = {};
+ my $position = ($self->{parent}->{options}->tearoffMenus ? 1 : 0);
+ $self->createUserFilters($model, $position + 1);
+ foreach my $filter(@{$model->{filters}})
+ {
+ next if (!defined $filter->{quick}) || ($filter->{quick} ne 'true');
+ my $field = $filter->{field};
+ $self->{filtersInfo}->{$field} = $filter;
+ $self->{'menuFilter'.$field} = Gtk2::Menu->new;
+ $self->{'menuFilter'.$field}->set_accel_path("<main>/Filter/$field");
+ $self->{'menuFilter'.$field}->set_accel_group($self->{accel});
+
+ my $all = Gtk2::RadioMenuItem->new_with_mnemonic(undef,$self->{parent}->{lang}->{MenuNoFilter});
+ $self->{'group'.$field} = $all->get_group();
+ $self->{'menuFilter'.$field}->append($all);
+ $all->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, '');
+ });
+
+ if (($fieldsInfo->{$field}->{type} eq 'history text') ||
+ ($fieldsInfo->{$field}->{type} eq 'single list'))
+ {
+ $self->{dynamicFilters}->{$field} = 1;
+ #$self->checkFilter($field);
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'yesno')
+ {
+ $filter->{'values'} = 'both' if ! $filter->{'values'} ;
+ if (($filter->{'values'} eq 'on') || ($filter->{'values'} eq 'both'))
+ {
+ my $labelOn = $filter->{labelon} || 'CheckYes';
+ my $on = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($labelOn));
+ $self->{'menuFilter'.$field}->append($on);
+ $on->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, 1);
+ });
+ }
+ if (($filter->{'values'} eq 'off') || ($filter->{'values'} eq 'both'))
+ {
+ my $labelOff = $filter->{labeloff} || 'CheckNo';
+ my $off = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($labelOff));
+ $self->{'menuFilter'.$field}->append($off);
+ $off->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, 0);
+ });
+ }
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'options')
+ {
+ $self->{dynamicFilters}->{$field} = 1
+ if $field eq $self->{parent}->{model}->{commonFields}->{borrower}->{name};
+ my $i = 0;
+ foreach my $valueInfo(@{$model->getValues($fieldsInfo->{$field}->{'values'})})
+ {
+ $self->{'menuFilter'.$field}->append(Gtk2::SeparatorMenuItem->new)
+ if (exists $fieldsInfo->{$field}->{separator})
+ && ($fieldsInfo->{$field}->{separator} == $i);
+ $i++;
+ next if $valueInfo->{displayed} eq '';
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $valueInfo->{displayed});
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, $valueInfo->{value});
+ });
+ }
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'number')
+ {
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($filter->{labelselect}));
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ my $widget = shift;
+ return if ! $widget->get_active;
+ return if $self->{deactivated};
+ my $title = $model->getDisplayedText($filter->{labelselect});
+ $title =~ s/_//g;
+ $title =~ s/\.\.\.//g;
+ my $dialog = new GCNumberEntryDialog($self->{parent},
+ $title,
+ $fieldsInfo->{$field}->{min},
+ $fieldsInfo->{$field}->{max},
+ $fieldsInfo->{$field}->{step});
+ $dialog->setValue($self->{numberValues}->{$field})
+ if $self->{numberValues} != undef;
+ my $value = $dialog->getUserValue;
+ if ($value >= 0)
+ {
+ $self->changeFilter($widget, $field, $value);
+ $self->{numberValues}->{$field} = $value;
+ }
+ });
+ }
+ elsif ($fieldsInfo->{$field}->{type} eq 'date')
+ {
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field},
+ $model->getDisplayedText($filter->{labelselect}));
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ my $widget = shift;
+ return if ! $widget->get_active;
+ return if $self->{deactivated};
+ my $title = $model->getDisplayedText($filter->{labelselect});
+ $title =~ s/_//g;
+ $title =~ s/\.\.\.//g;
+ my $dialog = new GCDateSelectionDialog($self->{parent});
+
+ $dialog->date(GCPreProcess::restoreDate($self->{dateValues}->{$field}))
+ if $self->{dateValues} != undef;
+ if ($dialog->show)
+ {
+ my $value = GCPreProcess::reverseDate($dialog->date);
+ $self->changeFilter($widget, $field, $value);
+ $self->{dateValues}->{$field} = $value;
+ }
+ });
+ }
+
+ my $label = $fieldsInfo->{$field}->{displayed};
+ $label = $model->getDisplayedText($filter->{label}) if $filter->{label};
+ $self->{'item'.$field} = Gtk2::MenuItem->new_with_mnemonic($label);
+ $self->{'item'.$field}->set_accel_path("<main>/Display/$field");
+ $self->{'item'.$field}->set_submenu($self->{'menuFilter'.$field});
+ $self->{menuDisplay}->insert($self->{'item'.$field}, $position);
+ $self->{'item'.$field}->show_all;
+
+ push @{$self->{existingFilters}}, $self->{'item'.$field};
+ push @{$self->{existingFiltersMenu}}, $self->{'menuFilter'.$field};
+
+ $position++;
+ }
+ }
+
+ sub createUserFilters
+ {
+ my ($self, $model, $position) = @_;
+ if (!defined $position)
+ {
+ # Here we need to find the correct position
+ $position = 0;
+ foreach ($self->{menuDisplay}->get_children)
+ {
+ $position++;
+ last if $_->isa('Gtk2::SeparatorMenuItem');
+ }
+ }
+ if ($self->{userFiltersMenu})
+ {
+ foreach ($self->{userFiltersMenu}->get_children)
+ {
+ $self->{userFiltersMenu}->remove($_);
+ $_->destroy;
+ }
+ $self->{menuDisplay}->remove($self->{userFiltersItem});
+ $self->{userFiltersMenu}->destroy;
+ $self->{userFiltersItem}->destroy;
+ $self->{userFiltersMenu} = 0;
+ }
+ return if !$model->getName;
+ my @userFilters = @{$model->getUserFilters};
+ $self->{userFiltersMenu} = new Gtk2::Menu;
+ # Setting the accel group to be able to use also shortcuts on user filters
+ $self->{userFiltersMenu}->set_accel_group($self->{accel});
+ $self->{userFiltersItem} = Gtk2::MenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuSavedSearches});
+ $self->{userFiltersItem}->set_accel_path('<main>/Display/SavedSearches');
+ $self->{userFiltersItem}->set_submenu($self->{userFiltersMenu});
+ $self->{menuDisplay}->insert($self->{userFiltersItem}, $position);
+ if (@userFilters)
+ {
+ foreach my $userFilter(@userFilters)
+ {
+ my $filter = Gtk2::MenuItem->new($userFilter->{name});
+ $filter->set_accel_path('<main>/Display/SavedSearches/'.$userFilter->{name});
+ $filter->signal_connect('activate' => sub {
+ my ($widget, $filter) = @_;
+ $self->selectAll(1);
+ $self->{parent}->setSearchWithTypes(info => $filter->{info},
+ mode => $filter->{mode},
+ regexp => $filter->{regexp},
+ case => $filter->{case},
+ ignoreDiacritics => $filter->{ignoreDiacritics});
+ }, $userFilter);
+ $self->{userFiltersMenu}->append($filter);
+ }
+ }
+ $self->{userFiltersMenu}->append(Gtk2::SeparatorMenuItem->new);
+ my $newUserFilter = Gtk2::MenuItem->new($self->{parent}->{lang}->{MenuSavedSearchesSave});
+ $newUserFilter->signal_connect('activate' => sub {
+ $self->{parent}->saveCurrentSearch;
+ });
+ $self->{userFiltersMenu}->append($newUserFilter);
+ my $editUserFilter = Gtk2::MenuItem->new($self->{parent}->{lang}->{MenuSavedSearchesEdit});
+ $editUserFilter->signal_connect('activate' => sub {
+ $self->{parent}->editSavedSearches;
+ });
+ $self->{userFiltersMenu}->append($editUserFilter);
+
+ $self->{userFiltersItem}->show_all;
+ $self->{menuDisplay}->show_all;
+ }
+
+ sub refreshFilters
+ {
+ my $self = shift;
+ foreach (keys %{$self->{dynamicFilters}})
+ {
+ $self->checkFilter($_);
+ }
+ }
+
+ sub checkFilter
+ {
+ my ($self, $field) = @_;
+ return if ! exists $self->{dynamicFilters}->{$field};
+ $self->{deactivated} = 1;
+ my $values = $self->{parent}->{panel}->getValues($field);
+ $values = $values->[0] if ref($values->[0]) eq 'ARRAY';
+ my $current = $self->{'menuFilter'.$field}->get_active->child->get_label;
+ my $first = 1;
+ foreach ($self->{'menuFilter'.$field}->get_children)
+ {
+ if ($first)
+ {
+ $first = 0;
+ $_->set_active(1);
+ }
+ else
+ {
+ $self->{'menuFilter'.$field}->remove($_);
+ }
+ }
+ my $active = 0;
+ my $i = 0;
+ foreach (@$values)
+ {
+ next if !$_;
+ my ($label, $value) = ($_, $_);
+ if (ref($_) eq 'HASH')
+ {
+ $label = $_->{displayed};
+ $value = $_->{value};
+ }
+ my $item = Gtk2::RadioMenuItem->new_with_mnemonic($self->{'group'.$field}, $label);
+ $self->{'menuFilter'.$field}->append($item);
+ $item->signal_connect('activate' => sub {
+ $self->changeFilter(shift, $field, $value);
+ });
+ if ($label eq $current)
+ {
+ $item->set_active(1);
+ $active = $i + 1;
+ }
+ $i++;
+ }
+ $self->{'menuFilter'.$field}->show_all;
+ $self->{'menuFilter'.$field}->set_active($active);
+
+ $self->{deactivated} = 0;
+ }
+
+ sub changeFilter
+ {
+ my ($self, $widget, $filter, $value) = @_;
+ return if $self->{deactivated};
+ return if ! $widget->get_active;
+ $self->{parent}->setFilter($filter, $value);
+ }
+
+ sub setSaveActive
+ {
+ my ($self, $value) = @_;
+ $self->{savedb}->set_sensitive($value);
+ }
+
+ sub setAddBookmarkActive
+ {
+ my ($self, $value) = @_;
+ $self->{addBookmark}->set_sensitive($value);
+ }
+
+ sub setCollectionLock
+ {
+ my ($self, $value) = @_;
+ $self->{menuEditLockItemsItem}->set_active(0);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $accelMapFile) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{accel} = Gtk2::AccelGroup->new();
+
+ ############################
+ # File Menu
+ ############################
+
+ $self->{menuFile} = Gtk2::Menu->new;
+ $self->{menuFile}->set_accel_path('<main>/File');
+ $self->{menuFile}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $fto = Gtk2::TearoffMenuItem->new();
+ $self->{menuFile}->append($fto);
+ }
+
+ my $newdb = Gtk2::ImageMenuItem->new_from_stock('gtk-new');
+ $newdb->set_accel_path('<main>/File/gtk-new');
+ $newdb->signal_connect ('activate' => sub {
+ $self->{parent}->newList;
+ });
+ $self->{menuFile}->append($newdb);
+
+ my $opendb = Gtk2::ImageMenuItem->new_from_stock('gtk-open');
+ $opendb->set_accel_path('<main>/File/gtk-open');
+ $opendb->signal_connect ('activate' => sub {
+ $self->{parent}->openList;
+ });
+ $self->{menuFile}->append($opendb);
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{savedb} = Gtk2::ImageMenuItem->new_from_stock('gtk-save');
+ $self->{savedb}->set_accel_path('<main>/File/gtk-save');
+ $self->{savedb}->signal_connect ('activate' => sub {
+ $self->{parent}->saveList;
+ });
+ $self->{menuFile}->append($self->{savedb});
+
+ my $saveasdb = Gtk2::ImageMenuItem->new_from_stock('gtk-save-as');
+ $saveasdb->set_accel_path('<main>/File/gtk-save-as');
+ $saveasdb->signal_connect ('activate' => sub {
+ $self->{parent}->saveAs;
+ });
+ $self->{menuFile}->append($saveasdb);
+
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{newitem} = Gtk2::ImageMenuItem->new_from_stock('gtk-add');
+ $self->{newitem}->set_accel_path('<main>/File/gtk-add');
+ $self->{newitem}->signal_connect ('activate' => sub {
+ $self->{parent}->newItem;
+ });
+ $self->{menuFile}->append($self->{newitem});
+
+ my $properties = Gtk2::ImageMenuItem->new_from_stock('gtk-properties');
+ $properties->set_accel_path('<main>/File/gtk-properties');
+ $properties->signal_connect ('activate' => sub {
+ $self->{parent}->properties;
+ });
+ $self->{menuFile}->append($properties);
+
+ if ($GCStats::statisticsActivated)
+ {
+ my $statistics = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuStats});
+ $statistics->set_accel_path('<main>/File/Stats');
+ $statistics->signal_connect ('activate' => sub {
+ $self->{parent}->stats;
+ });
+ $self->{menuFile}->append($statistics);
+ }
+
+ $self->{menuLend} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuLend});
+ $self->{menuLend}->set_accel_path('<main>/File/Borrowers');
+ $self->{menuLend}->signal_connect ('activate' => sub {
+ $self->{parent}->showBorrowed;
+ });
+ $self->{menuFile}->append($self->{menuLend});
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{menuHistoryItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuHistory});
+ $self->{menuHistoryItem}->set_accel_path('<main>/File/History');
+ $self->{menuHistory} = Gtk2::Menu->new();
+ addHistoryMenu($self);
+ $self->{menuFile}->append($self->{menuHistoryItem});
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $importItem = Gtk2::ImageMenuItem->new_from_stock('gtk-convert');
+ $importItem->set_accel_path('<main>/File/gtk-convert');
+ $self->{menuImport} = Gtk2::Menu->new;
+ $self->{menuImport}->set_accel_path('<main>/Import');
+ $self->{menuImport}->set_accel_group($self->{accel});
+ $self->{importers} = {};
+ my $langName = $parent->{options}->lang;
+ foreach my $importer(@GCImport::importersArray)
+ {
+ $importer->setLangName($langName);
+ my $name = $importer->getName;
+ my $item = Gtk2::MenuItem->new_with_mnemonic($name);
+ $item->signal_connect ('activate' => sub {
+ $self->{parent}->import($importer);
+ });
+ $self->{importers}->{$name} = $item;
+ }
+ foreach my $importerName(sort keys %{$self->{importers}})
+ {
+ $self->{menuImport}->append($self->{importers}->{$importerName});
+ }
+ $importItem->set_submenu($self->{menuImport});
+ $self->{menuFile}->append($importItem);
+
+ my $exportItem = Gtk2::ImageMenuItem->new_from_stock('gtk-revert-to-saved');
+ $self->{menuExport} = Gtk2::Menu->new;
+ $self->{menuExport}->set_accel_path('<main>/Export');
+ $self->{menuExport}->set_accel_group($self->{accel});
+ $self->{exporters} = {};
+ foreach my $exporter(@GCExport::exportersArray)
+ {
+ $exporter->setLangName($langName);
+ my $item = Gtk2::MenuItem->new_with_mnemonic($exporter->getName);
+ $item->signal_connect ('activate' => sub {
+ $self->{parent}->export($exporter);
+ });
+ $self->{exporters}->{$exporter->getName} = $item;
+ }
+ foreach my $exportName(sort keys %{$self->{exporters}})
+ {
+ $self->{menuExport}->append($self->{exporters}->{$exportName});
+ }
+ $exportItem->set_submenu($self->{menuExport});
+ $self->{menuFile}->append($exportItem);
+
+ $self->{menuFile}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $leave = Gtk2::ImageMenuItem->new_from_stock('gtk-quit');
+ $leave->set_accel_path('<main>/File/gtk-quit');
+ $self->{menuFile}->append($leave);
+ $leave->signal_connect('activate' ,sub {
+ $self->{parent}->leave;
+ });
+
+ my $fileitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuFile});
+ $fileitem->set_submenu($self->{menuFile});
+
+ $self->append($fileitem);
+
+ ############################
+ # Edit Menu
+ ############################
+ $self->{menuEdit} = Gtk2::Menu->new;
+ $self->{menuEdit}->set_accel_path('<main>/Edit');
+ $self->{menuEdit}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $eto = Gtk2::TearoffMenuItem->new();
+ $self->{menuEdit}->append($eto);
+ }
+
+ $self->{duplicateItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-dnd');
+ $self->{duplicateItem}->set_accel_path('<main>/Edit/gtk-dnd');
+ $self->{duplicateItem}->signal_connect('activate' , sub {
+ $self->{parent}->duplicateItem;
+ });
+ $self->{menuEdit}->append($self->{duplicateItem});
+
+ $self->{selectAllItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-select-all');
+ $self->{selectAllItem}->set_accel_path('<main>/Edit/gtk-select-all');
+ $self->{selectAllItem}->signal_connect('activate' , sub {
+ $self->{parent}->selectAll;
+ });
+ $self->{menuEdit}->append($self->{selectAllItem});
+
+ $self->{deleteCurrentItem} = Gtk2::ImageMenuItem->new_from_stock('gtk-delete');
+ $self->{deleteCurrentItem}->set_accel_path('<main>/Edit/gtk-delete');
+ $self->{deleteCurrentItem}->signal_connect('activate' , sub {
+ $self->{parent}->deleteCurrentItem;
+ });
+ $self->{menuEdit}->append($self->{deleteCurrentItem});
+
+ $self->{menuEdit}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ $self->{editFieldsItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuEditFields});
+ $self->{editFieldsItem}->set_accel_path('<main>/Edit/Collection');
+ $self->{editFieldsItem}->signal_connect('activate' , sub {
+ $self->{parent}->editModel;
+ });
+ $self->{menuEdit}->append($self->{editFieldsItem});
+
+ $self->{menuEdit}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $queryReplaceItem = Gtk2::ImageMenuItem->new_from_stock('gtk-find-and-replace');
+ $queryReplaceItem->set_accel_path('<main>/Edit/gtk-find-and-replace');
+ $queryReplaceItem->signal_connect('activate' , sub {
+ $self->{parent}->queryReplace;
+ });
+ $self->{menuEdit}->append($queryReplaceItem);
+
+ $self->{menuEdit}->append(Gtk2::SeparatorMenuItem->new);
+ ############################
+
+ my $lockItemsItem = Gtk2::CheckMenuItem->new_with_mnemonic($parent->{lang}->{MenuEditLockItems});
+ $lockItemsItem->set_accel_path('<main>/Edit/Lock');
+ $self->{menuEdit}->append($lockItemsItem);
+ #$lockItemsItem->set_active($parent->{items}->getLock);
+ $lockItemsItem->signal_connect('activate' , sub {
+ my $parent = $self;
+ my $self = shift;
+ return if $parent->{deactivated};
+ $parent->{parent}->setLock($self->get_active);
+ $self->toggled();
+ },$lockItemsItem);
+ $self->{menuEditLockItemsItem}=$lockItemsItem;
+ $lockItemsItem->{parent}=$self->{menuEdit};
+
+ my $editItem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuEdit});
+ $editItem->set_submenu($self->{menuEdit});
+ $self->append($editItem);
+
+ ############################
+ # Display Menu
+ ############################
+ $self->{menuDisplay} = Gtk2::Menu->new;
+ $self->{menuDisplay}->set_accel_path('<main>/Display');
+ $self->{menuDisplay}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $dto = Gtk2::TearoffMenuItem->new;
+ $self->{menuDisplay}->append($dto);
+ }
+ ############################
+
+ $self->{menuDisplay}->append(Gtk2::SeparatorMenuItem->new);
+
+ my $search = Gtk2::ImageMenuItem->new_from_stock('gtk-find');
+ $search->set_accel_path('<main>/Display/gtk-find');
+ $search->signal_connect('activate' , sub {
+ $self->{parent}->search('all');
+ });
+ $self->{menuDisplay}->append($search);
+
+ my $advancedSearch = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuAdvancedSearch});
+ $advancedSearch->set_accel_path('<main>/Display/Advanced');
+ my $advancedImage = Gtk2::Image->new_from_stock('gtk-find', 'menu');
+ $advancedSearch->set_image($advancedImage);
+ $advancedSearch->signal_connect('activate' , sub {
+ $self->{parent}->advancedSearch;
+ });
+ $self->{menuDisplay}->append($advancedSearch);
+
+ my $random = Gtk2::ImageMenuItem->new_from_stock('gtk-execute');
+ $random->set_accel_path('<main>/Display/gtk-execute');
+ $random->signal_connect('activate' , sub {
+ $self->{parent}->randomItem;
+ });
+ $self->{menuDisplay}->append($random);
+
+ $self->{menuDisplay}->append(new Gtk2::SeparatorMenuItem);
+ ############################
+
+ $self->{'viewAllItems'} = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuViewAllItems});
+ $self->{'viewAllItems'}->set_accel_path('<main>/Display/All');
+ my $refreshImage = Gtk2::Image->new_from_stock('gtk-refresh', 'menu');
+ $self->{'viewAllItems'}->set_image($refreshImage);
+ $self->{'viewAllItems'}->signal_connect('activate' , sub {
+ $self->selectAll
+ });
+ $self->{menuDisplay}->append($self->{'viewAllItems'});
+
+ $self->{displayItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDisplay});
+ $self->{displayItem}->set_submenu($self->{menuDisplay});
+
+ $self->append($self->{displayItem});
+
+ ############################
+ # Configuration Menu
+ ############################
+ $self->{menuConfig} = Gtk2::Menu->new;
+ $self->{menuConfig}->set_accel_path('<main>/Config');
+ $self->{menuConfig}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $cto = Gtk2::TearoffMenuItem->new;
+ $self->{menuConfig}->append($cto);
+ }
+
+ my $options = Gtk2::ImageMenuItem->new_from_stock('gtk-preferences');
+ $options->set_accel_path('<main>/Config/gtk-preferences');
+ $options->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->options;
+ }, $self->{parent});
+ $self->{menuConfig}->append($options);
+
+ $self->{displayItem} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDisplayMenu});
+ $self->{displayItem}->set_accel_path('<main>/Config/DisplayItem');
+ #$self->{displayItem}->set_submenu($self->createDisplayMenu);
+ $self->attachDisplayMenu;
+ $self->{menuConfig}->append($self->{displayItem});
+
+ my $toolbarConfig = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuToolbarConfiguration});
+ $toolbarConfig->set_accel_path('<main>/Config/Toolbar');
+ $toolbarConfig->signal_connect ('activate' => sub {
+ $self->{parent}->toolbarOptions;
+ });
+ $self->{menuConfig}->append($toolbarConfig);
+
+ $self->{menuConfig}->append(new Gtk2::SeparatorMenuItem);
+
+ my $displayOptions = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDisplayOptions});
+ $displayOptions->set_accel_path('<main>/Config/Display');
+ $displayOptions->signal_connect ('activate' => sub {
+ $self->{parent}->displayOptions;
+ });
+ $self->{menuConfig}->append($displayOptions);
+
+ $self->{defaultValues} = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuDefaultValues});
+ $self->{defaultValues}->set_accel_path('<main>/Config/DefaultValues');
+ $self->{defaultValues}->signal_connect ('activate' => sub {
+ $self->{parent}->setDefaultValues;
+ });
+ $self->{menuConfig}->append($self->{defaultValues});
+
+ my $borrowers = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuBorrowers});
+ $borrowers->set_accel_path('<main>/Config/Borrowers');
+ $borrowers->signal_connect ('activate' => sub {
+ $self->{parent}->borrowers;
+ });
+ $self->{menuConfig}->append($borrowers);
+
+ my $configitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuConfiguration});
+ $configitem->set_submenu($self->{menuConfig});
+ $self->append($configitem);
+
+ ############################
+ # Bookmarks Menu
+ ############################
+ $self->{menuBookmarks} = Gtk2::Menu->new;
+ $self->{menuBookmarks}->set_accel_path('<main>/Bookmarks');
+ $self->{menuBookmarks}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $bto = Gtk2::TearoffMenuItem->new;
+ $self->{menuBookmarks}->append($bto);
+ }
+
+ $self->{addBookmark} = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuBookmarksAdd});
+ my $addBookmarkImage = Gtk2::Image->new_from_stock('gtk-add', 'menu');
+ $self->{addBookmark}->set_image($addBookmarkImage);
+ $self->{addBookmark}->set_accel_path('<main>/Bookmarks/Add');
+ $self->{addBookmark}->signal_connect('activate' , sub {
+ $self->{parent}->addBookmark;
+ });
+ $self->{menuBookmarks}->append($self->{addBookmark});
+
+ my $editBookmark = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuBookmarksEdit});
+ $editBookmark->set_accel_path('<main>/Bookmarks/Edit');
+ $editBookmark->signal_connect('activate' , sub {
+ $self->{parent}->editBookmark;
+ });
+ $self->{menuBookmarks}->append($editBookmark);
+
+ $self->{menuBookmarks}->append(new Gtk2::SeparatorMenuItem);
+
+ my $bookmarksitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuBookmarks});
+ $bookmarksitem->set_submenu($self->{menuBookmarks});
+ $self->append($bookmarksitem);
+
+ ############################
+ # Help Menu
+ ############################
+ $self->{menuHelp} = Gtk2::Menu->new;
+ $self->{menuHelp}->set_accel_path('<main>/Help');
+ $self->{menuHelp}->set_accel_group($self->{accel});
+
+ if ($parent->{options}->tearoffMenus)
+ {
+ my $hto = Gtk2::TearoffMenuItem->new;
+ $self->{menuHelp}->append($hto);
+ }
+
+ my $help = Gtk2::ImageMenuItem->new_from_stock('gtk-help');
+ $help->set_accel_path('<main>/Help/Content');
+ $help->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->help;
+ }, $self->{parent});
+ $self->{menuHelp}->append($help);
+ my $plugins = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuAllPlugins});
+ $plugins->set_accel_path('<main>/Help/Plugins');
+ $plugins->signal_connect ('activate' => sub {
+ $self->{parent}->showAllPlugins;
+ });
+ $self->{menuHelp}->append($plugins);
+ my $depend = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{InstallDependencies});
+ $depend->set_accel_path('<main>/Help/Dependencies');
+ $depend->signal_connect ('activate' => sub {
+ $self->{parent}->showDependencies;
+ });
+ $self->{menuHelp}->append($depend);
+ my $bug = Gtk2::ImageMenuItem->new_with_mnemonic($parent->{lang}->{MenuBugReport});
+ $bug->set_accel_path('<main>/Help/Bug');
+ $bug->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->reportBug;
+ }, $self->{parent});
+ $self->{menuHelp}->append($bug);
+ my $about = Gtk2::ImageMenuItem->new_from_stock('gtk-about');
+ $about->set_accel_path('<main>/Help/gtk-about');
+ $about->signal_connect('activate' , sub {
+ my ($widget, $window) = @_;
+ $window->about;
+ }, $self->{parent});
+ $self->{menuHelp}->append($about);
+
+ my $helpitem = Gtk2::MenuItem->new_with_mnemonic($parent->{lang}->{MenuHelp});
+ $helpitem->set_submenu($self->{menuHelp});
+ $self->append($helpitem);
+
+ $parent->add_accel_group($self->{accel});
+
+ $self->{deactivateFilters} = 0;
+ $self->{contextUpdating} = 0;
+
+ $self->setSaveActive(0);
+
+ $self->{AccelMapFile} = $accelMapFile;
+ if (-f $accelMapFile)
+ {
+ Gtk2::AccelMap->load($accelMapFile);
+ }
+ else
+ {
+ $self->restoreDefaultAccels;
+ }
+ $self->get_settings->set(gtk_can_change_accels => 1);
+
+ return $self;
+
+ }
+
+ sub save
+ {
+ my $self = shift;
+ Gtk2::AccelMap->save($self->{AccelMapFile});
+ }
+
+ sub restoreDefaultAccels
+ {
+ my $self = shift;
+
+ Gtk2::AccelMap->foreach(undef, sub {
+ my ($path, $key, $modifier, $changed) = @_;
+ if ($path =~ m|(gtk-.*?)$|)
+ {
+ my $stockItem = Gtk2::Stock->lookup($1);
+ Gtk2::AccelMap->change_entry($path,
+ $stockItem->{keyval},
+ $stockItem->{modifier},
+ 1);
+ }
+ else
+ {
+ Gtk2::AccelMap->change_entry($path,
+ undef,
+ [],
+ 1);
+ }
+ });
+
+ Gtk2::AccelMap->change_entry('<main>/Bookmarks/Add',
+ ord('d'),
+ 'control-mask',
+ 1);
+
+
+ return $self;
+ }
+
+ sub setLock
+ {
+ my ($self, $value) = @_;
+ $self->block;
+ $self->{menuEditLockItemsItem}->set_active($value);
+ $self->unblock;
+ }
+
+ sub selectAll
+ {
+ my ($self, $noRefresh) = @_;
+
+ $self->block;
+ $self->{parent}->removeSearch($noRefresh);
+
+ foreach (@{$self->{existingFiltersMenu}})
+ {
+ $_->set_active(0);
+ $_->get_active->set_active(1);
+ }
+ $self->unblock;
+ }
+
+ sub block
+ {
+ my $self = shift;
+
+ $self->{parent}->blockListUpdates(1);
+ $self->{deactivated} = 1;
+ }
+
+ sub unblock
+ {
+ my $self = shift;
+
+ $self->{deactivated} = 0;
+ $self->{parent}->blockListUpdates(0);
+ }
+
+ sub attachDisplayMenu
+ {
+ my ($self, $newParent) = @_;
+
+ $newParent = $self->{displayItem}
+ if !$newParent;
+
+ my $displayMenu;
+ if ($self->{displayMenu})
+ {
+ $displayMenu = $self->{displayMenu};
+ $displayMenu->detach;
+ }
+ else
+ {
+ $displayMenu = Gtk2::Menu->new;
+ $displayMenu->set_accel_path('<main>/Config/DisplayMenu');
+ $displayMenu->set_accel_group($self->{accel});
+
+ my $fullScreen = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayFullScreen});
+ $fullScreen->set_accel_path('<main>/Config/DisplayMenu/Fullscreen');
+ $fullScreen->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ $parent->{parent}->setFullScreen($self->get_active);
+ $self->toggled();
+ }, $fullScreen);
+ $displayMenu->append($fullScreen);
+
+ $displayMenu->append(new Gtk2::SeparatorMenuItem);
+
+ my $menuBar = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayMenuBar});
+ $menuBar->set_accel_path('<main>/Config/DisplayMenu/MenuBar');
+ $menuBar->set_active($self->{parent}->{options}->displayMenuBar);
+ $menuBar->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ $parent->{parent}->setDisplayMenuBar($self->get_active);
+ $self->toggled();
+ }, $menuBar);
+ $displayMenu->append($menuBar);
+
+ $self->{displayToolBar} = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayToolBar});
+ $self->{displayToolBar}->set_accel_path('<main>/Config/DisplayMenu/ToolBar');
+ $self->{displayToolBar}->set_active($self->{parent}->{options}->toolbar);
+ $self->{displayToolBar}->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ return if !$self->{acceptEvents};
+ my $value = $self->get_active;
+ # If activated, we set it to the system setting
+ $value = 3
+ if $value;
+ $parent->{parent}->setDisplayToolBar($value);
+ $self->toggled();
+ }, $self->{displayToolBar});
+ $self->{displayToolBar}->{acceptEvents} = 1;
+ $displayMenu->append($self->{displayToolBar});
+
+ my $statusBar = Gtk2::CheckMenuItem->new_with_mnemonic($self->{parent}->{lang}->{MenuDisplayStatusBar});
+ $statusBar->set_accel_path('<main>/Config/DisplayMenu/StatusBar');
+ $statusBar->set_active($self->{parent}->{options}->status);
+ $statusBar->signal_connect ('activate' => sub {
+ my $parent = $self;
+ my $self = shift;
+ $parent->{parent}->setDisplayStatusBar($self->get_active);
+ $self->toggled();
+ }, $statusBar);
+ $displayMenu->append($statusBar);
+
+ $self->{displayMenu} = $displayMenu;
+ }
+
+ $newParent->set_submenu($displayMenu);
+ $newParent->show_all;
+ #return $self->{displayMenu};
+ }
+
+ sub setDisplayToolbarState
+ {
+ my ($self, $value) = @_;
+ #$self->{displayToolBar}->{acceptEvents} = 0;
+ $self->{displayToolBar}->set_active($value);
+ $self->{displayToolBar}->{acceptEvents} = 1;
+ }
+}
+
+{
+ package GCToolBar;
+ use base 'Gtk2::Toolbar';
+
+ our $CONFIGURATION_FILE = 'Toolbar';
+ our @DEFAULT_CONTROLS = (
+ 'gtk-add', 'gtk-save', 'gtk-preferences',
+ 'ToolbarSeparator',
+ 'gtk-find', 'gtk-refresh', 'gtk-execute', 'gtk-media-play',
+ 'ToolbarSeparator',
+ 'ToolbarGroupBy'
+ );
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+
+ $self->set_name('GCToolbar');
+ $self->set_show_arrow (1);
+
+ $self->{configFile} = $ENV{GCS_CONFIG_HOME}.'/'.$GCToolBar::CONFIGURATION_FILE;
+
+ $self->{stockIdToWidget} = {
+ 'gtk-add' => {
+ tooltip => $self->{lang}->{NewItemTooltip},
+ callback => sub {$parent->newItem}
+ },
+ 'gtk-save' => {
+ tooltip => $self->{lang}->{SaveListTooltip},
+ callback => sub {$parent->saveList}
+ },
+ 'gtk-preferences' => {
+ tooltip => $self->{lang}->{PreferencesTooltip},
+ callback => sub {$parent->options}
+ },
+ 'gtk-find' => {
+ tooltip => $self->{lang}->{SearchTooltip},
+ callback => sub {$parent->search('all')}
+ },
+ 'gtk-refresh' => {
+ tooltip => $self->{lang}->{ToolbarAllTooltip},
+ callback => sub {$parent->viewAllItems}
+ },
+ 'gtk-execute' => {
+ tooltip => $self->{lang}->{RandomTooltip},
+ callback => sub {$parent->randomItem}
+ },
+ 'gtk-media-play' => {
+ tooltip => $self->{lang}->{PlayTooltip},
+ callback => sub {$parent->playItem}
+ },
+ 'gtk-new' => {
+ tooltip => undef,
+ callback => sub {$parent->newList}
+ },
+ 'gtk-open' => {
+ tooltip => undef,
+ callback => sub {$parent->openList}
+ },
+ 'gtk-properties' => {
+ tooltip => undef,
+ callback => sub {$parent->properties}
+ },
+ 'gtk-quit' => {
+ tooltip => undef,
+ callback => sub {$parent->leave}
+ },
+ 'gtk-dnd' => {
+ tooltip => undef,
+ callback => sub {$parent->duplicateItem}
+ },
+ 'gtk-delete' => {
+ tooltip => undef,
+ callback => sub {$parent->deleteCurrentItem}
+ },
+ 'gtk-find-and-replace' => {
+ tooltip => undef,
+ callback => sub {$parent->queryReplace}
+ },
+ 'gtk-help' => {
+ tooltip => undef,
+ callback => sub {$parent->help}
+ },
+ };
+
+ $self->loadControls;
+
+ $self->{blocked} = 1;
+ $self->setSaveActive(0);
+ $self->{showFieldsSelection} = 1;
+
+ return $self;
+ }
+
+ sub loadControls
+ {
+ my $self = shift;
+ my @controls;
+ if (! -f $self->{configFile})
+ {
+ @controls = @GCToolBar::DEFAULT_CONTROLS;
+ }
+ else
+ {
+ open CONFIG, $self->{configFile};
+ my @array;
+ foreach (<CONFIG>)
+ {
+ s/\s+$//;
+ push @controls, $_;
+ }
+ close CONFIG;
+ }
+ foreach (@controls)
+ {
+ if (/^gtk-/)
+ {
+ $self->{controls}->{$_} = Gtk2::ToolButton->new_from_stock($_);
+
+ # Set the important property on the add and save buttons
+ # (shows text in toolbar, depending on gtk settings)
+ if (/add|save/)
+ {
+ $self->{controls}->{$_}->set_is_important(1);
+ }
+
+ $self->{controls}->{$_}->signal_connect('clicked' => $self->{stockIdToWidget}->{$_}->{callback});
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{$_}, $self->{stockIdToWidget}->{$_}->{tooltip}, '')
+ if $self->{stockIdToWidget}->{$_}->{tooltip};
+ $self->insert($self->{controls}->{$_}, -1);
+
+ }
+ elsif ($_ eq 'ToolbarSeparator')
+ {
+ $self->insert(Gtk2::SeparatorToolItem->new, -1);
+ }
+ else
+ {
+ if ($_ eq 'ToolbarGroupBy')
+ {
+ $self->{controls}->{groupLabel} = new Gtk2::Label($self->{lang}->{ToolbarGroupBy});
+ $self->{controls}->{groupOption} = new GCFieldSelector(0, undef, 1);
+ $self->{controls}->{groupOption}->set_focus_on_click(0);
+ $self->{controls}->{groupOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ my $field = $self->{controls}->{groupOption}->getValue;
+ return if $self->{currentGroupField} eq $field;
+ $self->{parent}->setGrouping($field);
+ });
+ my $groupVBox = new Gtk2::VBox(0,0);
+ $groupVBox->set_border_width(0);
+ $groupVBox->pack_start($self->{controls}->{groupOption}, 1, 0, 0);
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{groupOption}, $self->{lang}->{ToolbarGroupByTooltip}, '');
+ my $groupBox = new Gtk2::HBox(0,0);
+ $groupBox->pack_start($self->{controls}->{groupLabel}, 0, 0, 0);
+ $groupBox->pack_start($groupVBox, 1, 1, $GCUtils::halfMargin);
+ my $groupItem = new Gtk2::ToolItem;
+ $groupItem->add($groupBox);
+ $self->insert($groupItem, -1);
+ }
+ elsif ($_ eq 'OptionsView')
+ {
+ my %views = %{$self->{lang}->{OptionsViews}};
+ $self->{controls}->{viewOption} = new GCMenuList;
+ my @viewsOptions = map {{value => $_, displayed => $views{$_}}}
+ (sort keys %views);
+ $self->{controls}->{viewOption}->setValues(\@viewsOptions);
+ $self->{controls}->{viewOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ $self->{parent}->{options}->view($self->{controls}->{viewOption}->getValue);
+ $self->{parent}->setItemsList(0, 1);
+ });
+ my $listViewBox = new Gtk2::VBox(0,0);
+ $listViewBox->set_border_width(0);
+ $listViewBox->pack_start($self->{controls}->{viewOption}, 1, 0, 0);
+ my $viewItem = new Gtk2::ToolItem;
+ $viewItem->add($listViewBox);
+ $self->insert($viewItem, -1);
+ }
+ elsif ($_ eq 'OptionsLayout')
+ {
+ $self->{controls}->{layoutOption} = new GCMenuList;
+ $self->{controls}->{layoutOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ $self->{model}->{preferences}->layout($self->{controls}->{layoutOption}->getValue);
+ $self->{parent}->changePanel(0, 0);
+ });
+ my $layoutBox = new Gtk2::VBox(0,0);
+ $layoutBox->set_border_width(0);
+ $layoutBox->pack_start($self->{controls}->{layoutOption}, 1, 0, 0);
+ my $layoutItem = new Gtk2::ToolItem;
+ $layoutItem->add($layoutBox);
+ $self->insert($layoutItem, -1);
+ }
+ elsif ($_ eq 'MenuSavedSearches')
+ {
+ $self->{controls}->{userFiltersOption} = new GCMenuList;
+ $self->{controls}->{userFiltersOption}->setTitle($self->{parent}->{lang}->{MenuSavedSearches});
+ $self->{controls}->{userFiltersOption}->signal_connect('changed' => sub {
+ return if $self->{blocked};
+ my $idx = $self->{controls}->{userFiltersOption}->getValue;
+ $self->{controls}->{userFiltersOption}->{changeInProgress} = 1;
+ if ($idx == -1)
+ {
+ $self->{parent}->removeSearch(0);
+ }
+ else
+ {
+ $self->{parent}->removeSearch(1);
+ $self->{parent}->setSearchWithTypes(%{$self->{userFilters}->[$idx]});
+ }
+ $self->{controls}->{userFiltersOption}->{changeInProgress} = 0;
+ });
+
+ my $filterBox = new Gtk2::VBox(0,0);
+ $filterBox->set_border_width(0);
+ $filterBox->pack_start($self->{controls}->{userFiltersOption}, 1, 0, 0);
+ my $filterItem = new Gtk2::ToolItem;
+ $filterItem->add($filterBox);
+ $self->insert($filterItem, -1);
+ }
+ elsif ($_ eq 'ToolbarQuickSearch')
+ {
+ my $quickBox = new Gtk2::HBox(0,0);
+ $self->{controls}->{quickLabel} = new Gtk2::Label($self->{lang}->{ToolbarQuickSearchLabel});
+ $quickBox->pack_start($self->{controls}->{quickLabel}, 0, 0, 0);
+
+ $self->{controls}->{quickEntry} = new GCShortText;
+ $self->{controls}->{quickEntry}->signal_connect('activate' => sub {
+ $self->{parent}->setQuickSearch($self->{controls}->{quickFields}->getValue,
+ $self->{controls}->{quickEntry}->getValue);
+ $self->{controls}->{quickEntry}->grab_focus;
+ });
+
+ $self->{controls}->{quickFields} = new GCFieldSelector(0, undef, 0, 1, 1);
+ $self->{controls}->{quickFields}->set_focus_on_click(0);
+
+ # Without 2 handlers below, the focus goes out of the toolbar when
+ # pressing Tab or Shift-Tab
+ $self->{controls}->{quickEntry}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ if ($key eq 'Tab')
+ {
+ $self->{controls}->{quickFields}->grab_focus;
+ return 1;
+ }
+ # Let key be managed by Gtk2
+ return 0;
+ });
+ $self->{controls}->{quickFields}->signal_connect('key-press-event' => sub {
+ my ($widget, $event) = @_;
+ my $key = Gtk2::Gdk->keyval_name($event->keyval);
+ my $state = $event->get_state;
+ if (($key =~ /Tab$/) && ($state =~ /shift-mask/))
+ {
+ $self->{controls}->{quickEntry}->grab_focus;
+ return 1;
+ }
+ # Let key be managed by Gtk2
+ return 0;
+ });
+ $quickBox->pack_start($self->{controls}->{quickEntry}, 0, 0, $GCUtils::halfMargin);
+ my $quickFieldsBox = new Gtk2::VBox(0,0);
+ $quickFieldsBox->set_border_width(0);
+ $quickFieldsBox->pack_start($self->{controls}->{quickFields}, 1, 0, 0);
+ $quickBox->pack_start($quickFieldsBox, 0, 0, 0);
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{quickEntry}, $self->{lang}->{ToolbarQuickSearchTooltip}, '');
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{quickFields}, $self->{lang}->{ToolbarQuickSearchTooltip}, '');
+ my $quickItem = new Gtk2::ToolItem;
+ $quickItem->add($quickBox);
+ $self->insert($quickItem, -1);
+ }
+ }
+ }
+ my $separator = Gtk2::SeparatorToolItem->new;
+ $separator->set_expand(1);
+ $separator->set_draw(0);
+
+ my $logoPixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{parent}->{logosDir}.'/button.png');
+ my ($width, $height) = Gtk2::IconSize->lookup($self->get_icon_size);
+ $logoPixbuf = GCUtils::scaleMaxPixbuf($logoPixbuf, $width, $height);
+
+ my $logo = Gtk2::Image->new_from_pixbuf($logoPixbuf);
+ my $logoButton = new Gtk2::Button;
+ $logoButton->add($logo);
+ my $logoItem = new Gtk2::ToolItem;
+ $logoItem->add($logoButton);
+ $logoButton->set_relief('none');
+ $self->{parent}->{tooltips}->set_tip($logoButton,
+ $self->{lang}->{AboutTitle});
+ $logoButton->signal_connect('clicked' , sub {
+ $self->{parent}->about;
+ });
+
+ $self->insert($separator, -1);
+ $self->insert($logoItem, -1);
+ }
+
+ sub createUserFilters
+ {
+ my ($self, $model) = @_;
+ $self->{blocked} = 1;
+ if ($self->{controls}->{userFiltersOption})
+ {
+ $self->{userFilters} = $model->getUserFilters;
+ my $i = 0;
+ my @filters = map {{value => $i++,
+ displayed => $model->getDisplayedText($_->{name})}}
+ @{$self->{userFilters}};
+ $self->{controls}->{userFiltersOption}->setValues(\@filters);
+ }
+ $self->{blocked} = 0;
+ }
+
+ sub setShowFieldsSelection
+ {
+ my ($self, $value) = @_;
+ return;
+ return if ! $self->{controls}->{groupOption};
+ if ($value)
+ {
+ $self->{controls}->{groupLabel}->show;
+ $self->{groupBox}->show;
+ }
+ else
+ {
+ $self->{controls}->{groupLabel}->hide;
+ $self->{groupBox}->hide;
+ }
+ }
+
+ sub setSaveActive
+ {
+ my ($self, $value) = @_;
+ $self->{controls}->{'gtk-save'}->set_sensitive($value)
+ if $self->{controls}->{'gtk-save'};
+ }
+
+ sub setAddActive
+ {
+ my ($self, $value) = @_;
+ $self->{controls}->{'gtk-add'}->set_sensitive($value)
+ if $self->{controls}->{'gtk-add'};
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+ $self->{blocked} = 1;
+ $self->{model} = $model;
+ $self->{controls}->{groupOption}->setModel($model)
+ if $self->{controls}->{groupOption};
+ $self->setGroupField($model->{preferences}->groupBy, 1);
+
+ if ($self->{controls}->{quickFields})
+ {
+ $self->{controls}->{quickFields}->signal_handler_disconnect(
+ $self->{quickFieldsHandler}
+ ) if $self->{quickFieldsHandler};
+ $self->{controls}->{quickFields}->setModel($model);
+ $self->{controls}->{quickFields}->setValue($model->{preferences}->quickSearchField);
+ $self->{quickFieldsHandler} = $self->{controls}->{quickFields}->signal_connect(
+ 'changed' => sub {
+ my $value = $self->{controls}->{quickFields}->getValue;
+ $self->{model}->{preferences}->quickSearchField($value)
+ if $value;
+ });
+ }
+
+ if ($self->{controls}->{layoutOption})
+ {
+ my @panels = map {{value => $_,
+ displayed => $model->getDisplayedText($model->{panels}->{$_}->{label})}}
+ @{$model->{panelsNames}};
+ $self->{controls}->{layoutOption}->setValues(\@panels);
+ }
+
+ $self->createUserFilters($model);
+
+ # Update tooltip text
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-add'},
+ $self->{lang}->{NewItemTooltip})
+ if $self->{controls}->{'gtk-add'};
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-find'},
+ $self->{lang}->{SearchTooltip})
+ if $self->{controls}->{'gtk-find'};
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-refresh'},
+ $self->{lang}->{ToolbarAllTooltip})
+ if $self->{controls}->{'gtk-refresh'};
+
+ # Update add button text
+ if ($self->{controls}->{'gtk-add'})
+ {
+ my $addText = $self->{lang}->{MenuAddItem};
+ $addText =~ s/\_//g;
+ my $widget = $self->{controls}->{'gtk-add'}->get_children;
+ while ($widget)
+ {
+ if ($widget->isa(Gtk2::Label::))
+ {
+ $widget->set_text($addText);
+ last;
+ }
+ elsif ($widget->isa(Gtk2::Image::))
+ {
+ last;
+ }
+ $widget = $widget->get_children;
+ }
+ }
+
+ # Hide tonight button if needed
+ if ($self->{controls}->{'gtk-execute'})
+ {
+ $self->{controls}->{'gtk-execute'}->show;
+ $self->{controls}->{'gtk-execute'}->hide if !$model->hasRandom;
+ }
+
+ # Hide play button if needed
+ if ($self->{controls}->{'gtk-media-play'})
+ {
+ $self->{controls}->{'gtk-media-play'}->show;
+ # Update button tooltip
+ $self->{parent}->{tooltips}->set_tip($self->{controls}->{'gtk-media-play'},
+ $self->{lang}->{PlayTooltip});
+ $self->{controls}->{'gtk-media-play'}->hide if !$model->hasPlay;
+ }
+
+ $self->{blocked} = 0;
+ }
+
+ sub setGroupField
+ {
+ my ($self, $field, $force) = @_;
+ my $i = 0;
+ return if (defined $self->{currentGroupField}) && ($self->{currentGroupField} eq $field) && !$force;
+ $self->{currentGroupField} = $field;
+ $self->{controls}->{groupOption}->setValue($field)
+ if $self->{controls}->{groupOption};
+ }
+
+ sub setItemsList
+ {
+ my ($self, $view) = @_;
+ return if ! $self->{controls}->{viewOption};
+ $self->{controls}->{viewOption}->setValue($view);
+ }
+
+ sub setLayout
+ {
+ my ($self, $layout) = @_;
+ return if ! $self->{controls}->{layoutOption};
+ $self->{controls}->{layoutOption}->setValue($layout);
+ }
+
+ sub setSize
+ {
+ my ($self, $size) = @_;
+
+ if ($size == 3)
+ {
+ $self->unset_icon_size;
+ }
+ else
+ {
+ $self->set_icon_size($size == 1 ? 'small-toolbar' : 'large-toolbar');
+ }
+ }
+
+ sub removeSearch
+ {
+ my $self = shift;
+ $self->{blocked} = 1;
+ $self->{controls}->{quickEntry}->setValue('')
+ if $self->{controls}->{quickEntry};
+ if ($self->{controls}->{userFiltersOption})
+ {
+ $self->{controls}->{userFiltersOption}->clear
+ if !$self->{controls}->{userFiltersOption}->{changeInProgress};
+ }
+ $self->{blocked} = 0;
+ }
+
+}
+
+
+{
+ package GCToolbarOptionsDialog;
+ use base 'GCDoubleListDialog';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, 'Toolbar configuration', 1,
+ $parent->{lang}->{ImportExportFieldsUnused}, $parent->{lang}->{ImportExportFieldsUsed});
+
+ bless($self, $class);
+
+ $self->{separatorString} = $self->{parent}->{lang}->{ToolbarSeparator};
+
+ my $defaultButton = new GCButton->newFromStock('gtk-undo', 0, $parent->{lang}->{PanelRestoreDefault});
+ $defaultButton->set_border_width($GCUtils::margin);
+ $defaultButton->signal_connect('clicked' => sub {
+ $self->preFill;
+ });
+ my $clearButton = new GCButton->newFromStock('gtk-clear');
+ $clearButton->set_border_width($GCUtils::margin);
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clearList;
+ });
+
+ $self->getDoubleList->addToPermanent($self->{separatorString});
+ $self->getDoubleList->setDataHandler($self);
+ $self->getDoubleList->addBottomButtons($defaultButton,$clearButton);
+
+ $self->{configFile} = $ENV{GCS_CONFIG_HOME}.'/'.$GCToolBar::CONFIGURATION_FILE;
+ $self->{conversionMap} = {};
+
+ my @separatorXpm = (
+ '16 16 3 1',
+ ' c None', '- c grey', '+ c black',
+ ' +- ', ' +- ', ' +- ', ' +- ',
+ ' +- ', ' +- ', ' +- ', ' +- ',
+ ' +- ', ' +- ', ' +- ', ' +- ',
+ ' +- ', ' +- ', ' +- ', ' +- ');
+ $self->{separatorPixbuf} = Gtk2::Gdk::Pixbuf->new_from_xpm_data(@separatorXpm);
+
+ return $self;
+ }
+
+ sub getInitData
+ {
+ my $self = shift;
+
+ return $self->getDataFromList([
+ 'ToolbarSeparator',
+ 'gtk-add', 'gtk-save', 'gtk-preferences',
+ 'gtk-find', 'gtk-refresh', 'gtk-execute', 'gtk-media-play',
+ 'gtk-new', 'gtk-open', 'gtk-properties', 'gtk-quit',
+ 'gtk-dnd', 'gtk-delete', 'gtk-find-and-replace',
+ 'gtk-help',
+ 'ToolbarGroupBy', 'ToolbarQuickSearch', 'OptionsView', 'OptionsLayout',
+ 'MenuSavedSearches'
+ ], 1);
+ }
+
+ sub getData
+ {
+ my $self = shift;
+ if (! -f $self->{configFile})
+ {
+ return $self->getDefaultData;
+ }
+ open CONFIG, $self->{configFile};
+ my @array;
+ foreach (<CONFIG>)
+ {
+ s/\s+$//;
+ push @array, $_;
+ }
+ close CONFIG;
+ return $self->getDataFromList(\@array);
+ }
+
+ sub getDefaultData
+ {
+ my $self = shift;
+ return $self->getDataFromList(\@GCToolBar::DEFAULT_CONTROLS);
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ open CONFIG, '>',$self->{configFile};
+ foreach (@$list)
+ {
+ print CONFIG $self->{conversionMap}->{$_->[1]}, "\n";
+ }
+ close CONFIG;
+ }
+
+ sub preFill
+ {
+ my $self = shift;
+
+ my @data;
+ $self->getDoubleList->setListData($self->getDefaultData);
+ }
+
+ sub getDataFromList
+ {
+ my ($self, $list, $init) = @_;
+ my @data;
+ foreach my $id (@$list)
+ {
+ if ($id =~ /^gtk-/)
+ {
+ my $stockItem = Gtk2::Stock->lookup($id);
+ # Make sure string has model dependant parts translated:
+ (my $label = $self->{parent}->GCLang::getGenericModelString($stockItem->{label})) =~ s/_//g;
+ my $pixbuf = $self->{parent}->render_icon($id, 'menu');
+ push @data, [$pixbuf, $label];
+ $self->{conversionMap}->{$label} = $id if $init;
+ }
+ else
+ {
+ my $pixbuf = undef;
+ if ($id eq 'ToolbarSeparator')
+ {
+ $pixbuf = $self->{separatorPixbuf};
+ }
+ my $label = $self->{parent}->{lang}->{$id};
+ push @data, [$pixbuf, $label];
+ $self->{conversionMap}->{$label} = $id if $init;
+ }
+ }
+ return \@data;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCModel.pm b/lib/gcstar/GCModel.pm
new file mode 100644
index 0000000..2223e3e
--- /dev/null
+++ b/lib/gcstar/GCModel.pm
@@ -0,0 +1,2896 @@
+package GCModel;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use GCPlugins;
+
+use Storable;
+
+our $modelsSuffix = '.gcm';
+our $autoId = 'gcsautoid';
+our $autoField = 'GCSAuto';
+our $noneField = 'GCSNone';
+our $initDefault = 'DefaultNewItem';
+our $linkNameSeparator = '##';
+
+{
+ package GCModelLoader;
+
+ use GCUtils 'glob';
+ use XML::Simple;
+ $XML::Simple::PREFERRED_PARSER='XML::Parser';
+ #$XML::Simple::PREFERRED_PARSER='XML::SAX::Expat';
+
+ sub load
+ {
+ my ($self, $file) = @_;
+ open XML, $file;
+ binmode(XML, ':utf8');
+ $self->{xmlString} = do {local $/; <XML>};
+ $self->loadFromString;
+ close XML;
+ }
+
+ sub loadFromString
+ {
+ my $self = shift;
+ my $xs = XML::Simple->new;
+ return if ! $self->{xmlString};
+ $self->{collection} = $xs->XMLin($self->{xmlString},
+ ForceArray => ['item', 'values', 'filter', 'panel', 'group', 'field'],
+ KeyAttr => {
+ 'values' => 'id'
+ }
+ );
+ $self->doInitialization;
+ }
+
+ sub doInitialization
+ {
+ my $self = shift;
+ $self->{groups} = $self->{collection}->{groups}->{group};
+ $self->{fields} = $self->{collection}->{fields}->{field};
+ #$self->{filters} = $self->{collection}->{filters}->{filter};
+ $self->initFilters;
+ $self->{options} = $self->{collection}->{options};
+ $self->{commonFields} = $self->{collection}->{options}->{fields};
+ $self->{resultsFields} = $self->{collection}->{options}->{fields}->{results}->{field};
+ $self->{summaryFields} = $self->{collection}->{options}->{fields}->{summary}->{field};
+ $self->{defaultImage} = $ENV{GCS_SHARE_DIR}.'/logos/'.$self->{options}->{defaults}->{image};
+ $self->{userFiltersDir} = $ENV{GCS_DATA_HOME}.'/Filters/'.$self->getName;
+ $self->{random} = $self->{collection}->{random}->{filter};
+
+ my $lang = exists $self->{collection}->{lang} ? $self->{collection}->{lang} : "GCgeneric";
+ my $langName = $self->{parent}->{options}->lang;
+ my %tmpLang;
+
+ # The string should be splitted to avoid considering some scopped variables
+ eval "use GCLang::$langName"."::GCModels::$lang\n";
+ eval "%tmpLang = %GCLang::$langName"."::GCModels::".$lang."::lang";
+ $self->{lang} = \%tmpLang;
+
+ $self->loadPreferences;
+ #$self->checkMaster;
+ $self->addDefaultFields;
+ $self->addPredefinedValues;
+ $self->{searchFields} = 0;
+ $self->checkLending;
+ $self->checkTags;
+ $self->initFields;
+ $self->setDefaults;
+ $self->initPanels;
+ }
+
+ sub getSearchFields
+ {
+ my $self = shift;
+
+ if (!$self->{searchFields})
+ {
+ if (exists $self->{collection}->{options}->{fields}->{search})
+ {
+ $self->{searchFields} = [];
+ push @{$self->{searchFields}}, $_
+ foreach (@{$self->{collection}->{options}->{fields}->{search}->{field}})
+ }
+ else
+ {
+ $self->{searchFields} = [$self->{commonFields}->{title}];
+ }
+ }
+ return $self->{searchFields};
+ }
+
+ sub getSummaryFields
+ {
+ my $self = shift;
+
+ if (!$self->{summaryFields})
+ {
+ $self->{summaryFields} = [];
+ for my $field (@{$self->{resultsFields}})
+ {
+ next if $field eq $self->{commonFields}->{title};
+ push @{$self->{summaryFields}}, $field;
+ }
+ }
+ return $self->{summaryFields};
+ }
+
+ sub isSearchField
+ {
+ my ($self, $field) = @_;
+ foreach (@{$self->getSearchFields})
+ {
+ return 1 if $field eq $_;
+ }
+ return 0;
+ }
+
+ sub hasRandom
+ {
+ my $self = shift;
+ return ($self->{random} && (scalar @{$self->{random}})) ? 1 : 0;
+ }
+
+ sub hasPlay
+ {
+ my $self = shift;
+ return ($self->{commonFields}->{play}) ? 1 : 0;
+ }
+
+ sub saveToFile
+ {
+ my ($self, $file) = @_;
+
+ if (!open DATA, '>'.$file)
+ {
+ print "Could not save collection description in $file\n";
+ return 0;
+ }
+ binmode(DATA, ':utf8');
+ print DATA '<?xml version="1.0" encoding="UTF-8"?>
+';
+ print DATA $self->toString('collection', 1);
+ close DATA;
+ $self->{isInline} = 0;
+ }
+
+ sub setFields
+ {
+ my ($self, $fields, $hasLending, $hasTags) = @_;
+ #Force panel generation
+ delete $self->{collection}->{panels}->{panel};
+ $self->{collection}->{fields}->{field} = $fields;
+ $self->{collection}->{fields}->{lending} = ($hasLending ? 'true' : 'false');
+ $self->{collection}->{fields}->{tags} = ($hasTags ? 'true' : 'false');
+ $self->doInitialization;
+ }
+
+ sub setGroups
+ {
+ my ($self, $groups) = @_;
+
+ $self->{collection}->{groups}->{group} = $groups;
+ }
+
+ sub setOptions
+ {
+ my ($self, $fields, $defaultImage) = @_;
+ $self->{collection}->{options}->{fields} = $fields;
+ $self->{collection}->{options}->{defaults}->{image} = $defaultImage;
+ }
+
+ sub getCommonFields
+ {
+ my $self = shift;
+
+ return $self->{collection}->{options}->{fields};
+ }
+
+ sub getOriginalCollection
+ {
+ my ($self, $withPanel) = @_;
+ #First we clone our collection to do remove everything that have been auto-generated
+ my $collection = Storable::dclone($self->{collection});
+ foreach (@{$collection->{fields}->{field}})
+ {
+ delete $_->{hasHistory};
+ }
+ delete $collection->{panels} if ! $withPanel;
+ if ($self->{hasLending})
+ {
+ my @fields = @{$collection->{fields}->{field}};
+ for (my $i = 0; $i <= $#fields; $i++)
+ {
+ delete $collection->{fields}->{field}->[$i]
+ if $fields[$i]->{group} eq 'lending';
+ }
+ delete $collection->{groups}->{group}->[(scalar @{$collection->{groups}->{group}}) - 1];
+ }
+ if ($self->{hasTags})
+ {
+ my @fields = @{$collection->{fields}->{field}};
+ for (my $i = 0; $i <= $#fields; $i++)
+ {
+ delete $collection->{fields}->{field}->[$i]
+ if $fields[$i]->{group} eq 'tagpanel';
+ }
+ delete $collection->{groups}->{group}->[(scalar @{$collection->{groups}->{group}}) - 1];
+ }
+ if ($self->{defaultModifier})
+ {
+ delete $collection->{fields}->{lending};
+ delete $collection->{fields}->{tags};
+ delete $collection->{options};
+ delete $collection->{random};
+ }
+ return $collection;
+ }
+
+ sub getAddedFields
+ {
+ my $self = shift;
+ return [] if ! $self->{addedModel};
+ return $self->{addedModel}->{collection}->{fields}->{field};
+ }
+
+ sub getAddedGroups
+ {
+ my $self = shift;
+ return {} if ! $self->{addedModel};
+ return $self->{addedModel}->getGroups;
+ }
+
+ sub toString
+ {
+ my ($self, $root, $withPanel) = @_;
+ my $xs = XML::Simple->new;
+ my $collection = $self->getOriginalCollection($withPanel);
+ my $xmlData = $xs->XMLout($collection,
+ RootName => $root,
+ KeyAttr => {'group' => '',
+ 'values' => 'id'
+ });
+ if ($self->{defaultModifier})
+ {
+ $xmlData =~ s|(</?)item|$1userItem|g;
+ }
+ return $xmlData;
+ }
+
+ sub toStringAddedFields
+ {
+ my ($self, $root) = @_;
+ if (($self->{addedModel})
+ && exists $self->{addedModel}->{fieldsNames}
+ && scalar @{$self->{addedModel}->{fieldsNames}})
+ {
+ return $self->{addedModel}->toString($root, 1);
+ }
+ else
+ {
+ return '';
+ }
+ }
+
+ sub loadPreferences
+ {
+ my $self = shift;
+ if (! $self->{isInline})
+ {
+ $self->{configFile} = $ENV{GCS_CONFIG_HOME}.'/GCModels/'.$self->getName.'.conf';
+ $self->{preferences} = new GCOptionLoader($self->{configFile}, 0, $self->{parent}->{options});
+ }
+ $self->{defaultValuesFile} = $ENV{GCS_CONFIG_HOME}.'/GCModels/'.$self->getName.'.default.gcs';
+ }
+
+ sub setDefaults
+ {
+ my $self = shift;
+
+ $self->{fieldsInfo}->{$self->{commonFields}->{title}}->{init} = $GCModel::initDefault
+ if ! $self->{fieldsInfo}->{$self->{commonFields}->{title}}->{init};
+
+ $self->{preferences}->groupBy($self->{options}->{defaults}->{groupby})
+ if ! $self->{preferences}->exists('groupBy');
+
+ $self->{preferences}->quickSearchField($self->{commonFields}->{title})
+ if ! $self->{preferences}->exists('quickSearchField');
+ }
+
+ sub isEmpty
+ {
+ my $self = shift;
+ return (!$self->{fields} || ((scalar @{$self->{fields}}) == 0));
+ }
+
+ sub isPersonal
+ {
+ my $self = shift;
+ return ($self->{isInline} || $self->{isPersonal});
+ }
+
+ sub isInline
+ {
+ my $self = shift;
+ return $self->{isInline};
+ }
+
+ sub initFields
+ {
+ my $self = shift;
+
+ my @fieldsNames;
+ my %fieldsInfo;
+ my @fieldsHistory;
+ my @fieldsNotNull;
+ my @fieldsNotFormatted;
+ my @fieldsImage;
+ my @fieldsDate;
+ my @managedImages;
+ my $name;
+ foreach (@{$self->{fields}})
+ {
+ $name = $_->{value};
+ push @fieldsNames, $name;
+ $fieldsInfo{$name} = $_;
+ $fieldsInfo{$name}->{displayed} = $self->getDisplayedText($fieldsInfo{$name}->{label});
+ if (($_->{type} =~ /history/)
+ || (
+ ($_->{type} =~ /list/)
+ && ((!exists $_->{history}) || ($_->{history} ne 'false'))
+ ))
+ {
+ push @fieldsHistory, $name;
+ $fieldsInfo{$name}->{hasHistory} = 1;
+ }
+ elsif ($_->{type} eq 'image')
+ {
+ push @fieldsImage, $name;
+ push @managedImages, $name if (exists $_->{imported}) && ($_->{imported} eq 'true');
+ }
+ elsif ($_->{type} eq 'date')
+ {
+ push @fieldsDate, $name;
+ }
+ push @fieldsNotNull, $name
+ if (exists $_->{notnull}) && ($_->{notnull} eq 'true');
+ push @fieldsNotFormatted, $name
+ if ((!exists $_->{type}) || ($_->{type} ne 'formatted'));
+ }
+ $self->{fieldsNames} = \@fieldsNames;
+ $self->{fieldsInfo} = \%fieldsInfo;
+ $self->{fieldsHistory} = \@fieldsHistory;
+ $self->{fieldsNotNull} = \@fieldsNotNull;
+ $self->{fieldsNotFormatted} = \@fieldsNotFormatted;
+ $self->{managedImages} = \@managedImages;
+ $self->{fieldsImage} = \@fieldsImage;
+ $self->{fieldsDate} = \@fieldsDate;
+ }
+
+ sub setFilters
+ {
+ my ($self, $filters) = @_;
+ $self->{filters} = [];
+ $self->{filtersGroup} = [];
+ my %existingGroups = ();
+ my $idxGroup = 0;
+ # The filters have not groups. And we need to do some copy here
+ #foreach (keys %$filters)
+ foreach (@{$self->{fieldsNames}})
+ {
+ next if ! exists $filters->{$_};
+ my $filter = {
+ field => $_,
+ comparison => $filters->{$_}->{comparison},
+ numeric => $filters->{$_}->{numeric},
+ quick => $filters->{$_}->{quick}
+ };
+ $filter->{labelselect} = $filters->{$_}->{labelselect} if $filters->{$_}->{labelselect};
+ push @{$self->{filters}}, $filter;
+ my $group = $self->{fieldsInfo}->{$_}->{group};
+ if (! exists $existingGroups{$group})
+ {
+ $existingGroups{$group} = $idxGroup;
+ $self->{filtersGroup}->[$idxGroup] = {label => $group};
+ $idxGroup++;
+ }
+ push @{$self->{filtersGroup}->[$existingGroups{$group}]->{filter}}, $filter;
+ }
+ $self->{collection}->{filters}->{group} = $self->{filtersGroup};
+ }
+
+ sub initFilters
+ {
+ my $self = shift;
+
+ for my $group (@{$self->{collection}->{filters}->{group}})
+ {
+ foreach (@{$group->{filter}})
+ {
+ push @{$self->{filters}}, $_;
+ }
+ }
+ $self->{filtersGroup} = $self->{collection}->{filters}->{group};
+ }
+
+ sub getUserFilters
+ {
+ my $self = shift;
+ # Deactive user filters for personal collections without a name
+ return [] if ! $self->getName;
+ if (!$self->{userFilters})
+ {
+ my @filters;
+ mkdir $self->{userFiltersDir};
+ foreach my $filterFile(sort {uc($a) cmp uc($b)} glob($self->{userFiltersDir}.'/*'))
+ {
+ my $xs = XML::Simple->new;
+ my $filter = $xs->XMLin($filterFile,
+ ForceArray => ['info', 'filter']);
+ $self->{isUserFilterSaved}->{$filter->{name}} = 1;
+ foreach my $info (@{$filter->{info}})
+ {
+ $info->{filter}->[1] = 0 if ref $info->{filter}->[1] eq 'HASH';
+ $info->{filter}->[2] = undef if ref $info->{filter}->[2] eq 'HASH';
+ }
+ push @filters, $filter;
+ }
+ $self->{userFilters} = \@filters;
+ }
+ return $self->{userFilters};
+ }
+
+ sub filterNameToFile
+ {
+ my ($self, $name) = @_;
+ my $fileName = GCUtils::getSafeFileName($name);
+ return $self->{userFiltersDir}."/$fileName";
+ }
+
+ sub saveUserFilters
+ {
+ my $self = shift;
+ my $xs = XML::Simple->new;
+ foreach my $filter(@{$self->{userFilters}})
+ {
+ next if $self->{isUserFilterSaved}->{$filter->{name}};
+ $xs->XMLout($filter,
+ RootName => 'search',
+ OutputFile => $self->filterNameToFile($filter->{name}));
+ $self->{isUserFilterSaved}->{$filter->{name}} = 1;
+ }
+ }
+
+ sub setUserFilters
+ {
+ my ($self, $filters) = @_;
+ $self->{userFilters} = $filters;
+ # Make sure they will be saved if needed
+ foreach my $filter(@$filters)
+ {
+ $self->{isUserFilterSaved}->{$filter->{name}} = $filter->{saved};
+ # This should not be saved
+ delete $filter->{saved};
+ }
+ }
+
+ sub addUserFilter
+ {
+ my ($self, $filter) = @_;
+ push (@{$self->{userFilters}}, $filter);
+ my @sorted = sort {uc($a->{name}) cmp uc($b->{name})} @{$self->{userFilters}};
+ $self->{userFilters} = \@sorted;
+ $self->{isUserFilterSaved}->{$filter->{name}} = 0;
+ }
+
+ sub deleteUserFilters
+ {
+ my ($self, $names) = @_;
+ foreach my $name(@$names)
+ {
+ unlink $self->filterNameToFile($name);
+ }
+ }
+
+ sub existsUserFilter
+ {
+ my ($self, $name) = @_;
+ return 1 if exists $self->{isUserFilterSaved}->{$name};
+ return 1 if -e $self->filterNameToFile($name);
+ }
+
+ sub addDefaultFields
+ {
+ my $self = shift;
+ return if $self->isEmpty || $self->{defaultModifier};
+ if (! $self->{commonFields}->{id})
+ {
+ $self->{commonFields}->{id} = $GCModel::autoId;
+ push @{$self->{fields}},
+ {
+ value => $self->{commonFields}->{id},
+ type => 'number',
+ label => '',
+ init => '',
+ group => '',
+ imported => 'false'
+ };
+ }
+ }
+
+ sub addPredefinedValues
+ {
+ my $self = shift;
+
+ # Add file size units if needed
+ my @array;
+ my $val = 0;
+ foreach (@{$self->{parent}->{lang}->{PropertiesFileSizeSymbols}})
+ {
+ push @array,
+ {displayed => $_, content => $val++};
+ }
+ $self->{collection}->{options}->{values}->{filesizeunits}->{value} = \@array;
+ }
+
+ sub removeAddedFields
+ {
+ my $self = shift;
+ return if ! $self->{addedModel};
+ delete $self->{addedModel}->{collection}->{panels}->{panel};
+ foreach my $container('fieldsNames', 'fieldsHistory', 'fieldsNotNull',
+ 'fieldsNotFormatted', 'managedImages', 'fieldsImage')
+ {
+ my @filtered = grep(!/gcsfield/, @{$self->{$container}});
+ $self->{$container} = \@filtered;
+ }
+ foreach (keys %{$self->{panels}})
+ {
+ if ($_ eq 'form')
+ {
+ if ($self->{formNotebook})
+ {
+ my @filtered = grep(!$_->{userDefined}, @{$self->{formNotebook}->{item}});
+ $self->{formNotebook}->{item} = \@filtered;
+ }
+ }
+ else
+ {
+ my @filtered = grep(!$_->{userDefined}, @{$self->{panels}->{$_}->{item}});
+ $self->{panels}->{$_}->{item} = \@filtered;
+ }
+ }
+ my $addedModel = $self->{addedModel};
+ delete $self->{addedModel};
+ return $addedModel;
+ }
+
+ sub updateAddedFields
+ {
+ my ($self, $fields, $groups) = @_;
+
+ # First clean what we previously added
+ my $addedModel = $self->removeAddedFields;
+
+ if (!$addedModel)
+ {
+ # We didn't have one previously. We need to create it.
+ $addedModel = GCModelLoader->newEmpty($self->{parent}, {defaultModifier => 1});
+ }
+ $addedModel->setGroups($groups);
+ $addedModel->setFields($fields);
+
+ $self->addFields($addedModel);
+ }
+
+ sub addFields
+ {
+ my ($self, $model) = @_;
+ # Fields are stored in another model
+
+ $self->{addedModel} = $model;
+
+ return if ! scalar @{$model->{fieldsNames}};
+
+ # Groups part
+ my %groups = map { $_->{id} => 1 } @{$self->{groups}};
+ foreach (@{$model->{groups}})
+ {
+ push @{$self->{groups}}, $_
+ if !exists $groups{$_->{id}};
+ }
+
+ # initFields part
+ foreach(@{$model->{fieldsNames}})
+ {
+ push @{$self->{fieldsNames}}, $_;
+ $self->{fieldsInfo}->{$_} = $model->{fieldsInfo}->{$_};
+ }
+ push @{$self->{fieldsHistory}}, @{$model->{fieldsHistory}};
+ push @{$self->{fieldsNotNull}}, @{$model->{fieldsNotNull}};
+ push @{$self->{fieldsNotFormatted}}, @{$model->{fieldsNotFormatted}};
+ push @{$self->{managedImages}}, @{$model->{managedImages}};
+ push @{$self->{fieldsImage}}, @{$model->{fieldsImage}};
+
+ # initPanels part
+ foreach (keys %{$model->{panels}})
+ {
+ # We mark them to be able to remove them later
+ foreach my $container(@{$model->{panels}->{$_}->{item}})
+ {
+ $container->{userDefined} = 1;
+ }
+
+ if ($_ eq 'form')
+ {
+ # Search the main notebook
+ sub getNotebook
+ {
+ my $item = shift;
+ return $item if $item->{type} eq 'notebook';
+ foreach my $child(@{$item->{item}})
+ {
+ my $notebook = getNotebook($child);
+ return $notebook if $notebook;
+ }
+ return undef;
+ }
+ $self->{formNotebook} = getNotebook($self->{panels}->{$_});
+ push @{$self->{formNotebook}->{item}}, @{$model->{panels}->{$_}->{item}};
+ }
+ else
+ {
+ push @{$self->{panels}->{$_}->{item}}, @{$model->{panels}->{$_}->{item}};
+ }
+ }
+ }
+
+ sub checkLending
+ {
+ my $self = shift;
+ $self->{hasLending} = 0;
+ return if ! ($self->{collection}->{fields}->{lending} eq 'true');
+ $self->{hasLending} = 1;
+
+ # Add group
+ push @{$self->{groups}}, {
+ id => 'lending',
+ label => 'PanelLending'
+ };
+
+ # Add lending fields
+ push @{$self->{fields}}, (
+ {
+ value => 'borrower',
+ type => 'options',
+ label => 'PanelBorrower',
+ init => 'none',
+ group => 'lending',
+ imported => 'false'
+ },
+ {
+ value => 'lendDate',
+ type => 'date',
+ label => 'PanelLendDate',
+ init => '',
+ group => 'lending',
+ imported => 'false'
+ },
+ {
+ value => 'borrowings',
+ type => 'triple list',
+ label => 'PanelHistory',
+ label1 => 'PanelBorrower',
+ label2 => 'PanelLendDate',
+ label3 => 'PanelReturnDate',
+ init => '',
+ group => 'lending',
+ imported => 'false'
+ },
+ );
+
+ # Set fields names
+ $self->{commonFields}->{borrower} = {
+ name => 'borrower',
+ date => 'lendDate',
+ history => 'borrowings'
+ };
+ }
+
+ sub checkTags
+ {
+ my $self = shift;
+ $self->{hasTags} = 0;
+ return if ! ($self->{collection}->{fields}->{tags} eq 'true');
+ $self->{hasTags} = 1;
+
+ # Add group
+ push @{$self->{groups}}, {
+ id => 'tagpanel',
+ label => 'PanelTags'
+ };
+ # Add tag fields
+ push @{$self->{fields}}, (
+ {
+ value => 'favourite',
+ type => 'yesno',
+ label => 'PanelFavourite',
+ init => '0',
+ group => 'tagpanel',
+ imported => 'false'
+ },
+ {
+ value => 'tags',
+ type => 'single list',
+ label => 'TagsAssigned',
+ init => '',
+ group => 'tagpanel',
+ imported => 'false'
+ },
+ );
+
+ # Add filter
+ push @{$self->{filters}}, (
+ {
+ field => 'tags',
+ comparison => 'contain',
+ quick => 'true',
+ numeric => 'false'
+ },
+ {
+ field => 'favourite',
+ comparison => 'contain',
+ quick => 'true',
+ numeric => 'false'
+ },
+ );
+
+ }
+
+ sub initPanels
+ {
+ my $self = shift;
+ $self->createDefaultPanel if !$self->{collection}->{panels}->{panel};
+ return if !$self->{collection}->{panels}->{panel};
+ my @panels = @{$self->{collection}->{panels}->{panel}};
+ $self->{panelsNames} = [];
+ $self->{panels} = {};
+ foreach (@panels)
+ {
+ push @{$self->{panelsNames}}, $_->{name};
+ $self->{panels}->{$_->{name}} = $_;
+ }
+ }
+
+ sub createDefaultPanel
+ {
+ my $self = shift;
+ return if (! $self->{commonFields}->{title}) && (!$self->{defaultModifier});
+ my $panel;
+ $panel->{name} = 'form';
+ $panel->{label} = 'PanelForm';
+ $panel->{editable} = 'true';
+ my @items;
+
+ if (!$self->{defaultModifier})
+ {
+ my $header = {type => 'line'};
+ push @{$header->{item}}, {
+ type => 'value',
+ for => $self->{commonFields}->{id},
+ width => '5'
+ }
+ if $self->{commonFields}->{id} && ($self->{commonFields}->{id} ne $GCModel::autoId);
+ push @{$header->{item}}, {
+ type => 'value',
+ for => $self->{commonFields}->{title},
+ expand => 'true'
+ };
+ push @items, $header;
+ }
+
+ my $fields = $self->getDisplayedInfo;
+ my $notebook;
+ my $hasTabs;
+ if ($self->{defaultModifier})
+ {
+ $hasTabs = 1;
+ $notebook = undef;
+ }
+ else
+ {
+ $hasTabs = (scalar @$fields > 1);
+ if ($hasTabs)
+ {
+ $notebook = {type => 'notebook', expand => 'true'};
+ }
+ }
+
+ my $i = 0;
+ my $infoFrame;
+ foreach (@{$fields})
+ {
+ next if (($_->{id} eq 'lending') || ($_->{id} eq 'tagpanel'));
+ my $tab;
+ if ($hasTabs)
+ {
+ $tab = {type => 'tab', value => 'bla', title => $_->{title}, expand => 'true'};
+ }
+ else
+ {
+ $tab = {type => 'box', expand => 'true'};
+ $notebook = $tab;
+ }
+ my $tabRank = 0;
+ my $hasInfoFrame = 0;
+ if ($i == 0 && $self->{commonFields}->{cover})
+ {
+ $tab->{item} = [
+ {type => 'line', item => [{type => 'value',
+ for => $self->{commonFields}->{cover},
+ width => 150,
+ height => 150}]},
+ {type => 'table', cols => '2'}
+ ];
+ $infoFrame = {type => 'frame', cols => '2'};
+ push @{$tab->{item}->[0]->{item}}, $infoFrame;
+ $tabRank = 1;
+ $hasInfoFrame = 1;
+ }
+ else
+ {
+ $tab->{item} = [{type => 'table', cols => '4', expand => 'true'}];
+ }
+ my $row = 0;
+ my $frameRow = 0;
+ foreach my $item (@{$_->{items}})
+ {
+ next if ($item->{id} eq $self->{commonFields}->{id})
+ || ($item->{id} eq $self->{commonFields}->{title})
+ || ($item->{id} eq $self->{commonFields}->{cover})
+ || ($item->{id} eq $self->{commonFields}->{url});
+ my $type = $self->{fieldsInfo}->{$item->{id}}->{type};
+ my $longField = ($type eq 'long text') || ($type eq 'image')
+ || ($type =~ /list$/);
+ my $label = undef;
+ $label = {type => 'label', for => $item->{id},
+ col => '0'} if $type ne 'yesno';
+ my $value = {type => 'value', for => $item->{id},
+ col => ($label ? 1 : 0), expand => 'true',
+ colspan => ($label ? 1 : 2)};
+ my $extra = undef;
+ if ($type eq 'file')
+ {
+ # Add launcher next to file chooser field
+ $extra = {type => 'launcher', for => $item->{id}, col => '2'};
+ }
+ if ($hasInfoFrame && ($frameRow < 5) && ! $longField)
+ {
+ if ($label)
+ {
+ $label->{row} = $frameRow;
+ push @{$infoFrame->{item}}, $label;
+ }
+ $value->{row} = $frameRow;
+ push @{$infoFrame->{item}}, $value;
+ if ($extra)
+ {
+ $extra->{row} = $frameRow;
+ push @{$infoFrame->{item}}, $extra;
+ }
+ $frameRow++;
+ }
+ else
+ {
+ if (($type =~ /list$/) && ($self->{fieldsInfo}->{$item->{id}}->{flat} eq 'true'))
+ {
+ my $label =
+ push @{$tab->{item}->[$tabRank]->{item}},
+ {type => 'expander', title => $self->{fieldsInfo}->{$item->{id}}->{label},
+ collapsed => '%'.$item->{id}.'%',
+ row => $row, col => 0, colspan => 3,
+ item => [
+ {type => 'value', for => $item->{id}}
+ ]
+ };
+ }
+ else
+ {
+ my ($colspan, $expand);
+ if ($longField)
+ {
+ $value->{colspan} = 3;
+ }
+ else
+ {
+ $value->{expand} = 'default';
+ }
+ if ($label)
+ {
+ $label->{row} = $row;
+ push @{$tab->{item}->[$tabRank]->{item}}, $label;
+ }
+ $value->{row} = $row;
+ push @{$tab->{item}->[$tabRank]->{item}}, $value;
+ if ($extra)
+ {
+ $extra->{row} = $row;
+ push @{$tab->{item}->[$tabRank]->{item}}, $extra;
+ }
+ }
+ $row++;
+ }
+ }
+ $tab->{item}->[$tabRank]->{rows} = $row;
+ if ($hasTabs)
+ {
+ if ($self->{defaultModifier})
+ {
+ push @items, $tab;
+ }
+ else
+ {
+ push @{$notebook->{item}}, $tab;
+ }
+ }
+ $i++;
+ }
+ if ($self->{hasLending})
+ {
+ my $tab = {type => 'tab', value => 'lending',
+ title => 'PanelLending',
+ item => [
+ {type => 'table', rows => '3',
+ item => [
+ {type => 'label', for => 'borrower', row => '0', col => '0'},
+ {type => 'value', for => 'borrower', row => '0', col => '1'},
+ {type => 'special', for => 'mailButton', row => '0', col => '2'},
+ {type => 'label', for => 'lendDate', row => '1', col => '0'},
+ {type => 'value', for => 'lendDate', row => '1', col => '1'},
+ {type => 'special', for => 'itemBackButton', row => '1', col => '2'}
+ ]
+ },
+ {type => 'label', for => 'borrowings', align => 'left'},
+ {type => 'line', expand => 'true',
+ item => [
+ {type => 'box', width => '64'},
+ {type => 'value', for => 'borrowings', expand => 'true'},
+ {type => 'box', width => '64'}
+ ]
+ }
+ ]
+ };
+ push @{$notebook->{item}}, $tab
+ }
+
+ if ($self->{hasTags})
+ {
+ my $tab = {type => 'tab', value => 'tagpanel',
+ title => 'PanelTags',
+ item => [
+ {type => 'line',
+ item => [
+ {type => 'value', for => 'favourite'}
+ ]
+ },
+ {type => 'value', for => 'tags', expand => 'true'}
+ ]
+ };
+ push @{$notebook->{item}}, $tab
+ }
+
+ if (!$self->{defaultModifier})
+ {
+ push @items, $notebook;
+ my $footer = {type => 'line',
+ item => [
+ {
+ type => 'special',
+ for => 'deleteButton',
+ expand => 'true'
+ }
+ ]
+ };
+
+ unshift @{$footer->{item}}, {
+ type => 'value',
+ for => $self->{commonFields}->{url},
+ expand => 'true'
+ } if $self->{commonFields}->{url};
+
+ push @items, $footer;
+ }
+
+ $panel->{item} = \@items;
+ $self->{collection}->{panels}->{panel}->[0] = $panel;
+ $self->createDefaultReadOnlyPanel;
+ }
+
+ sub createDefaultReadOnlyPanel
+ {
+ my $self = shift;
+ return if (! $self->{commonFields}->{title}) && (!$self->{defaultModifier});
+ my $panel;
+ $panel->{name} = 'readonly';
+ $panel->{label} = 'PanelReadOnly';
+ $panel->{editable} = 'false';
+ my @items;
+
+ if (!$self->{defaultModifier})
+ {
+ my $header = {
+ type => 'line', item => [
+ {type => 'value', for => $self->{commonFields}->{title},
+ style => 'header', row => 0, col => 0, colspan => 3,
+ expand => 'true'}
+ ]
+ };
+ push @items, $header;
+ }
+
+ my $fields = $self->getDisplayedInfo;
+ my $i = 0;
+ my $infoTable;
+ my $currentTable;
+ foreach (@{$fields})
+ {
+ $infoTable = 0;
+ next if (($_->{id} eq 'lending') || ($_->{id} eq 'tagpanel'));
+ my $container;
+ my $inExpander = 0;
+ if (($i == 0) && (!$self->{defaultModifier}))
+ {
+ if ($self->{commonFields}->{cover})
+ {
+ my $line = {type => 'line',
+ item => [
+ {type => 'box', width => '150', style => 'page',
+ item => [
+ {type => 'value', width => '140', for => $self->{commonFields}->{cover}}
+ ]
+ }
+ ]
+ };
+ my $infoBox = {type => 'box', expand => 'true', item => []};
+ $infoTable = {type => 'table', cols => '2', expand => 'true'};
+ push @{$infoBox->{item}}, $infoTable;
+ push @{$line->{item}}, $infoBox;
+ push @items, $line;
+ }
+ $container = {type => 'table', cols => '2', expand => 'true'};
+ push @items, $container;
+ }
+ else
+ {
+ my $expander = {type => 'expander', title => $_->{title},
+ item => [
+ {type => 'table', cols => 2, expand => 'true', item => []}
+ ]
+ };
+ push @items, $expander;
+ $container = $expander->{item}->[0];
+ $inExpander = 1;
+ }
+ my $row = 0;
+ my $infoRow = 0;
+ foreach my $item (@{$_->{items}})
+ {
+ next if ($item->{id} eq $self->{commonFields}->{title})
+ || ($item->{id} eq $self->{commonFields}->{cover})
+ || ($item->{id} eq $self->{commonFields}->{url});
+ my $type = $self->{fieldsInfo}->{$item->{id}}->{type};
+ my $longField = ($type eq 'long text') || ($type eq 'image')
+ || ($type =~ /list$/o);
+ my $label = undef;
+ $label = {type => 'label', for => $item->{id},
+ col => '0'};
+ my $value = {type => 'value', for => $item->{id},
+ col => 1, expand => 'true', flat => ($item->{flat} || 'false'),
+ colspan => 1};
+ if ($infoTable && ($infoRow < 5) && ! $longField)
+ {
+ $label->{row} = $infoRow;
+ push @{$infoTable->{item}}, $label;
+ $value->{row} = $infoRow;
+ push @{$infoTable->{item}}, $value;
+ $infoRow++;
+ }
+ else
+ {
+ my ($colspan, $expand);
+ $label->{row} = $row;
+ $value->{row} = $row;
+ push @{$container->{item}}, $label;
+ push @{$container->{item}}, $value;
+ $row++;
+ }
+ }
+ $container->{rows} = $row;
+ $i++;
+ }
+ if ($self->{hasLending})
+ {
+ my $lendingExpander = {
+ type => 'expander',
+ title => 'PanelLending',
+ item => [
+ {type => 'table', rows => '4', cols => '2',
+ item => [
+ {type => 'label', for => 'borrower', row => '0', col => '0'},
+ {type => 'value', for => 'borrower', row => '0', col => '1', expand => 'true'},
+ {type => 'label', for => 'lendDate', row => '1', col => '0'},
+ {type => 'value', for => 'lendDate', row => '1', col => '1', expand => 'true'},
+ {type => 'line', row => '2', col => '0', colspan => '2', height => '12', expand => 'true'},
+ {type => 'line', row => '2', col => '0', colspan => '2', expand => 'true',
+ item => [
+ {type => 'box', width => '50', style => 'page'},
+ {type => 'value', for => 'borrowings', expand => 'true'},
+ {type => 'box', width => '50', style => 'page'},
+ ]
+ }
+ ]
+ }
+ ]
+ };
+ push @items, $lendingExpander;
+ }
+ if ($self->{hasTags})
+ {
+ my $tagsExpander = {
+ type => 'expander',
+ title => 'PanelTags',
+ item => [
+ {type => 'value', for => 'tags', expand => 'true'}
+ ]
+ };
+ push @items, $tagsExpander;
+ }
+
+ $panel->{item} = \@items;
+ $self->{collection}->{panels}->{panel}->[1] = $panel;
+ }
+
+ sub getGroups
+ {
+ my $self = shift;
+
+ if (!$self->{groupsHash})
+ {
+ $self->{groupsHash} = {};
+ foreach (@{$self->{groups}})
+ {
+ $self->{groupsHash}->{$_->{id}} = {
+ id => $_->{id},
+ label => $_->{label},
+ displayed => $self->getDisplayedText($_->{label})
+ };
+ }
+ }
+ return $self->{groupsHash};
+ }
+
+ sub getDefaultPanel
+ {
+ my $self = shift;
+ return $self->{panels}->{$self->{panelsNames}->[0]};
+ }
+
+ sub getName
+ {
+ my $self = shift;
+ return $self->{collection}->{name};
+ }
+
+ sub getDescription
+ {
+ my $self = shift;
+ my $description = $self->{collection}->{description} ?
+ $self->{collection}->{description} : $self->getDisplayedText('CollectionDescription');
+ return $description eq 'CollectionDescription' ? $self->getName : $description;
+ }
+
+ sub getDisplayedText
+ {
+ my ($self, $id) = @_;
+
+ return $self->{fieldsInfo}->{lc $id}->{displayed}
+ if $id =~ /^gcsfield/i;
+ return $self->{lang}->{$id} if exists $self->{lang}->{$id};
+ return $self->{parent}->{lang}->{$id} if exists $self->{parent}->{lang}->{$id};
+ return $id;
+ }
+
+ sub getDisplayedLabel
+ {
+ my ($self, $field) = @_;
+
+ return $self->getDisplayedText($self->{fieldsInfo}->{$field}->{label})
+ if exists $self->{fieldsInfo}->{$field};
+ return $self->getGroups->{$field}->{displayed}
+ if exists $self->getGroups->{$field};
+ return $self->getDisplayedText($field);
+ }
+
+ sub getDisplayedValue
+ {
+ my ($self, $values, $value) = @_;
+ foreach (@{$self->{collection}->{options}->{'values'}->{$values}->{value}})
+ {
+ return $self->getDisplayedText($_->{displayed}) if $_->{content} eq $value;
+ }
+ return "";
+ }
+
+ sub getDisplayedItems
+ {
+ my ($self, $number) = @_;
+ $number = 'X' if !defined $number;
+ return 'Items' if !exists $self->{lang}->{Items};
+ my $items = $self->{lang}->{Items};
+ if (ref($items) eq 'HASH')
+ {
+ return $items->{$number} if exists $items->{$number};
+ return $items->{X};
+ }
+ elsif (ref($items) eq 'CODE')
+ {
+ # Example of Items definition:
+ #Items => sub {
+ # my $number = shift;
+ # return 'Movie' if $number < 2;
+ # return 'Movies';
+ #},
+
+ return $items->($number);
+ }
+ else
+ {
+ return $items;
+ }
+ }
+
+ sub getValues
+ {
+ my ($self, $id) = @_;
+ my @result;
+ if ($id eq $self->{commonFields}->{borrower}->{name})
+ {
+ @result = (
+ {value => '', displayed => ''},
+ {value => 'none', displayed => $self->getDisplayedText('PanelNobody')}
+ );
+ my @borrowers = split m/\|/, $self->{parent}->{options}->borrowers;
+ foreach (@borrowers)
+ {
+ push @result, {value => $_, displayed => $_};
+ }
+ push @result, {value => 'unknown', displayed => $self->getDisplayedText('PanelUnknown')};
+ }
+ else
+ {
+ if ($id =~ /,/)
+ {
+ # If it contains a comma, it needs no translation (used by user-defined collections)
+ push @result, {displayed => $_, value => $_}
+ foreach (split /\s*,\s*/, $id);
+ }
+ else
+ {
+ push @result, {displayed => $self->getDisplayedText($_->{displayed}), value => $_->{content}}
+ foreach (@{$self->{collection}->{options}->{'values'}->{$id}->{value}});
+ }
+ }
+ return \@result;
+ }
+
+ sub getFieldsCopy
+ {
+ my $self = shift;
+ my @result;
+ foreach (@{$self->{fieldsNames}})
+ {
+ my $info = $self->{fieldsInfo}->{$_};
+ #next if exists $info->{linkedto};
+ push @result, $_ if $info->{group}
+ && $info->{label};
+ }
+ return \@result;
+ }
+
+ sub getDisplayedInfo
+ {
+ my $self = shift;
+ # It will return a reference to an array. Each item will
+ # be like this :
+ # title => 'title of the corresponding tab'
+ # items => [ collection of items {id => '', label => ''} ]
+ my $result = [];
+ my %groups;
+
+ my $i = 0;
+
+ foreach (@{$self->{fieldsNames}})
+ {
+ my $info = $self->{fieldsInfo}->{$_};
+ next if (! $info->{label}); # || (exists $info->{linkedto});
+ my $group = $info->{group};
+ push @{$groups{$group}}, {
+ id => $_,
+ label => $self->getDisplayedText($info->{label})
+ } if $group;
+
+ $i++;
+ }
+ foreach (@{$self->{groups}})
+ {
+ push @$result, {
+ id => $_->{id},
+ title => $self->getDisplayedText($_->{label}),
+ items => $groups{$_->{id}}
+ };
+ }
+
+ return $result;
+ }
+
+ sub getInitInfo
+ {
+ my $self = shift;
+ my $info = {};
+ foreach my $field (@{$self->{fieldsNames}})
+ {
+ $info->{$field} = $self->getDisplayedText($self->{fieldsInfo}->{$field}->{init});
+ if ($self->{fieldsInfo}->{$field}->{type} eq 'formatted')
+ {
+ $info->{$field} =~ s/\[(.*?)\]//g;
+ $info->{$field} =~ s/%(.*?)%//g;
+ }
+ #foreach (@{$self->{fieldsNames}});
+ }
+ return $info;
+ }
+
+ # Required to use current class as a parameter of backend
+ sub preloadModel
+ {
+ my $self = shift;
+ return;
+ }
+
+ # Required to use current class as a parameter of backend
+ sub setCurrentModel
+ {
+ my $self = shift;
+ return 1;
+ }
+
+ # Required to use current class as a parameter of backend
+ sub transformPicturePath
+ {
+ my ($self, @args) = @_;
+
+ # Force the use of absolute path
+ my $currentOption = $self->{parent}->{options}->useRelativePaths;
+ $self->{parent}->{options}->useRelativePaths(0);
+
+ return $self->{parent}->transformPicturePath(@args);
+
+ $self->{parent}->{options}->useRelativePaths($currentOption);
+ }
+
+ sub getDefaultValuesBackend
+ {
+ my ($self) = @_;
+ $self->{defaultValuesBackend} = new GCBackend::GCBeXmlParser($self)
+ if !$self->{defaultValuesBackend};
+ $self->{defaultValuesBackend}->setParameters(file => $self->{defaultValuesFile},
+ version => $self->{parent}->{version});
+ return $self->{defaultValuesBackend}
+ }
+
+ sub getDefaultValues
+ {
+ my $self = shift;
+ if (! exists $self->{defaultValues})
+ {
+ # First get the default values as defined in the model
+ my $info = $self->getInitInfo;
+
+ # Then try to load user ones
+ if ( -r $self->{defaultValuesFile})
+ {
+ my $backend = $self->getDefaultValuesBackend;
+ my $loaded = $backend->load;
+ # We only consider the first item
+ my $userValues = $loaded->{data}->[0];
+ # We store that for later use
+ $self->{defaultValuesInformation} = $loaded->{information};
+
+ # Remove 'current' value for date, otherwise we'll store the current date
+ # as the default value
+ foreach ($self->{fieldsDate})
+ {
+ delete $userValues->{$_}
+ if $userValues->{$_} eq 'current';
+ }
+
+ # Merge init values with the loaded ones
+ $info = {%{$info}, %{$userValues}};
+ }
+
+ $self->{defaultValues} = $info;
+ }
+ return $self->{defaultValues};
+ }
+
+ sub setDefaultValues
+ {
+ my ($self, $info) = @_;
+
+ $self->{defaultValues} = $info;
+ my $backend = $self->getDefaultValuesBackend;
+
+ my $result = $backend->save([$info],
+ $self->{defaultValuesInformation},
+ undef,
+ 1);
+ if ($result->{error})
+ {
+ return $result->{error};
+ }
+ }
+
+
+ sub getFilterType
+ {
+ my ($self, $filter) = @_;
+
+ if (! $self->{filterTypes})
+ {
+ foreach (@{$self->{filters}})
+ {
+ $self->{filterTypes}->{$_->{field}} = [$_->{comparison}, $_->{numeric}, $_->{preprocess}];
+ }
+ }
+ return $self->{filterTypes}->{$filter};
+ }
+
+ sub getPluginsNames
+ {
+ my $self = shift;
+
+ my $tmp = $GCPlugins::pluginsNameArrays{$self->getName};
+ return [] if !$tmp;
+ return $tmp;
+ }
+
+ sub getAllPlugins
+ {
+ my $self = shift;
+
+ my $tmp = $GCPlugins::pluginsMap{$self->getName};
+ return {} if !$tmp;
+ return $tmp;
+ }
+
+ sub getPlugin
+ {
+ my ($self, $pluginName) = @_;
+
+ return $GCPlugins::pluginsMap{$self->getName}->{$pluginName};
+ }
+
+ sub getExtracter
+ {
+ my $self = shift;
+ #return $self->{extracter} if exists $self->{extracter};
+ return 0 if $self->isPersonal;
+ my $extracter;
+ (my $module = 'GCExtract::GCExtract'.$self->getName) =~ s/(GCExtract)GC(.)/$1\U$2\E/;
+ eval "use $module";
+ my $extracterName = 'GCExtract::'.$self->getName.'Extracter';
+ $extracter = new $extracterName(@_);
+ #$self->{extracter} = ($extracter->{errors} ? 0 : $extracter);
+ #return $self->{extracter};
+ return ($extracter->{errors} ? 0 : $extracter);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $file, $isPersonal) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent, isPersonal => $isPersonal};
+ bless $self, $class;
+ $self->{isInline} = 0;
+
+ # backend expects the model to be in {model}
+ # so we store there a reference to ourselves
+ $self->{model} = $self;
+
+ $self->load($file);
+ GCPlugins::loadPlugins($self->getName) if !$isPersonal && !$ENV{GCS_PROFILING};
+ return $self;
+ }
+
+ sub newFromInline
+ {
+ my ($proto, $parent, $container) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent};
+ bless $self, $class;
+ $self->{isInline} = 1;
+ $self->{xmlString} = $container->{inlineModel};
+ $self->{defaultModifier} = $container->{defaultModifier};
+ $self->{preferences} = GCOptionLoader->newFromXmlString($container->{inlinePreferences}, 0, $self->{parent}->{options});
+ $self->loadFromString;
+ return $self;
+ }
+
+ sub newEmpty
+ {
+ my ($proto, $parent, $container) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent, isInline => 1, isPersonal => 1};
+ bless $self, $class;
+ $self->{xmlString} = '<collection><options/><groups/><fields lending="false" tags="false"/></collection>';
+ $self->{preferences} = GCOptionLoader->newFromXmlString('',0, $self->{parent}->{options});
+ if ($container)
+ {
+ $self->{defaultModifier} = $container->{defaultModifier};
+ }
+ $self->loadFromString;
+ return $self;
+ }
+
+ sub save
+ {
+ my $self = shift;
+ $self->{preferences}->save
+ if ! $self->{isInline};
+ $self->saveUserFilters;
+ }
+}
+{
+ package GCModelsChanges;
+
+ use File::Basename;
+ use GCUtils 'glob';
+ my %versionwithchanges;
+
+ sub new
+ {
+ my ($proto, $parent,$model) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ parent => $parent,
+ cache => {},
+ lang => $parent->{lang},
+ persoDirectory => $ENV{GCS_DATA_HOME}.'/GCModels/',
+ defaultDirectory => $ENV{GCS_LIB_DIR}.'/GCModels/',
+ modelsSuffix => $GCModel::modelsSuffix,
+ model => $model
+ };
+
+ $self->{modelsDirectories} = [$self->{persoDirectory}, $self->{defaultDirectory}],
+
+ bless $self, $class;
+ $self->loadChangedVersionNumber;
+ return $self;
+ }
+
+ sub applyChanges
+ {
+ my($self,$data,$fileversion,$gcstarversion)=@_;
+ my @fileVersionSplited=split /\./,$fileversion;
+ my @gcstarVersionSplited=split /\./,$gcstarversion;
+ my $modelChanges=$versionwithchanges{$self->{model}};
+ sub compare
+ {
+ my ($arr1,$arr2,$i)=@_;
+ return 0 if ($i>$#$arr1 && $i>$#$arr2);
+ return -(0>$arr2->[$i])if ($i>$#$arr1);
+ return (0>$arr1->[$i]) if ($i>$#$arr2);
+
+ return -1 if $arr1->[$i]<$arr2->[$i];
+ return 1 if $arr1->[$i]>$arr2->[$i];
+ return compare($arr1,$arr2,$i+1);
+ }
+ # Warning : we assume that versions are sorted ascend
+ for my $vers(keys %$modelChanges)
+ {
+ my @versSplited=split /\./,$vers;
+ my $isConcerned=(compare \@fileVersionSplited,\@versSplited)<0;
+ $isConcerned&=(compare \@versSplited,\@gcstarVersionSplited)<=0;
+ foreach my $item(@$data)
+ {
+ $modelChanges->{$vers}($item);
+ }
+
+ }
+ }
+
+ sub loadChangedVersionNumber
+ {
+ my($self)=@_;
+ # TODO load from files
+
+ # Here is, for each model, a hash "versionNumber"=>sub
+ # example : "1.4.4"=>sub {
+ # $_[0]->{title}=lc $_[0]->{title};
+ # };
+ $versionwithchanges{GCfilms}={
+ };
+ # TODO sort version changes asc
+ }
+}
+
+{
+ package GCModelsCache;
+
+ use File::Basename;
+ use GCUtils 'glob';
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ mkdir $ENV{GCS_DATA_HOME}.'/GCModels/';
+ mkdir $ENV{GCS_DATA_HOME}.'/Filters/';
+ my $self = {
+ parent => $parent,
+ cache => {},
+ lang => $parent->{lang},
+ persoDirectory => $ENV{GCS_DATA_HOME}.'/GCModels/',
+ defaultDirectory => $ENV{GCS_LIB_DIR}.'/GCModels/',
+ modelsSuffix => $GCModel::modelsSuffix
+ };
+
+ $self->{modelsDirectories} = [$self->{persoDirectory}, $self->{defaultDirectory}],
+
+ bless $self, $class;
+ return $self;
+ }
+
+ sub getModel
+ {
+ my ($self, $name) = @_;
+
+ my $suffix = $self->{modelsSuffix};
+ (my $cacheId = $name) =~ s/$suffix$//;
+ if (!exists $self->{cache}->{$cacheId})
+ {
+ my $dir;
+ foreach $dir(@{$self->{modelsDirectories}})
+ {
+ my $file = $dir.$name;
+ $file .= $self->{modelsSuffix}
+ if $file !~ /$self->{modelsSuffix}$/;
+ next if ! -e $file;
+ $self->{cache}->{$cacheId} = GCModelLoader->new($self->{parent},
+ $file,
+ ($dir eq $self->{persoDirectory}));
+ }
+ }
+ # Clean it if user added some fields
+ $self->{cache}->{$cacheId}->removeAddedFields
+ if $self->{cache}->{$cacheId};
+ return $self->{cache}->{$cacheId};
+ }
+
+ sub getInfoFromFile
+ {
+ my ($self, $file) = @_;
+ my $result;
+ open DATA, $file;
+
+ while (<DATA>)
+ {
+ if ($_ =~ /<collection description="([^"]*?)".*?name="([^"]*?)"/)
+ {
+ $result = {
+ description => $1,
+ name => $2
+ };
+ last;
+ }
+ }
+
+ close DATA;
+ return $result;
+ }
+
+ sub getAllModels
+ {
+ my $self = shift;
+
+ my @results;
+ my $file;
+ my $dir;
+ foreach $dir(@{$self->{modelsDirectories}})
+ {
+ foreach $file(glob $dir.'*'.$self->{modelsSuffix})
+ {
+ push @results, $self->getModel(basename($file));
+ }
+ }
+ return \@results;
+ }
+
+ sub getPersonalModels
+ {
+ my $self = shift;
+
+ #Results is [ {name => '', description => ''} ]
+ # name could be used with getModel
+
+ my @results;
+
+ foreach (glob $self->{persoDirectory}.'*'.$self->{modelsSuffix})
+ {
+ my $info = $self->getInfoFromFile($_);
+ next if (! $info->{description}) || (! $info->{name});
+ push @results, $info;
+ }
+ return \@results;
+ }
+
+ sub getDefaultModels
+ {
+ my $self = shift;
+
+ #Results is [ {name => '', description => ''} ]
+ # name could be used with getModel
+
+ my @results;
+ $self->{langName} = $self->{parent}->{options}->lang;
+ foreach (glob $self->{defaultDirectory}.'*'.$self->{modelsSuffix})
+ {
+ #my $model = $self->getModel(basename($_));
+ #push @results, {name => $model->getName,
+ # description => $model->getDescription};
+ push @results, $self->extractInfos($_);
+ }
+ @results = sort {$a->{description} cmp $b->{description}} @results;
+ return \@results;
+ }
+
+ sub extractInfos
+ {
+ my ($self, $file) = @_;
+ my $result;
+
+ open FILE, $file;
+ my $lang;
+ while (<FILE>)
+ {
+ $result->{name} = $1
+ if /name="(.*?)"/;
+ if (m|<lang>(.*?)</lang>|)
+ {
+ $lang = $1;
+ last;
+ }
+ }
+ close FILE;
+
+ open LANG, $ENV{GCS_LIB_DIR}.'/GCLang/'.$self->{langName}."/GCModels/$lang.pm";
+ binmode(LANG, ':utf8');
+ while (<LANG>)
+ {
+ if (/CollectionDescription\s*=>\s*'(.*?)',/)
+ {
+ ($result->{description} = $1) =~ s/\\'/'/g;
+ last;
+ }
+
+ }
+ close LANG;
+
+ return $result;
+ }
+}
+
+use Gtk2;
+
+{
+ package GCModelsDialog;
+
+ use GCImport;
+ use base "GCModalDialog";
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->setModelsList;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $result = 0;
+ $self->{model} = undef;
+ $self->{gotKey} = 0;
+ while (1)
+ {
+ my $response = $self->run;
+ if ($response eq 'ok')
+ {
+ $result = 1;
+ my $path = ($self->{modelsList}->get_cursor)[0];
+ my @indices = $path ? $path->get_indices : (0);
+ if ($indices[0] == 0)
+ {
+ $self->{model} = GCModelLoader->newEmpty($self->{parent});
+ }
+ else
+ {
+ if (!exists $indices[1])
+ {
+ if ($self->{gotKey})
+ {
+ # We expand/collapse row if called by a pressed key
+ if ($self->{modelsList}->row_expanded($path))
+ {
+ $self->{modelsList}->collapse_row($path)
+ }
+ else
+ {
+ $self->{modelsList}->expand_row($path, 0)
+ }
+ $self->{gotKey} = 0;
+ }
+ $self->{modelsList}->grab_focus;
+ next;
+ }
+ my $hasPerso = scalar @{$self->{persoList}};
+ if ((($indices[0] == 2) && !$hasPerso)
+ || ($indices[0] == 3))
+ {
+ # Here we are importing
+ $self->{model} = 0;
+ $self->{importer} = $self->{importers}->[$indices[1]];
+ }
+ else
+ {
+ my $name = ((($indices[0] == 1) && ($hasPerso)) ?
+ $self->{persoList}->[$indices[1]]->{name} : $self->{defaultList}->[$indices[1]]->{name});
+ $self->{model} = $self->{factory}->getModel($name);
+ }
+ }
+ }
+ last;
+ }
+ $self->hide;
+ return $result;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $factory, $init) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $parent->{lang}->{ModelsSelect});
+
+ bless ($self, $class);
+ $self->{parent} = $parent;
+
+ my $column = Gtk2::TreeViewColumn->new_with_attributes('', Gtk2::CellRendererText->new,
+ 'text' => 0);
+ $self->{modelsModel} = new Gtk2::TreeStore('Glib::String');
+ $self->{modelsList} = Gtk2::TreeView->new_with_model($self->{modelsModel});
+ $self->{modelsList}->append_column($column);
+ $self->{modelsList}->set_headers_visible(0);
+ $self->{modelsList}->signal_connect ('row-activated' => sub {
+ $self->{gotKey} = 1;
+ $self->response('ok');
+ });
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_border_width(5);
+ $scrollPanelList->set_policy('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{modelsList});
+
+ $self->vbox->pack_start($scrollPanelList, 1, 1, 10);
+
+ $self->{factory} = $factory;
+ $self->{initVersion} = $init;
+ $self->set_default_size(300,350);
+
+ return $self;
+ }
+
+ sub isImporting
+ {
+ my $self = shift;
+ return $self->{model} == 0;
+ }
+
+ sub getModel
+ {
+ my $self = shift;
+ return $self->{model};
+ }
+
+ sub getImporter
+ {
+ my $self = shift;
+ return $self->{importer};
+ }
+
+ sub setModelsList
+ {
+ my $self = shift;
+ $self->{modelsModel}->clear;
+
+ my $iter = $self->{modelsModel}->append(undef);
+ $self->{modelsModel}->set($iter, (0 => $self->{parent}->{lang}->{ModelNewType}));
+
+ $self->{persoList} = $self->{factory}->getPersonalModels;
+ if (scalar @{$self->{persoList}})
+ {
+ my $persoIter = $self->{modelsModel}->append(undef);
+ $self->{modelsModel}->set($persoIter, (0 => $self->{parent}->{lang}->{ModelsPersonal}));
+ foreach (@{$self->{persoList}})
+ {
+ $iter = $self->{modelsModel}->append($persoIter);
+ $self->{modelsModel}->set($iter, (0 => $_->{description}));
+ }
+ }
+ my $defaultIter = $self->{modelsModel}->append(undef);
+ $self->{modelsModel}->set($defaultIter, (0 => $self->{parent}->{lang}->{ModelsDefault}));
+ $self->{defaultList} = $self->{factory}->getDefaultModels;
+ foreach (@{$self->{defaultList}})
+ {
+ $iter = $self->{modelsModel}->append($defaultIter);
+ $self->{modelsModel}->set($iter, (0 => $_->{description}));
+ }
+ $self->{modelsList}->expand_row($self->{modelsModel}->get_path($defaultIter), 0);
+ $self->{modelsList}->get_selection->select_iter($self->{modelsModel}->get_iter_first);
+
+ $self->addImport if $self->{initVersion};
+
+ $self->{modelsList}->grab_focus;
+ }
+
+ sub addImport
+ {
+ my $self = shift;
+ my $importIter = $self->{modelsModel}->append(undef);
+ (my $label = $self->{parent}->{lang}->{MenuImport}) =~ s/_//g;
+ $self->{modelsModel}->set($importIter, (0 => $label));
+ $self->{importers} = [];
+ my $iter;
+ foreach my $importer(@GCImport::importersArray)
+ {
+ next if scalar @{$importer->getModels} == 0;
+ push @{$self->{importers}}, $importer;
+ $iter = $self->{modelsModel}->append($importIter);
+ $self->{modelsModel}->set($iter, (0 => $importer->getName));
+ }
+ }
+}
+
+
+{
+ package GCModelsSettingsDialog;
+
+ use base 'GCModalDialog';
+
+ use GCGraphicComponents::GCBaseWidgets;
+
+ sub setPersonalMode
+ {
+ my ($self, $personal) = @_;
+ $self->{personal} = $personal;
+ if ($personal)
+ {
+ $self->set_title($self->{parent}->{lang}->{ModelSettings});
+ }
+ else
+ {
+ $self->set_title($self->{parent}->{lang}->{PanelUser});
+ $self->{notebook}->set_current_page(0);
+ }
+ $self->{notebook}->set_show_tabs($personal);
+ $self->{collectionName}->set_sensitive($personal);
+ }
+
+ sub setDescription
+ {
+ my ($self, $desc) = @_;
+ $self->{collectionName}->setValue($desc);
+ }
+
+ sub setSensitive
+ {
+ my ($self, $value) = @_;
+ $self->{fieldsOptionsTable}->set_sensitive($value);
+ $self->{removeButton}->set_sensitive($value);
+ $self->{toUp}->set_sensitive($value);
+ $self->{toDown}->set_sensitive($value);
+ $self->activateOkButton($value)
+ if $self->{personal};
+ }
+
+ sub initFields
+ {
+ my ($self, $fields, $groups, $commonFields, $withLending, $withTags) = @_;
+
+ # A clone was already made by caller
+ #$self->{fields} = Storable::dclone($fields) if $fields;
+ $self->{fields} = $fields;
+
+ $self->clearForm;
+ $self->{params}->{group}->setValues([]);
+ $self->{currentField} = -1;
+ $self->{fieldsList}->get_model->clear;
+ $self->{maxId} = 0;
+ my $i = -1;
+ if ($fields)
+ {
+ if (scalar @$fields)
+ {
+ $self->setSensitive(1);
+ $self->checkFieldType;
+ }
+ else
+ {
+ $self->setSensitive(0);
+ }
+ $self->{idToLabel} = {};
+ foreach (@{$self->{fields}})
+ {
+ $i++;
+ $_->{label} = $_->{displayed} if $_->{displayed};
+ $_->{group} = $groups->{$_->{group}}->{displayed}
+ if $groups->{$_->{group}}->{displayed};
+ $self->{params}->{group}->addHistory($_->{group});
+ if ($_->{value} eq $GCModel::autoId)
+ {
+ delete $self->{fields}->[$i];
+ next;
+ }
+ push @{$self->{fieldsList}->{data}}, [$_->{label}];
+ $_->{value} =~ /([0-9]+)$/;
+ $self->{maxId} = $1 if $self->{maxId} < $1;
+ $self->{idToLabel}->{$_->{value}} = $_->{label};
+ $_->{init} = $self->convertFormat($_->{init}, 1)
+ if $_->{type} eq 'formatted';
+ }
+ $self->displayField(0) if scalar(@{$self->{fields}});
+ }
+ $self->initCommonFields($commonFields);
+ $self->{hasLending}->setValue($withLending);
+ $self->{hasTags}->setValue($withTags);
+ }
+
+ sub convertFormat
+ {
+ my ($self, $format, $toUser) = @_;
+ my $converted = $format;
+ if ($toUser)
+ {
+ $converted =~ s/%(.*?)%/'%'.$self->idToLabel($1).'%'/ge;
+ }
+ else
+ {
+ $converted =~ s/%(.*?)%/'%'.$self->labelToId($1).'%'/ge;
+ }
+ # If some replacements failed, we clean the string
+ $converted =~ s/%%//g;
+ return $converted;
+ }
+
+ sub idToLabel
+ {
+ my ($self, $id) = @_;
+ for my $field (@{$self->{fields}})
+ {
+ return $field->{label}
+ if $field->{value} eq $id;
+ }
+ return '';
+ }
+
+ sub labelToId
+ {
+ my ($self, $label) = @_;
+ for my $field (@{$self->{fields}})
+ {
+ return $field->{value}
+ if $field->{label} eq $label;
+ }
+ return '';
+ }
+
+ sub initFilters
+ {
+ my ($self, $filters) = @_;
+
+ $self->{filters} = {};
+ foreach (@{$filters})
+ {
+ $self->{filters}->{$_->{field}} = {
+ comparison => $_->{comparison},
+ numeric => $_->{numeric},
+ quick => $_->{quick}
+ };
+ }
+
+ $self->displayFilter(0) if scalar(@{$self->{fields}});
+ $self->checkFilterActivated;
+ }
+
+ sub getFilters
+ {
+ my ($self, $fieldsInfo) = @_;
+
+ my $type;
+ foreach (keys %{$self->{filters}})
+ {
+ my $filter = $self->{filters}->{$_};
+ $type = $fieldsInfo->{$_}->{type};
+ $filter->{labelselect} = $self->{filter}->{comparison}->valueToDisplayed($filter->{comparison})
+ if ($type eq 'number') || ($type eq 'date');
+ }
+
+ return $self->{filters};
+ }
+
+ sub getGroups
+ {
+ my $self = shift;
+ my $groups = [];
+ my %alreadyPushed = ();
+ foreach (@{$self->{fields}})
+ {
+ push @$groups, {id => $_->{group}, label => $_->{group}}
+ if $_->{group}
+ && !$alreadyPushed{$_->{group}};
+ $alreadyPushed{$_->{group}} = 1;
+ }
+ if (! scalar(@$groups))
+ {
+ if ($self->{personal})
+ {
+ push @$groups, {id => $self->{parent}->{lang}->{OptionsMain}, label => 'OptionsMain',
+ displayed => $self->{parent}->{lang}->{OptionsMain}};
+ }
+ else
+ {
+ push @$groups, {id => $self->{parent}->{lang}->{PanelUser},
+ label => 'PanelUser',
+ displayed => $self->{parent}->{lang}->{PanelUser}};
+ }
+ }
+ my $defaultGroup = $groups->[0]->{id};
+ foreach (@{$self->{fields}})
+ {
+ $_->{group} = $defaultGroup if ! $_->{group};
+ }
+ return $groups;
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $response = $self->run;
+ $self->saveCurrent;
+ $self->saveCurrentFilter;
+ $self->hide;
+ if ($response eq 'ok')
+ {
+ # Restore formats
+ foreach my $field(@{$self->{fields}})
+ {
+ $field->{init} = $self->convertFormat($field->{init}, 0)
+ if $field->{type} eq 'formatted';
+ }
+ }
+ return ($response eq 'ok');
+ }
+
+ sub getName
+ {
+ # returns (collection description, safe name, full file name)
+ my $self = shift;
+ my $description = $self->{collectionName}->getValue;
+ my $name = GCUtils::getSafeFileName($description);
+ my $file = $ENV{GCS_DATA_HOME}.'/GCModels/'.$name.$GCModel::modelsSuffix;
+ return ($description, $name, $file);
+ }
+
+ sub saveCurrent
+ {
+ my $self = shift;
+ return if $self->{currentField} < 0;
+ foreach (keys %{$self->{params}})
+ {
+ $self->{fields}->[$self->{currentField}]->{$_} = $self->{params}->{$_}->getValue
+ if $self->{params}->{$_}->is_sensitive;
+ }
+ # Some adjustments
+ my $type = $self->{fields}->[$self->{currentField}]->{type};
+ # history text is managed through 2 fields
+ if ($type eq 'short text')
+ {
+ $self->{fields}->[$self->{currentField}]->{type} = 'history text'
+ if $self->{fields}->[$self->{currentField}]->{history};
+ delete $self->{fields}->[$self->{currentField}]->{history};
+ }
+ # By default, the image will be displayed, right click to change it
+ $self->{fields}->[$self->{currentField}]->{default} = 'view'
+ if $type eq 'image';
+ $self->{fields}->[$self->{currentField}]->{history} =
+ $self->{fields}->[$self->{currentField}]->{history} ? 'true' : 'false'
+ if exists $self->{fields}->[$self->{currentField}]->{history};
+ $self->{fields}->[$self->{currentField}]->{flat} =
+ $self->{fields}->[$self->{currentField}]->{flat} ? 'true' : 'false'
+ if exists $self->{fields}->[$self->{currentField}]->{flat};
+ $self->{params}->{group}->addHistory;
+ }
+
+ sub saveCurrentFilter
+ {
+ my $self = shift;
+ return if $self->{currentFilter} < 0;
+ # As we use the same model, the index is the same in the fields array
+ my $field = $self->{fields}->[$self->{currentFilter}]->{value};
+ if ($self->{filter}->{activated}->getValue)
+ {
+ $self->{filters}->{$field} = {
+ comparison => $self->{filter}->{comparison}->getValue,
+ numeric => $self->{filter}->{numeric}->getValueAsText,
+ quick => $self->{filter}->{quick}->getValueAsText
+ };
+ }
+ else
+ {
+ delete $self->{filters}->{$field};
+ }
+ }
+
+ sub changeCurrentLabel
+ {
+ my $self = shift;
+ return if $self->{currentField} < 0;
+ $self->{fieldsList}->{data}->[$self->{currentField}]->[0] = $self->{params}->{label}->getValue;
+ }
+
+ sub displayField
+ {
+ my ($self, $idx) = @_;
+
+ $self->{currentField} = $idx;
+ foreach (keys %{$self->{params}})
+ {
+ my $value = $self->{fields}->[$idx]->{$_};
+ if ($_ eq 'init')
+ {
+ $value = '' if $value eq $GCModel::initDefault;
+ }
+ elsif (($_ eq 'history') || ($_ eq 'flat'))
+ {
+ $value = ($value eq 'true') ? 1 : 0;
+ }
+ $self->{params}->{$_}->setValue($value);
+ }
+ if ($self->{fields}->[$idx]->{type} eq 'history text')
+ {
+ $self->{params}->{type}->setValue('short text');
+ $self->{params}->{history}->setValue(1);
+ }
+ $self->{fieldsList}->select($idx);
+ }
+
+ sub displayFilter
+ {
+ my ($self, $idx) = @_;
+
+ $self->{currentFilter} = $idx;
+ my $field = $self->{fields}->[$idx]->{value};
+ my $hasFilter = (exists $self->{filters}->{$field});
+ my $info = $self->{fields}->[$self->{currentFilter}];
+ if ($hasFilter)
+ {
+ $self->{filter}->{activated}->setValue(1);
+ $self->{filter}->{comparison}->setValue($self->{filters}->{$field}->{comparison});
+ $self->{filter}->{numeric}->setValue($self->{filters}->{$field}->{numeric} eq 'true');
+ $self->{filter}->{quick}->setValue($self->{filters}->{$field}->{quick} eq 'true');
+ }
+ else
+ {
+ $self->{filter}->{activated}->setValue(0);
+ $self->{filter}->{comparison}->setValue(0);
+ $self->{filter}->{numeric}->setValue(0);
+ $self->{filter}->{quick}->setValue(0);
+ }
+ $self->checkFilterSettings;
+ $self->{filtersList}->select($idx);
+ }
+
+ sub clearForm
+ {
+ my $self = shift;
+ foreach (keys %{$self->{params}})
+ {
+ $self->{params}->{$_}->setValue('');
+ }
+
+ }
+
+ sub moveDownUp
+ {
+ my ($self, $dir) = @_;
+ $self->saveCurrent;
+ my $newField = $self->{currentField} + $dir;
+ return if ($newField < 0) || ($newField >= scalar @{$self->{fields}});
+ ($self->{fields}->[$self->{currentField}], $self->{fields}->[$newField])
+ = ($self->{fields}->[$newField], $self->{fields}->[$self->{currentField}]);
+ $self->{fieldsList}->{data}->[$self->{currentField}] = [$self->{fields}->[$self->{currentField}]->{label}];
+ $self->{fieldsList}->{data}->[$newField] = [$self->{fields}->[$newField]->{label}];
+ $self->displayField($newField);
+ }
+
+ sub addField
+ {
+ my $self = shift;
+ my $newLabel = $self->{parent}->{lang}->{ModelNewField};
+ $self->saveCurrent;
+ $self->{maxId}++;
+ push (@{$self->{fields}}, {value => $self->{fieldsPrefix}.$self->{maxId},
+ label => $newLabel});
+ push (@{$self->{fieldsList}->{data}}, [$newLabel]);
+ my $nbFields = scalar(@{$self->{fields}});
+ if ($nbFields)
+ {
+ $self->setSensitive(1);
+ $self->checkFieldType;
+ }
+ $self->displayField($nbFields - 1);
+ $self->{params}->{label}->selectAll;
+ }
+
+ sub removeCurrent
+ {
+ my $self = shift;
+ splice(@{$self->{fieldsList}->{data}}, $self->{currentField}, 1);
+ splice(@{$self->{fields}}, $self->{currentField}, 1);
+ $self->{currentField}-- if $self->{currentField} >= scalar @{$self->{fields}};
+ if ($self->{currentField} < 0)
+ {
+ $self->clearForm;
+ $self->setSensitive(0);
+ }
+ else
+ {
+ $self->displayField($self->{currentField});
+ }
+ }
+
+ sub initCommonFields
+ {
+ my ($self, $init) = @_;
+
+ my @imgValues = ({value => $GCModel::autoField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsAuto}});
+ my @txtValues = ({value => $GCModel::autoField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsAuto}});
+ my @fileValues = ({value => $GCModel::autoField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsAuto}},
+ {value => $GCModel::noneField, displayed => $self->{parent}->{lang}->{ModelOptionsFieldsNone}});
+ if ($self->{fields})
+ {
+ foreach (@{$self->{fields}})
+ {
+ my $value = {value => $_->{value}, displayed => $_->{label}};
+ if ($_->{type} eq 'image')
+ {
+ push @imgValues, $value;
+ }
+ elsif ($_->{type} eq 'file')
+ {
+ push @fileValues, $value;
+ }
+ else
+ {
+ push @txtValues, $value;
+ }
+ }
+ }
+
+ $self->{common}->{title}->setValues(\@txtValues, 0, 1);
+ $self->{common}->{id}->setValues(\@txtValues, 0, 1);
+ $self->{common}->{cover}->setValues(\@imgValues, 0, 1);
+ $self->{common}->{play}->setValues(\@fileValues, 0, 1);
+
+ if ($init)
+ {
+ foreach (keys %{$self->{common}})
+ {
+ my $value = $init->{$_};
+ $value ||= (($_ eq 'play') ? $GCModel::noneField : $GCModel::autoField);
+ $self->{common}->{$_}->setValue($value);
+ }
+ }
+ }
+
+ sub getIdField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{id}->getValue;
+ $value = '' if $value eq $GCModel::autoField;
+ return $value;
+ }
+
+ sub getCoverField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{cover}->getValue;
+ # We look for the 1st picture
+ if ($value eq $GCModel::autoField)
+ {
+ $value = '';
+ foreach (@{$self->{fields}})
+ {
+ ($value = $_->{value}, last) if $_->{type} eq 'image';
+ }
+ }
+ # TODO We should check it is a picture
+ return $value;
+ }
+
+ sub getTitleField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{title}->getValue;
+ if ($value eq $GCModel::autoField)
+ {
+ # TODO We should filter to find the 1st suitable one
+ $value = $self->{fields}->[0]->{value};
+ }
+ return $value;
+ }
+
+ sub getPlayField
+ {
+ my $self = shift;
+ my $value = $self->{common}->{play}->getValue;
+ $value = '' if $value eq $GCModel::noneField;
+ # We look for the 1st file
+ if ($value eq $GCModel::autoField)
+ {
+ $value = '';
+ foreach (@{$self->{fields}})
+ {
+ ($value = $_->{value}, last) if $_->{type} eq 'file';
+ }
+ }
+ # TODO We should check it is a file
+ return $value;
+ }
+
+ sub hasLending
+ {
+ my $self = shift;
+
+ return $self->{hasLending}->getValue;
+ }
+
+ sub hasTags
+ {
+ my $self = shift;
+
+ return $self->{hasTags}->getValue;
+ }
+
+ sub checkFieldType
+ {
+ my $self = shift;
+
+ my $type = $self->{params}->{type}->getValue;
+
+ my $sensitive = 0;
+ $sensitive = 1 if $type eq 'number';
+ $self->{minLabel}->set_sensitive($sensitive);
+ $self->{params}->{min}->set_sensitive($sensitive);
+ $self->{maxLabel}->set_sensitive($sensitive);
+ $self->{params}->{max}->set_sensitive($sensitive);
+ $self->{stepLabel}->set_sensitive($sensitive);
+ $self->{params}->{step}->set_sensitive($sensitive);
+ $self->{displayasLabel}->set_sensitive($sensitive);
+ $self->{params}->{displayas}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if $type eq 'options';
+ $self->{valuesListLabel}->set_sensitive($sensitive);
+ $self->{params}->{values}->set_sensitive($sensitive);
+ $self->{valuesListLegend}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if $type eq 'file';
+ $self->{formatLabel}->set_sensitive($sensitive);
+ $self->{params}->{format}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if ($type eq 'short text') || ($type =~ /list$/);
+ $self->{params}->{history}->set_sensitive($sensitive);
+ $sensitive = 0;
+ $sensitive = 1 if $type =~ /list$/;
+ $self->{params}->{flat}->set_sensitive($sensitive);
+ }
+
+ sub checkFilterActivated
+ {
+ my $self = shift;
+
+ my $activated = $self->{filter}->{activated}->getValue;
+ $self->{comparisonLabel}->set_sensitive($activated);
+ $self->{filter}->{comparison}->set_sensitive($activated);
+ $self->{filter}->{numeric}->set_sensitive($activated);
+ $self->{filter}->{quick}->set_sensitive($activated);
+ $self->checkFilterSettings;
+ }
+
+ sub checkFilterSettings
+ {
+ my $self = shift;
+ # We activate quick filter only for some fields
+ my $activated = 0;
+ my $info = $self->{fields}->[$self->{currentFilter}];
+ my $hasFilter = $self->{filter}->{activated}->getValue;
+ my $type = $info->{type};
+ $activated = 1
+ if $hasFilter && (
+ ($info->{history} eq 'true')
+ || ($type eq 'history text')
+ || ($type eq 'yesno')
+ || ($type eq 'number')
+ || ($type eq 'date')
+ || ($type eq 'options')
+ );
+ $self->{filter}->{quick}->set_sensitive($activated);
+ $self->{filter}->{quick}->setValue(0) if !$activated;
+ $activated = 0;
+ $activated = 1
+ if $hasFilter
+ && ($type ne 'date')
+ && ($type ne 'yesno')
+ && ($type ne 'number');
+ $self->{filter}->{numeric}->set_sensitive($activated);
+ $self->{filter}->{numeric}->setValue(($info->{type} eq 'number')) if !$activated;
+ $activated = 1;
+ $activated = 0 if $type eq 'image';
+ $self->{filter}->{activated}->set_sensitive($activated);
+ $self->{filter}->{comparison}->set_sensitive($activated);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $list) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ModelSettings},
+ );
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->{currentField} = -1;
+ $self->{currentFilter} = -1;
+ $self->{fieldsPrefix} = 'gcsfield';
+
+ my $hboxCollectionName = new Gtk2::HBox(0,0);
+ my $collectionNameLabel = new GCLabel($parent->{lang}->{ModelName});
+ $self->{collectionName} = new GCShortText;
+ $self->{tooltips}->set_tip($self->{collectionName},
+ $self->{parent}->{lang}->{ModelTooltipName});
+ $hboxCollectionName->pack_start($collectionNameLabel, 0, 0, $GCUtils::margin);
+ $hboxCollectionName->pack_start($self->{collectionName}, 1, 1, 0);
+
+ $self->{notebook} = new Gtk2::Notebook;
+ $self->{notebook}->set_tab_pos('left');
+ $self->{notebook}->set_show_border(0);
+
+ my $vboxFields = new Gtk2::VBox(0,0);
+ my $vboxOptions = new Gtk2::VBox(0,0);
+ my $vboxFilters = new Gtk2::VBox(0,0);
+
+ $self->{fieldsList} = new Gtk2::SimpleList(
+ '' => "text"
+ );
+ $self->{fieldsList}->signal_connect (cursor_changed => sub {
+ my ($sl, $path, $column) = @_;
+ my @idx = $sl->get_selected_indices;
+ $self->changeCurrentLabel;
+ $self->saveCurrent;
+ $self->displayField($idx[0]);
+ });
+
+ $self->{fieldsList}->set_headers_visible(0);
+ my $vboxFieldsList = new Gtk2::VBox(0,0);
+ $self->{scrollPanelFields} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelFields}->set_policy ('automatic', 'automatic');
+ $self->{scrollPanelFields}->set_shadow_type('etched-in');
+ $self->{scrollPanelFields}->add($self->{fieldsList});
+ $vboxFieldsList->pack_start($self->{scrollPanelFields},1,1,0);
+ my $hboxFieldsActions = new Gtk2::HBox(0,0);
+ my $addButton = GCButton->newFromStock('gtk-add', 0);
+ $addButton->signal_connect('clicked' => sub {
+ $self->addField;
+ });
+ $self->{removeButton} = GCButton->newFromStock('gtk-remove', 0);
+ $self->{removeButton}->signal_connect('clicked' => sub {
+ $self->removeCurrent;
+ });
+ $hboxFieldsActions->pack_start($addButton,1,1,$GCUtils::halfMargin);
+ $hboxFieldsActions->pack_start($self->{removeButton},1,1,$GCUtils::halfMargin);
+ $vboxFieldsList->pack_start($hboxFieldsActions,0,0,$GCUtils::halfMargin);
+
+ my $vboxMove = new Gtk2::VBox(0,0);
+ $self->{toUp} =GCButton->newFromStock('gtk-go-up', 0);
+ $self->{toUp}->signal_connect('clicked' => sub {
+ $self->moveDownUp(-1);
+ });
+ $self->{toDown} =GCButton->newFromStock('gtk-go-down', 0);
+ $self->{toDown}->signal_connect('clicked' => sub {
+ $self->moveDownUp(1);
+ });
+ $vboxMove->pack_start($self->{toUp}, 0, 0, $GCUtils::margin);
+ $vboxMove->pack_start($self->{toDown}, 0, 0, $GCUtils::margin);
+
+ $self->{fieldsOptionsTable} = new Gtk2::Table(18, 4);
+ $self->{fieldsOptionsTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{fieldsOptionsTable}->set_col_spacings($GCUtils::margin);
+ $self->{fieldsOptionsTable}->set_border_width($GCUtils::margin);
+
+ # Information
+ #############
+ my $nameLabel = GCLabel->new($parent->{lang}->{ModelFieldName});
+ $self->{params}->{label} = new GCShortText;
+ $self->{tooltips}->set_tip($self->{params}->{label},
+ $parent->{lang}->{ModelTooltipLabel});
+ $self->{params}->{label}->signal_connect('focus-out-event' => sub {
+ $self->changeCurrentLabel;
+ return 0;
+ });
+ my $typeLabel = GCLabel->new($parent->{lang}->{ModelFieldType});
+ $self->{params}->{type} = new GCMenuList;
+ $self->{params}->{type}->setValues([
+ {value => 'short text', displayed => $parent->{lang}->{ModelFieldTypeShortText}},
+ {value => 'long text', displayed => $parent->{lang}->{ModelFieldTypeLongText}},
+ {value => 'yesno', displayed => $parent->{lang}->{ModelFieldTypeYesNo}},
+ {value => 'number', displayed => $parent->{lang}->{ModelFieldTypeNumber}},
+ {value => 'date', displayed => $parent->{lang}->{ModelFieldTypeDate}},
+ {value => 'options', displayed => $parent->{lang}->{ModelFieldTypeOptions}},
+ {value => 'image', displayed => $parent->{lang}->{ModelFieldTypeImage}},
+ {value => 'single list', displayed => $parent->{lang}->{ModelFieldTypeSingleList}},
+ {value => 'file', displayed => $parent->{lang}->{ModelFieldTypeFile}},
+ {value => 'formatted', displayed => $parent->{lang}->{ModelFieldTypeFormatted}},
+ ]);
+ $self->{params}->{type}->signal_connect('changed' => sub {
+ $self->checkFieldType;
+ });
+ my $groupLabel = GCLabel->new($parent->{lang}->{ModelFieldGroup});
+ $self->{params}->{group} = new GCHistoryText;
+ $self->{tooltips}->set_tip($self->{params}->{group},
+ $parent->{lang}->{ModelTooltipGroup});
+ my $informationLabel = new GCHeaderLabel($parent->{lang}->{ModelFieldInformation});
+ $self->{fieldsOptionsTable}->attach($informationLabel, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($nameLabel, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{label}, 3, 4, 1, 2, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($typeLabel, 2, 3, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{type}, 3, 4, 2, 3, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($groupLabel, 2, 3, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{group}, 3, 4, 3, 4, ['expand', 'fill'], 'fill', 0, 0);
+
+ # Parameters
+ #############
+ $self->{params}->{history} = GCCheckBox->new($parent->{lang}->{ModelFieldHasHistory});
+ $self->{params}->{flat} = GCCheckBox->new($parent->{lang}->{ModelFieldFlat});
+ $self->{tooltips}->set_tip($self->{params}->{history},
+ $parent->{lang}->{ModelTooltipHistory});
+ $self->{formatLabel} = GCLabel->new($parent->{lang}->{ModelFieldFileFormat});
+ $self->{params}->{format} = new GCMenuList;
+ $self->{tooltips}->set_tip($self->{params}->{format},
+ $parent->{lang}->{ModelTooltipFormat});
+ $self->{params}->{format}->setValues([
+ {value => 'file', displayed => $parent->{lang}->{ModelFieldFileFile}},
+ {value => 'video', displayed => $parent->{lang}->{ModelFieldFileVideo}},
+ {value => 'audio', displayed => $parent->{lang}->{ModelFieldFileAudio}},
+ {value => 'image', displayed => $parent->{lang}->{ModelFieldFileImage}},
+ {value => 'program', displayed => $parent->{lang}->{ModelFieldFileProgram}},
+ {value => 'url', displayed => $parent->{lang}->{ModelFieldFileUrl}},
+ {value => 'ebook', displayed => $parent->{lang}->{ModelFieldFileEbook}}
+ ]);
+ my $parametersLabel = new GCHeaderLabel($parent->{lang}->{ModelFieldParameters});
+ $self->{fieldsOptionsTable}->attach($parametersLabel, 0, 4, 5, 6, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{history}, 2, 4, 6, 7, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{flat}, 2, 4, 7, 8, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{formatLabel}, 2, 3, 8, 9, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{format}, 3, 4, 8, 9, ['expand', 'fill'], 'fill', 0, 0);
+
+ # Values
+ #############
+ my $initLabel = GCLabel->new($parent->{lang}->{ModelFieldInit});
+ $self->{params}->{init} = new GCShortText;
+ $self->{minLabel} = GCLabel->new($parent->{lang}->{ModelFieldMin});
+ $self->{params}->{min} = new GCShortText;
+ $self->{maxLabel} = GCLabel->new($parent->{lang}->{ModelFieldMax});
+ $self->{params}->{max} = new GCShortText;
+ $self->{stepLabel} = GCLabel->new($parent->{lang}->{ModelFieldStep});
+ $self->{params}->{step} = new GCCheckedText('0-9.');
+ $self->{valuesListLabel} = GCLabel->new($parent->{lang}->{ModelFieldList});
+ $self->{params}->{values} = new GCShortText;
+ $self->{valuesListLegend} = GCLabel->new($parent->{lang}->{ModelFieldListLegend});
+ $self->{displayasLabel} = GCLabel->new($parent->{lang}->{ModelFieldDisplayAs});
+ $self->{params}->{displayas} = new GCMenuList;
+ $self->{params}->{displayas}->setValues([
+ {value => 'text', displayed => $parent->{lang}->{ModelFieldDisplayAsText}},
+ {value => 'graphical', displayed => $parent->{lang}->{ModelFieldDisplayAsGraphical}}
+ ]);
+ my $valuesLabel = new GCHeaderLabel($parent->{lang}->{ModelFieldValues});
+ $self->{fieldsOptionsTable}->attach($valuesLabel, 0, 4, 10, 11, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($initLabel, 2, 3, 11, 12, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{init}, 3, 4, 11, 12, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{minLabel}, 2, 3, 12, 13, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{min}, 3, 4, 12, 13, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{maxLabel}, 2, 3, 13, 14, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{max}, 3, 4, 13, 14, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{stepLabel}, 2, 3, 14, 15, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{step}, 3, 4, 14, 15, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{displayasLabel}, 2, 3, 15, 16, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{displayas}, 3, 4, 15, 16, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{valuesListLabel}, 2, 3, 16, 17, 'fill', 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{params}->{values}, 3, 4, 16, 17, ['expand', 'fill'], 'fill', 0, 0);
+ $self->{fieldsOptionsTable}->attach($self->{valuesListLegend}, 3, 4, 17, 18, ['expand', 'fill'], 'fill', 0, 0);
+
+ $self->{scrollFieldsPane} = new Gtk2::ScrolledWindow;
+ $self->{scrollFieldsPane}->set_policy ('never', 'automatic');
+ $self->{scrollFieldsPane}->set_shadow_type('none');
+ $self->{scrollFieldsPane}->set_border_width($GCUtils::margin);
+ $self->{scrollFieldsPane}->add_with_viewport($self->{fieldsOptionsTable});
+
+ my $hboxFields = new Gtk2::HBox(0,0);
+ $hboxFields->set_border_width($GCUtils::margin);
+ $self->{fieldsPane} = new Gtk2::HPaned;
+ $self->{fieldsPane}->signal_connect('size-allocate' => sub {
+ $self->{scrollPanelFilters}->set_size_request($self->{scrollPanelFields}->allocation->width, -1);
+ });
+ $hboxFields->pack_start($vboxFieldsList, 1, 1, 0);
+ $hboxFields->pack_start($vboxMove, 0, 0, $GCUtils::halfMargin);
+ $self->{fieldsPane}->pack1($hboxFields,1,0);
+ $self->{fieldsPane}->pack2($self->{scrollFieldsPane},1,0);
+ $vboxFields->pack_start($self->{fieldsPane}, 1, 1, 0);
+
+ my $optionsTable = new Gtk2::Table(9, 4);
+ $optionsTable->set_row_spacings($GCUtils::halfMargin);
+ $optionsTable->set_col_spacings($GCUtils::margin);
+ $optionsTable->set_border_width($GCUtils::margin);
+
+ my $titleFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsTitle});
+ $self->{common}->{title} = new GCMenuList;
+ my $coverFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsCover});
+ $self->{common}->{cover} = new GCMenuList;
+ my $idFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsId});
+ $self->{common}->{id} = new GCMenuList;
+ my $playFieldLabel = GCLabel->new($parent->{lang}->{ModelOptionsFieldsPlay});
+ $self->{common}->{play} = new GCMenuList;
+ $self->{hasLending} = new GCCheckBox($parent->{lang}->{ModelCollectionSettingsLending});
+ $self->{tooltips}->set_tip($self->{hasLending},
+ $parent->{lang}->{ModelTooltipLending});
+ $self->{hasTags} = new GCCheckBox($parent->{lang}->{ModelCollectionSettingsTagging});
+ $self->{tooltips}->set_tip($self->{hasTags},
+ $parent->{lang}->{ModelTooltipTagging});
+
+ my $commonFieldsLabel = new GCHeaderLabel($parent->{lang}->{ModelOptionsFields});
+ $optionsTable->attach($commonFieldsLabel, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($titleFieldLabel, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{title}, 3, 4, 1, 2, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($coverFieldLabel, 2, 3, 2, 3, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{cover}, 3, 4, 2, 3, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($idFieldLabel, 2, 3, 3, 4, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{id}, 3, 4, 3, 4, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($playFieldLabel, 2, 3, 4, 5, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{common}->{play}, 3, 4, 4, 5, ['expand', 'fill'], 'fill', 0, 0);
+ my $collectionSettingsLabel = new GCHeaderLabel($parent->{lang}->{ModelCollectionSettings});
+ $optionsTable->attach($collectionSettingsLabel, 0, 4, 6, 7, 'fill', 'fill', 0, 0);
+ $optionsTable->attach($self->{hasLending}, 2, 4, 7, 8, ['expand', 'fill'], 'fill', 0, 0);
+ $optionsTable->attach($self->{hasTags}, 2, 4, 8, 9, ['expand', 'fill'], 'fill', 0, 0);
+
+ $vboxOptions->pack_start($optionsTable, 1, 1, 0);
+
+ $self->{notebook}->signal_connect('switch-page' => sub {
+ my ($widget, $pointer, $number) = @_;
+ $self->saveCurrent;
+ $self->saveCurrentFilter;
+ $self->initCommonFields if $number == 1;
+ });
+
+
+ $self->{filtersList} = new Gtk2::SimpleList('' => "text");
+ $self->{filtersList}->set_model($self->{fieldsList}->get_model);
+ $self->{filtersList}->signal_connect (cursor_changed => sub {
+ my ($sl, $path, $column) = @_;
+ my @idx = $sl->get_selected_indices;
+ $self->saveCurrentFilter;
+ $self->displayFilter($idx[0]);
+ });
+
+ $self->{filtersList}->set_headers_visible(0);
+ $self->{scrollPanelFilters} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelFilters}->set_policy ('automatic', 'automatic');
+ $self->{scrollPanelFilters}->set_shadow_type('etched-in');
+ $self->{scrollPanelFilters}->add($self->{filtersList});
+
+ $self->{filter}->{activated} = GCCheckBox->new($parent->{lang}->{ModelFilterActivated});
+ $self->{filter}->{activated}->signal_connect('toggled' => sub {
+ $self->checkFilterActivated;
+ });
+ $self->{comparisonLabel} = GCLabel->new($parent->{lang}->{ModelFilterComparison});
+ $self->{filter}->{comparison} = new GCComparisonSelector($parent);
+ $self->{filter}->{numeric} = GCCheckBox->new($parent->{lang}->{ModelFilterNumeric});
+ $self->{tooltips}->set_tip($self->{filter}->{numeric},
+ $parent->{lang}->{ModelTooltipNumeric});
+ $self->{filter}->{quick} = GCCheckBox->new($parent->{lang}->{ModelFilterQuick});
+ $self->{tooltips}->set_tip($self->{filter}->{quick},
+ $parent->{lang}->{ModelTooltipQuick});
+
+ $self->{filtersOptionsTable} = new Gtk2::Table(4, 4);
+ $self->{filtersOptionsTable}->set_row_spacings($GCUtils::halfMargin);
+ $self->{filtersOptionsTable}->set_col_spacings($GCUtils::margin);
+ $self->{filtersOptionsTable}->set_border_width($GCUtils::margin);
+
+ $self->{filtersOptionsTable}->attach($self->{filter}->{activated}, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{comparisonLabel}, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{filter}->{comparison}, 3, 4, 1, 2, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{filter}->{numeric}, 2, 4, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{filtersOptionsTable}->attach($self->{filter}->{quick}, 2, 4, 3, 4, 'fill', 'fill', 0, 0);
+
+ my $hboxFilters = new Gtk2::HBox(0,0);
+ $hboxFilters->set_border_width($GCUtils::margin);
+ $hboxFilters->pack_start($self->{scrollPanelFilters}, 0, 0, 0);
+ $hboxFilters->pack_start($self->{filtersOptionsTable}, 1, 1, $GCUtils::halfMargin);
+ $vboxFilters->pack_start($hboxFilters,1,1,0);
+
+ $self->{notebook}->append_page($vboxFields, $parent->{lang}->{ModelFields});
+ $self->{notebook}->append_page($vboxOptions, $parent->{lang}->{ModelOptions});
+ $self->{notebook}->append_page($vboxFilters, $parent->{lang}->{ModelFilters});
+
+ $self->vbox->pack_start($hboxCollectionName, 0, 0, $GCUtils::margin);
+ $self->vbox->pack_start($self->{notebook}, 1, 1, 0);
+ $self->vbox->show_all;
+
+ # Set dialog size to fit nicely onto screen
+ my $dialogWidth = $self->get_screen->get_width < 800 ? $self->get_screen->get_width - 50 : 750;
+ my $dialogHeight = $self->get_screen->get_height < 650 ? $self->get_screen->get_height - 50 : 650;
+ $self->set_default_size($dialogWidth, $dialogHeight);
+
+ $self->setSensitive(0);
+
+ return $self;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCModels/GCTVepisodes.gcm b/lib/gcstar/GCModels/GCTVepisodes.gcm
new file mode 100644
index 0000000..4f57910
--- /dev/null
+++ b/lib/gcstar/GCModels/GCTVepisodes.gcm
@@ -0,0 +1,390 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision3.xsd"
+name="GCTVepisodes">
+
+ <lang>GCTVepisodes</lang>
+
+ <options>
+
+ <defaults>
+ <image>film_no.png</image>
+ <listImageWidth>173</listImageWidth>
+ <listImageHeight>110</listImageHeight>
+ <groupby>series</groupby>
+ <sortby>season</sortby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>title</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <play>videofile</play>
+ <search>
+ <field>name</field>
+ <field>series</field>
+ </search>
+ <results>
+ <field>series</field>
+ <field>season</field>
+ <field>episode</field>
+ <field>name</field>
+ <field>firstaired</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>film.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>12</paddingRight>
+ <paddingTop>0</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="ages">
+ <value displayed="">0</value>
+ <value displayed="AgeUnrated">1</value>
+ <value displayed="AgeAll">2</value>
+ <value displayed="AgeParent">5</value>
+ <value displayed="10">10</value>
+ <value displayed="11">11</value>
+ <value displayed="12">12</value>
+ <value displayed="13">13</value>
+ <value displayed="14">14</value>
+ <value displayed="15">15</value>
+ <value displayed="16">16</value>
+ <value displayed="17">17</value>
+ <value displayed="18">18</value>
+ <value displayed="19">19</value>
+ <value displayed="20">20</value>
+ <value displayed="21">21</value>
+ </values>
+ <values id="seen">
+ <value displayed="SeenNo">0</value>
+ <value displayed="SeenYes">1</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ <filter field="seen" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="title"
+ group="main"
+ init="%series% - S%season%E%episode%"
+ label="title"
+ type="formatted" />
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="main"
+ imported="true"/>
+ <field value="series"
+ type="history text"
+ label="Serie"
+ init="NewSeries"
+ group="main"
+ imported="true"/>
+ <field value="season"
+ type="number"
+ label="Season"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="episode"
+ type="number"
+ label="Episode"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="seen"
+ type="yesno"
+ label="Seen"
+ init="0"
+ notnull="true"
+ group="details"
+ imported="main"/>
+ <field value="firstaired"
+ type="short text"
+ label="FirstAired"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="time"
+ type="short text"
+ label="Time"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="country"
+ type="history text"
+ label="Country"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="director"
+ type="short text"
+ label="Director"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="writer"
+ type="short text"
+ label="Writer"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="music"
+ type="short text"
+ label="Music"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="age"
+ type="options"
+ label="MinimumAge"
+ init=""
+ values="ages"
+ separator="4"
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=",,,"
+ group="info"
+ imported="true"/>
+ <field value="actors"
+ type="double list"
+ label="Actors"
+ label1="Actor"
+ label2="Role"
+ init=""
+ group="info"
+ history="false"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="audio"
+ type="double list"
+ label="Audio"
+ label1="Audio"
+ label2="Encoding"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="subt"
+ type="single list"
+ label="Subtitles"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="videofile"
+ type="file"
+ format="video"
+ label="Trailer"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init="DVD"
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="Location"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ </fields>
+
+ <filters>
+ <group label="General">
+ <filter field="title" comparison="contain"/>
+ <filter field="original" comparison="contain"/>
+ <filter field="director" comparison="contain"/>
+ <filter field="actors" comparison="contain"/>
+ <filter field="series" comparison="contain" quick="true"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ <filter field="country" comparison="contain" quick="true"/>
+ <filter field="age" label="FilterAudienceAge" comparison="le" numeric="true" quick="true"/>
+ <filter field="firstaired" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Details">
+ <filter field="seen" comparison="eq" values="both" labeloff="FilterSeenNo" labelon="FilterSeenYes" quick="true"/>
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true" />
+ <item type="label" for="series" nomargin="true" />
+ <item type="value" for="series" expand="true" nomargin="true" />
+ <item type="label" for="season" nomargin="true" />
+ <item type="value" for="season" width="5" nomargin="true" />
+ <item type="label" for="episode" nomargin="true" />
+ <item type="value" for="episode" width="5" nomargin="true" />
+ </item>
+ <item type="line">
+ <item type="value" for="name" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="value" for="image" width="170" height="130"/>
+ <item type="table" rows="4" cols="4">
+ <item type="label" for="firstaired" row="0" col="0"/>
+ <item type="value" for="firstaired" row="0" col="1"/>
+ <item type="label" for="time" row="0" col="2"/>
+ <item type="value" for="time" row="0" col="3"/>
+ <item type="label" for="director" row="1" col="0"/>
+ <item type="value" for="director" row="1" col="1"/>
+ <item type="label" for="writer" row="1" col="2"/>
+ <item type="value" for="writer" row="1" col="3"/>
+ <item type="label" for="country" row="2" col="0"/>
+ <item type="value" for="country" row="2" col="1"/>
+ <item type="label" for="music" row="2" col="2"/>
+ <item type="value" for="music" row="2" col="3"/>
+ <item type="label" for="age" row="3" col="0"/>
+ <item type="value" for="age" row="3" col="1"/>
+ </item>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="4" cols="4">
+ <item type="value" for="seen" row="0" col="0" colspan="2"/>
+ <item type="label" for="rating" row="0" col="2"/>
+ <item type="value" for="rating" row="0" col="3"/>
+ <item type="label" for="format" row="1" col="0"/>
+ <item type="value" for="format" row="1" col="1"/>
+ <item type="label" for="added" row="1" col="2"/>
+ <item type="value" for="added" row="1" col="3"/>
+ <item type="label" for="location" row="2" col="0"/>
+ <item type="value" for="location" row="2" col="1"/>
+ <item type="label" for="videofile" row="3" col="0"/>
+ <item type="line" row="3" col="1" colspan="3" expand="horizontal">
+ <item type="value" for="videofile" expand="true" nomargin="true"/>
+ <item type="launcher" for="videofile" nomargin="true"/>
+ <item type="extractor" for="videofile" nomargin="true"/>
+ </item>
+ </item>
+ <item type="expander" title="Languages" collapsed="=audio[@Audio@@Separator@%audio%]=^ - ^=subt[@Subtitles@@Separator@%subt%]=">
+ <item type="line" expand="true">
+ <item type="value" for="audio" expand="true"/>
+ <item type="value" for="subt" expand="true"/>
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCTVseries.gcm b/lib/gcstar/GCModels/GCTVseries.gcm
new file mode 100644
index 0000000..e9d2272
--- /dev/null
+++ b/lib/gcstar/GCModels/GCTVseries.gcm
@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision3.xsd"
+name="GCTVseries">
+
+ <lang>GCTVseries</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <sortby>name</sortby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <play>videofile</play>
+ <search>
+ <field>series</field>
+ </search>
+ <results>
+ <field>series</field>
+ <field>title</field>
+ <field>season</field>
+ <field>firstaired</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="ages">
+ <value displayed="">0</value>
+ <value displayed="AgeUnrated">1</value>
+ <value displayed="AgeAll">2</value>
+ <value displayed="AgeParent">5</value>
+ <value displayed="10">10</value>
+ <value displayed="11">11</value>
+ <value displayed="12">12</value>
+ <value displayed="13">13</value>
+ <value displayed="14">14</value>
+ <value displayed="15">15</value>
+ <value displayed="16">16</value>
+ <value displayed="17">17</value>
+ <value displayed="18">18</value>
+ <value displayed="19">19</value>
+ <value displayed="20">20</value>
+ <value displayed="21">21</value>
+ </values>
+ <values id="seen">
+ <value displayed="SeenNo">0</value>
+ <value displayed="SeenYes">1</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ <group id="episodelist" label="Episodes"/>
+ </groups>
+
+ <random>
+ <filter field="seen" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="name"
+ group="main"
+ init="%series% - Season %season%"
+ label="Name"
+ type="formatted" />
+ <field value="series"
+ type="short text"
+ label="Series"
+ init="NewItem"
+ group="main"
+ imported="true"/>
+ <field value="season"
+ type="number"
+ label="Season"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="part"
+ type="number"
+ label="Part"
+ init="1"
+ min="0"
+ max="99999"
+ group="main"
+ imported="true"/>
+ <field value="title"
+ type="short text"
+ label="Title"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="specialep"
+ type="yesno"
+ label="Special"
+ init="0"
+ notnull="true"
+ group="main"
+ imported="true"/>
+ <field value="seen"
+ type="yesno"
+ label="Seen"
+ init="0"
+ notnull="true"
+ group="details"
+ imported="main"/>
+ <field value="firstaired"
+ type="short text"
+ label="FirstAired"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="time"
+ type="short text"
+ label="Time"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="country"
+ type="history text"
+ label="Country"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="director"
+ type="short text"
+ label="Director"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="producer"
+ type="short text"
+ label="Producer"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="music"
+ type="short text"
+ label="Music"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="age"
+ type="options"
+ label="MinimumAge"
+ init=""
+ values="ages"
+ separator="4"
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=",,,"
+ group="info"
+ imported="true"/>
+ <field value="actors"
+ type="double list"
+ label="Actors"
+ label1="Actor"
+ label2="Role"
+ init=""
+ group="info"
+ history="false"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="episodes"
+ type="double list"
+ label="Episodes"
+ label1="Episode"
+ label2="Name"
+ init=""
+ group="episodelist"
+ history="false"
+ imported="true"/>
+ <field value="audio"
+ type="double list"
+ label="Audio"
+ label1="Audio"
+ label2="Encoding"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="subt"
+ type="single list"
+ label="Subtitles"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="videofile"
+ type="file"
+ format="video"
+ label="Trailer"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init="DVD"
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ </fields>
+
+ <filters>
+ <group label="General">
+ <filter field="title" comparison="contain"/>
+ <filter field="original" comparison="contain"/>
+ <filter field="director" comparison="contain"/>
+ <filter field="actors" comparison="contain"/>
+ <filter field="series" comparison="contain" quick="true"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ <filter field="country" comparison="contain" quick="true"/>
+ <filter field="age" label="FilterAudienceAge" comparison="le" numeric="true" quick="true"/>
+ <filter field="firstaired" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Details">
+ <filter field="seen" comparison="eq" values="both" labeloff="FilterSeenNo" labelon="FilterSeenYes" quick="true"/>
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true"/>
+ <item type="value" for="series" expand="true" nomargin="true"/>
+ <item type="label" for="season" width="5" nomargin="true"/>
+ <item type="value" for="season" nomargin="true"/>
+ <item type="label" for="part" width="5" nomargin="true"/>
+ <item type="value" for="part" nomargin="true"/>
+ <item type="special" for="searchButton" nomargin="true"/>
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="value" for="image" width="130" height="170"/>
+ <item type="table" rows="5" cols="4">
+ <item type="label" for="title" row="0" col="0"/>
+ <item type="line" row="0" col="1" colspan="3" expand="horizontal">
+ <item type="value" for="title" expand="true" nomargin="true"/>
+ <item type="value" for="specialep" nomargin="true"/>
+ </item>
+ <item type="label" for="firstaired" row="1" col="0"/>
+ <item type="value" for="firstaired" row="1" col="1"/>
+ <item type="label" for="time" row="1" col="2"/>
+ <item type="value" for="time" row="1" col="3"/>
+ <item type="label" for="director" row="2" col="0"/>
+ <item type="value" for="director" row="2" col="1"/>
+ <item type="label" for="producer" row="2" col="2"/>
+ <item type="value" for="producer" row="2" col="3"/>
+ <item type="label" for="country" row="3" col="0"/>
+ <item type="value" for="country" row="3" col="1"/>
+ <item type="label" for="music" row="3" col="2"/>
+ <item type="value" for="music" row="3" col="3"/>
+ <item type="label" for="age" row="4" col="0"/>
+ <item type="value" for="age" row="4" col="1"/>
+ </item>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="4" cols="4">
+ <item type="value" for="seen" row="0" col="0" colspan="2"/>
+ <item type="label" for="rating" row="0" col="2"/>
+ <item type="value" for="rating" row="0" col="3"/>
+ <item type="label" for="format" row="1" col="0"/>
+ <item type="value" for="format" row="1" col="1"/>
+ <item type="label" for="ratingpress" row="1" col="2"/>
+ <item type="value" for="ratingpress" row="1" col="3"/>
+ <item type="label" for="location" row="2" col="0"/>
+ <item type="value" for="location" row="2" col="1"/>
+ <item type="label" for="added" row="2" col="2"/>
+ <item type="value" for="added" row="2" col="3"/>
+ <item type="label" for="videofile" row="3" col="0"/>
+ <item type="line" row="3" col="1" colspan="3" expand="horizontal">
+ <item type="value" for="videofile" expand="true" nomargin="true"/>
+ <item type="launcher" for="videofile" nomargin="true"/>
+ <item type="extractor" for="videofile" nomargin="true"/>
+ </item>
+ </item>
+ <item type="expander" title="Languages" collapsed="[@Audio@@Separator@%audio%] - [@Subtitles@@Separator@%subt%]">
+ <item type="line" expand="true">
+ <item type="value" for="audio" expand="true"/>
+ <item type="value" for="subt" expand="true"/>
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="episodestab" title="Episodes">
+ <item type="box" expand="true">
+ <item type="value" for="episodes" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCboardgames.gcm b/lib/gcstar/GCModels/GCboardgames.gcm
new file mode 100644
index 0000000..3c2af83
--- /dev/null
+++ b/lib/gcstar/GCModels/GCboardgames.gcm
@@ -0,0 +1,478 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCboardgames">
+ <lang>GCboardgames</lang>
+
+ <options>
+
+ <defaults>
+ <image>bg_no.png</image>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>boxpic</cover>
+ <url>web</url>
+ <search>
+ <field>name</field>
+ </search>
+ <results>
+ <field>name</field>
+ <field>released</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>13</paddingLeft>
+ <paddingRight>13</paddingRight>
+ <paddingTop>13</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="condition">
+ <value displayed="Perfect">4</value>
+ <value displayed="Good">3</value>
+ <value displayed="Average">2</value>
+ <value displayed="Poor">1</value>
+ </values>
+ <values id="completecontents">
+ <value displayed="CompleteNo">0</value>
+ <value displayed="CompleteYes">1</value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ <group id="personal" label="Personal"/>
+ </groups>
+
+ <random>
+ <filter />
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="info"
+ imported="false"/>
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="info"
+ imported="true"/>
+ <field value="original"
+ type="short text"
+ label="Original"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="boxpic"
+ type="image"
+ label="Box"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="boxpic"
+ imported="true"/>
+ <field value="designedby"
+ type="history text"
+ label="DesignedBy"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="illustratedby"
+ type="history text"
+ label="IllustratedBy"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="publishedby"
+ type="history text"
+ label="PublishedBy"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="players"
+ type="short text"
+ label="Players"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="playingtime"
+ type="short text"
+ label="PlayingTime"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="suggestedage"
+ type="short text"
+ label="SuggestedAge"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="released"
+ type="date"
+ label="Released"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="description"
+ type="long text"
+ label="Description"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="category"
+ type="single list"
+ label="Category"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="mechanics"
+ type="single list"
+ label="Mechanics"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="expandedby"
+ type="single list"
+ label="ExpandedBy"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="expansionfor"
+ type="short text"
+ label="ExpansionFor"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="gamefamily"
+ type="short text"
+ label="GameFamily"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="web"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="personal"
+ imported="false"/>
+ <field value="timesplayed"
+ type="number"
+ label="TimesPlayed"
+ init=""
+ min="0"
+ max="99999"
+ step="1"
+ group="personal"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="personal"
+ imported="false"/>
+ <field value="copies"
+ type="number"
+ label="Copies"
+ init="1"
+ min="0"
+ max="99999"
+ step="1"
+ group="personal"
+ imported="false"/>
+ <field value="completecontents"
+ type="yesno"
+ label="CompleteContents"
+ init="1"
+ notnull="true"
+ group="personal"
+ imported="false"/>
+ <field value="condition"
+ type="options"
+ label="Condition"
+ values="condition"
+ init="3"
+ group="personal"
+ imported="false"/>
+ <field value="photo1"
+ type="image"
+ label="Photo1"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="photo2"
+ type="image"
+ label="Photo2"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="photo3"
+ type="image"
+ label="Photo3"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="photo4"
+ type="image"
+ label="Photo4"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="comments"
+ type="long text"
+ label="Comments"
+ init=""
+ group="personal"
+ imported="false"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="name" comparison="contain"/>
+ <filter field="publishedby" comparison="contain" quick="true" numeric="false"/>
+ <filter field="designedby" comparison="contain" quick="true" numeric="false"/>
+ <filter field="category" comparison="contain" quick="true"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ </filters>
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="name" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="label" for="original"/>
+ <item type="value" for="original" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ <item type="table" title="Information" rows="6" cols="2">
+ <item type="label" for="players" row="0" col="0"/>
+ <item type="value" for="players" row="0" col="1"/>
+ <item type="label" for="playingtime" row="1" col="0"/>
+ <item type="value" for="playingtime" row="1" col="1"/>
+ <item type="label" for="suggestedage" row="2" col="0"/>
+ <item type="value" for="suggestedage" row="2" col="1"/>
+ <item type="label" for="expansionfor" row="3" col="0"/>
+ <item type="value" for="expansionfor" row="3" col="1"/>
+ <item type="label" for="gamefamily" row="4" col="0"/>
+ <item type="value" for="gamefamily" row="4" col="1"/>
+ <item type="label" for="released" row="5" col="0"/>
+ <item type="value" for="released" row="5" col="1"/>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="box" expand="true">
+ <item type="table" rows="3" cols="4">
+ <item type="label" for="designedby" row="0" col="0"/>
+ <item type="value" for="designedby" row="0" col="1" expand="default"/>
+ <item type="label" for="publishedby" row="0" col="2"/>
+ <item type="value" for="publishedby" row="0" col="3" expand="default"/>
+ <item type="label" for="illustratedby" row="2" col="0"/>
+ <item type="value" for="illustratedby" row="2" col="1" expand="default"/>
+ </item>
+ <item type="expander" title="Category" collapsed="%category%">
+ <item type="value" for="category"/>
+ </item>
+ <item type="expander" title="Mechanics" collapsed="%mechanics%">
+ <item type="value" for="mechanics"/>
+ </item>
+ <item type="expander" title="ExpandedBy" collapsed="%expandedby%" expanded="true">
+ <item type="value" for="expandedby" />
+ </item>
+ <item type="table" rows="3" cols="2" expand="true">
+ <item type="label" label="Photos" row="0" col="0" colspan="2"/>
+ <item type="value" for="photo1" row="1" col="0" expand="true" height="150"/>
+ <item type="value" for="photo2" row="1" col="1" expand="true" height="150"/>
+ <item type="value" for="photo3" row="2" col="0" expand="true" height="150"/>
+ <item type="value" for="photo4" row="2" col="1" expand="true" height="150"/>
+ </item>
+ </item>
+
+ </item>
+ <item type="tab" value="personal" title="Personal">
+ <item type="table" rows="4" cols="4">
+ <item type="label" for="rating" row="0" col="0"/>
+ <item type="value" for="rating" row="0" col="1"/>
+ <item type="label" for="timesplayed" row="0" col="2"/>
+ <item type="value" for="timesplayed" row="0" col="3"/>
+ <item type="label" for="added" row="1" col="0"/>
+ <item type="value" for="added" row="1" col="1"/>
+ <item type="label" for="copies" row="1" col="2"/>
+ <item type="value" for="copies" row="1" col="3"/>
+ <item type="label" for="condition" row="2" col="0"/>
+ <item type="value" for="condition" row="2" col="1"/>
+ <item type="value" for="completecontents" row="2" col="2" colspan="2"/>
+ </item>
+ <item type="table" rows="2" cols="2" expand="true">
+ <item type="label" for="comments" row="0" col="0" colspan="2"/>
+ <item type="value" for="comments" row="1" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="web" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="2">
+ <item type="value" for="name" style="header" row="0" col="0" colspan="2" expand="true"/>
+ <item type="value" for="original" style="subheader" row="1" col="0" colspan="2" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="box">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ </item>
+ <item type="box" width="6"/>
+ <item type="table" title="Information" rows="6" cols="5" expand="true">\
+ <item type="label" for="players" row="0" col="0"/>
+ <item type="value" for="players" row="0" col="1" expand="true"/>
+ <item type="label" for="playingtime" row="1" col="0"/>
+ <item type="value" for="playingtime" row="1" col="1" expand="true"/>
+ <item type="label" for="suggestedage" row="2" col="0"/>
+ <item type="value" for="suggestedage" row="2" col="1" expand="true"/>
+ <item type="label" for="expansionfor" row="3" col="0"/>
+ <item type="value" for="expansionfor" row="3" col="1" expand="true"/>
+ <item type="label" for="gamefamily" row="4" col="0"/>
+ <item type="value" for="gamefamily" row="4" col="1" expand="true"/>
+ <item type="label" for="released" row="5" col="0"/>
+ <item type="value" for="released" row="5" col="1" expand="true"/>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ <item type="expander" title="Details">
+ <item type="table" rows="5" cols="4" expand="true">
+ <item type="label" for="designedby" row="0" col="0"/>
+ <item type="value" for="designedby" row="0" col="1" expand="true"/>
+ <item type="label" for="publishedby" row="0" col="2"/>
+ <item type="value" for="publishedby" row="0" col="3" expand="true"/>
+ <item type="label" for="illustratedby" row="1" col="0"/>
+ <item type="value" for="illustratedby" row="1" col="1" colspan="3"/>
+ <item type="label" for="category" row="2" col="0" />
+ <item type="value" for="category" row="2" col="1" flat="true" expand="true" colspan="3" />
+ <item type="label" for="mechanics" row="3" col="0" />
+ <item type="value" for="mechanics" row="3" col="1" flat="true" expand="true" colspan="3" />
+ <item type="value" for="expandedby" row="4" col="0" colspan="4"/>
+ </item>
+ </item>
+ <item type="expander" title="Personal">
+ <item type="table" rows="3" cols="4" expand="true">
+ <item type="label" for="rating" row="0" col="0"/>
+ <item type="value" for="rating" row="0" col="1" expand="true"/>
+ <item type="label" for="timesplayed" row="0" col="2"/>
+ <item type="value" for="timesplayed" row="0" col="3" expand="true"/>
+ <item type="label" for="added" row="1" col="0"/>
+ <item type="value" for="added" row="1" col="1" expand="true"/>
+ <item type="label" for="copies" row="1" col="2"/>
+ <item type="value" for="copies" row="1" col="3" expand="true"/>
+ <item type="label" for="condition" row="2" col="0"/>
+ <item type="value" for="condition" row="2" col="1" expand="true"/>
+ <item type="value" for="completecontents" row="2" col="2" colspan="2" expand="true" nomargin="true" values="completecontents"/>
+ </item>
+ <item type="table" rows="2" cols="2" expand="true">
+ <item type="label" for="comments" row="0" col="0" colspan="2"/>
+ <item type="value" for="comments" row="1" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ <item type="expander" title="Photos">
+ <item type="table" rows="3" cols="2" expand="true">
+ <item type="label" label="Photos" row="0" col="0" colspan="2"/>
+ <item type="value" for="photo1" row="1" col="0" expand="true" height="150"/>
+ <item type="value" for="photo2" row="1" col="1" expand="true" height="150"/>
+ <item type="value" for="photo3" row="2" col="0" expand="true" height="150"/>
+ <item type="value" for="photo4" row="2" col="1" expand="true" height="150"/>
+ </item>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCbooks.gcm b/lib/gcstar/GCModels/GCbooks.gcm
new file mode 100644
index 0000000..1494982
--- /dev/null
+++ b/lib/gcstar/GCModels/GCbooks.gcm
@@ -0,0 +1,278 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCbooks">
+ <lang>GCbooks</lang>
+
+ <options>
+ <defaults>
+ <image>book_no.png</image>
+ </defaults>
+ <fields>
+ <id>id</id>
+ <title>title</title>
+ <cover>cover</cover>
+ <url>web</url>
+ <play>digitalfile</play>
+ <search>
+ <field>isbn</field>
+ <field>title</field>
+ <field>authors</field>
+ </search>
+ <results>
+ <field>title</field>
+ <field>authors</field>
+ <field>publication</field>
+ <field>format</field>
+ <field>edition</field>
+ <field>serie</field>
+ </results>
+ <summary>
+ <field>authors</field>
+ <field>publication</field>
+ <field>genre</field>
+ <field>format</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="read">
+ <value displayed="ReadNo">0</value>
+ <value displayed="ReadYes">1</value>
+ </values>
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>11</paddingRight>
+ <paddingTop>12</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+ </options>
+
+ <groups>
+ <group id="Main" label="General" />
+ <group id="Details" label="Details" />
+ </groups>
+
+ <random>
+ <filter field="read" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id" group="Main" init="" label="" type="number" imported="false"/>
+ <field value="isbn" group="Main" init="" label="Isbn" format="0-9X\-" type="checked text" imported="true"/>
+ <field value="title" group="Main" init="NewItem" label="Title" type="short text" imported="true" />
+ <field value="cover" group="Main" init="" label="Cover" type="image" default="view" imported="true" />
+ <field value="backpic" type="image" label="ContextImgBack" init="" group="Main" linkedto="cover" imported="true"/>
+ <field value="authors" group="Main" history="true" init="" label="Authors" type="single list" imported="true" />
+ <field value="publisher" group="Main" init="" label="Publisher" type="history text" imported="true" />
+ <field value="publication" group="Main" init="" label="Publication" type="date" imported="true" />
+ <field value="language" group="Main" init="" label="Language" type="history text" imported="true" />
+ <field value="serie" group="Main" init="" label="Serie" type="history text" imported="true" />
+ <field value="rank" group="Main" init="1" label="Rank" type="number" min="0" max="999" imported="true" />
+ <field value="edition" group="Details" init="" label="Edition" type="short text" imported="true" />
+ <field value="format" group="Details" init="" label="Format" type="history text" imported="true" />
+ <field value="genre" group="Main" history="true" init="" label="Genre" type="single list" imported="true" />
+ <field value="description" group="Main" init="" label="Bookdescription" type="long text" imported="true" />
+ <field value="pages" group="Main" init="" label="Pages" type="number" imported="true" />
+ <field value="web" group="Main" init="" label="Url" type="button" format="url" imported="true" />
+ <field value="read" group="Details" init="0" label="Read" type="yesno" />
+ <field value="added" group="Details" init="current" label="PanelAdded" type="date" />
+ <field value="rating" group="Details" init="0" label="PanelRating" min="0" max="10" type="number" displayas="graphical" />
+ <field value="acquisition" group="Details" init="" label="Acquisition" type="date" />
+ <field value="location" group="Details" init="" label="PanelLocation" type="history text" />
+ <field value="comments" group="Details" init="" label="Comments" type="long text" />
+ <field value="translator" group="Details" init="" label="Translator" type="short text" imported="true" />
+ <field value="artist" group="Details" init="" label="Artist" type="short text" />
+ <field value="digitalfile" group="Details" init="" label="DigitalFile" type="file" format="ebook" />
+ </fields>
+
+ <filters>
+ <group label="Main">
+ <filter comparison="contain" field="isbn" numeric="false" quick="false" />
+ <filter comparison="contain" field="title" numeric="false" quick="false" />
+ <filter comparison="contain" field="authors" numeric="false" quick="true" />
+ <filter comparison="contain" field="publisher" numeric="false" quick="true" />
+ <filter comparison="contain" field="language" numeric="false" quick="true" />
+ <filter comparison="contain" field="genre" numeric="false" quick="true" />
+ <filter comparison="ge" field="rating" labelselect="&gt;=" numeric="true" quick="false" />
+ </group>
+ <group label="Details">
+ <filter comparison="eq" field="read" numeric="false" quick="true" />
+ <filter comparison="ge" field="acquisition" labelselect="&gt;=" numeric="false" quick="false" />
+ </group>
+ </filters>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item for="isbn" type="value" width="13" nomargin="true" />
+ <item expand="true" for="title" type="value" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="General" type="tab" value="main">
+ <item type="line">
+ <item for="cover" height="170" width="130" type="value"/>
+ <item cols="4" rows="5" type="table" expand="true">
+ <item col="0" for="publication" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="publication" row="0" type="value" />
+ <item col="0" for="publisher" row="1" type="label" />
+ <item col="1" colspan="3" expand="true" for="publisher" row="1" type="value" />
+ <item col="0" for="serie" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" for="serie" row="2" type="value" width="5" />
+ <item col="2" for="rank" row="2" type="label" />
+ <item col="3" colspan="1" expand="true" for="rank" row="2" type="value" />
+ <item col="0" for="language" row="3" type="label" />
+ <item col="1" colspan="3" expand="true" for="language" row="3" type="value" />
+ <item col="0" for="pages" row="4" type="label" />
+ <item col="1" colspan="3" expand="true" for="pages" row="4" type="value" />
+ </item>
+ <item type="line" width="0"/>
+ </item>
+ <item type="expander" title="Authors" collapsed="%authors%" row="0" col="0" colspan="4">
+ <item type="value" for="authors"/>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%" row="1" col="0" colspan="4">
+ <item type="value" for="genre"/>
+ </item>
+ <item cols="4" rows="3" type="table" expand="true">
+ <item col="0" for="description" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="description" row="0" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item cols="6" expand="true" rows="8" type="table">
+ <item col="0" row="0" colspan="4" for="read" type="value" />
+ <item col="0" row="1" for="added" type="label" />
+ <item col="1" row="1" colspan="3" for="added" type="value" />
+ <item col="0" row="2" for="translator" type="label" />
+ <item col="1" row="2" for="translator" type="value" />
+ <item col="2" row="2" for="artist" type="label" />
+ <item col="3" row="2" for="artist" type="value" />
+ <item col="0" row="3" for="rating" type="label" />
+ <item col="1" row="3" for="rating" type="value" />
+ <item col="2" row="3" for="location" type="label" />
+ <item col="3" row="3" for="location" width="13" type="value" />
+ <item col="0" row="4" for="edition" type="label" />
+ <item col="1" row="4" for="edition" type="value" />
+ <item col="2" row="4" for="format" type="label" />
+ <item col="3" row="4" for="format" width="13" type="value" />
+ <item col="0" row="5" for="acquisition" type="label" />
+ <item col="1" row="5" for="acquisition" type="value" />
+ <item col="0" row="6" type="label" for="digitalfile" nomargin="true"/>
+ <item col="1" row="6" type="line" colspan="3">
+ <item type="value" for="digitalfile" expand="true" nomargin="true"/>
+ <item type="launcher" for="digitalfile" nomargin="true"/>
+ </item>
+ <item col="0" row="7" for="comments" type="label" />
+ <item col="1" row="7" colspan="3" expand="true" for="comments" type="value" />
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item expand="true" for="web" type="value" />
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="title" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="100" expand="false" style="page"/>
+ <item type="value" for="authors" flat="true" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="100" expand="false" style="box">
+ <item type="value" for="isbn" style="box" nomargin="true"/>
+ <item type="value" for="read" style="box" nomargin="true" values="read"/>
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="cover" width="140"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="6" cols="2" expand="true">
+ <item type="label" for="publication" row="0" col="0"/>
+ <item type="value" for="publication" row="0" col="1" expand="true"/>
+ <item type="label" for="publisher" row="1" col="0"/>
+ <item type="value" for="publisher" row="1" col="1" expand="true"/>
+ <item type="label" for="serie" row="2" col="0"/>
+ <item type="value" for="serie" row="2" col="1" expand="true"/>
+ <item type="label" for="language" row="3" col="0"/>
+ <item type="value" for="language" row="3" col="1" expand="true"/>
+ <item type="label" for="pages" row="4" col="0"/>
+ <item type="value" for="pages" row="4" col="1" expand="true"/>
+ <item type="label" for="genre" row="5" col="0"/>
+ <item type="value" for="genre" flat="true" row="5" col="1" expand="true"/>
+ </item>
+ </item>
+ </item>
+ <item type="value" for="description" height="5em"/>
+ <item type="expander" title="Details">
+ <item cols="2" expand="true" rows="7" type="table">
+ <item col="0" for="edition" row="0" type="label" />
+ <item col="1" for="edition" row="0" type="value" />
+ <item col="0" for="format" row="1" type="label" />
+ <item col="1" for="format" row="1" type="value" />
+ <item col="0" for="location" row="2" type="label" />
+ <item col="1" for="location" row="2" type="value" />
+ <item col="0" for="acquisition" row="3" type="label" />
+ <item col="1" for="acquisition" row="3" type="value" />
+ <item col="0" for="translator" row="4" type="label" />
+ <item col="1" for="translator" row="4" type="value" />
+ <item col="0" for="artist" row="5" type="label" />
+ <item col="1" for="artist" row="5" type="value" />
+ <item col="0" for="comments" row="6" type="label" />
+ <item col="1" expand="true" height="5em" for="comments" row="6" type="value" />
+ </item>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+
+</panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCcoins.gcm b/lib/gcstar/GCModels/GCcoins.gcm
new file mode 100644
index 0000000..9e37272
--- /dev/null
+++ b/lib/gcstar/GCModels/GCcoins.gcm
@@ -0,0 +1,275 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCcoins">
+
+ <lang>GCcoins</lang>
+
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+ <fields>
+ <cover>picture</cover>
+ <id>gcsautoid</id>
+ <play/>
+ <title>name</title>
+ </fields>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="types">
+ <value displayed="Coin">coin</value>
+ <value displayed="Banknote">banknote</value>
+ </values>
+ <values id="grades">
+ <value displayed="Grade1">1</value>
+ <value displayed="Grade2">2</value>
+ <value displayed="Grade3">3</value>
+ <value displayed="Grade4">4</value>
+ <value displayed="Grade6">6</value>
+ <value displayed="Grade8">8</value>
+ <value displayed="Grade10">10</value>
+ <value displayed="Grade12">12</value>
+ <value displayed="Grade15">15</value>
+ <value displayed="Grade20">20</value>
+ <value displayed="Grade25">25</value>
+ <value displayed="Grade30">30</value>
+ <value displayed="Grade35">35</value>
+ <value displayed="Grade40">40</value>
+ <value displayed="Grade45">45</value>
+ <value displayed="Grade50">50</value>
+ <value displayed="Grade53">53</value>
+ <value displayed="Grade55">55</value>
+ <value displayed="Grade58">58</value>
+ <value displayed="Grade60">60</value>
+ <value displayed="Grade61">61</value>
+ <value displayed="Grade62">62</value>
+ <value displayed="Grade63">63</value>
+ <value displayed="Grade64">64</value>
+ <value displayed="Grade65">65</value>
+ <value displayed="Grade66">66</value>
+ <value displayed="Grade67">67</value>
+ <value displayed="Grade68">68</value>
+ <value displayed="Grade69">69</value>
+ <value displayed="Grade70">70</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="Main" label="Main" />
+ <group id="Description" label="Description" />
+ <group id="Other" label="Other" />
+ <group id="Pictures" label="Pictures" />
+ </groups>
+
+ <filters>
+ <group label="Main">
+ <filter comparison="range" field="year" labelselect="Intervalle" numeric="true" quick="true" />
+ <filter comparison="contain" field="picture" numeric="true" quick="false" />
+ </group>
+ <group label="Description">
+ <filter comparison="contain" field="diameter" labelselect="Contient" numeric="true" quick="false" />
+ </group>
+ </filters>
+
+ <random></random>
+
+ <fields lending="false" tags="true">
+ <field value="gcsautoid" displayed="" group="" imported="false" init="" label="" type="number" />
+ <field value="name" group="Main" init="%currency% %value% (%year%)" label="Name" type="formatted" />
+ <field value="picture" default="view" group="Main" init="" label="Picture" type="image" />
+ <field value="currency" flat="true" group="Main" history="true" init="" label="Currency" type="history text" />
+ <field value="country" group="Main" label="Country" type="history text" init="" />
+ <field value="value" group="Main" init="" label="Value" type="number" />
+ <field value="year" group="Main" init="" label="Year" type="number" />
+ <field value="added" group="Main" init="current" label="PanelAdded" type="date" />
+ <field values="grades" group="Main" init="" label="Condition" type="options" value="condition" />
+ <field value="comments" group="Main" init="" label="Comments" type="long text" />
+ <field value="diameter" group="Description" init="" label="Diameter" type="number" />
+ <field value="metal" flat="true" group="Description" history="true" init="" label="Metal" type="single list" />
+ <field value="edge" group="Description" init="" label="Edge" type="long text" />
+ <field value="head" group="Description" init="" label="Head" type="long text" />
+ <field value="tail" group="Description" init="" label="Tail" type="long text" />
+ <field value="location" group="Description" init="current" label="Location" type="history text" />
+ <field value="history" group="Other" init="" label="History" type="long text" />
+ <field value="website" group="Other" init="" label="Website" type="url" />
+ <field value="estimate" group="Other" init="" label="Estimate" type="number" />
+ <field value="references" group="Other" init="" label="References" type="long text" />
+ <field value="front" default="view" group="Pictures" init="" label="Head" type="image" />
+ <field value="back" default="view" group="Pictures" init="" label="Tail" type="image" />
+ <field value="edge1" default="view" group="Pictures" init="" label="Edge1" type="image" />
+ <field value="edge2" default="view" group="Pictures" init="" label="Edge2" type="image" />
+ <field value="edge3" default="view" group="Pictures" init="" label="Edge3" type="image" />
+ <field value="edge4" default="view" group="Pictures" init="" label="Edge4" type="image" />
+ <field value="type" group="Main" init="" label="Type" type="options" values="types" />
+ </fields>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line">
+ <item for="picture" height="150" type="value" width="150" />
+ <item cols="2" rows="5" type="table">
+ <item row="0" col="0" for="currency" type="label" />
+ <item row="0" col="1" for="currency" expand="true" type="value" />
+ <item row="1" col="0" for="value" type="label" />
+ <item row="1" col="1" for="value" expand="true" type="value" />
+ <item row="2" col="0" for="year" type="label" />
+ <item row="2" col="1" for="year" expand="true" type="value" />
+ <item row="3" col="0" for="country" type="label" />
+ <item row="3" col="1" for="country" expand="true" type="value" />
+ <item row="4" col="0" for="type" type="label" />
+ <item row="4" col="1" for="type" expand="true" type="value" />
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="2" cols="2">
+ <item row="0" col="0" for="added" type="label" />
+ <item row="0" col="1" expand="default" for="added" type="value" />
+ <item row="1" col="0" for="condition" type="label" />
+ <item row="1" col="1" for="condition" type="value" />
+ </item>
+ <item for="comments" type="label" />
+ <item for="comments" expand="true" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Description" type="tab" value="bla">
+ <item cols="4" expand="true" rows="5" type="table">
+ <item row="0" col="0" for="diameter" type="label" />
+ <item row="0" col="1" expand="default" for="diameter" type="value" />
+ <item row="1" col="0" collapsed="%metal%" colspan="3" title="Metal" type="expander">
+ <item for="metal" type="value" />
+ </item>
+ <item row="2" col="0" for="edge" type="label" />
+ <item row="2" col="1" colspan="3" expand="true" for="edge" type="value" />
+ <item row="3" col="0" for="head" type="label" />
+ <item row="3" col="1" colspan="3" expand="true" for="head" type="value" />
+ <item row="4" col="0" for="tail" type="label" />
+ <item row="4" col="1" colspan="3" expand="true" for="tail" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Other" type="tab" value="bla">
+ <item cols="4" expand="true" rows="5" type="table">
+ <item col="0" row="0" for="location" type="label" />
+ <item col="1" row="0" for="location" type="value" />
+ <item col="0" row="1" for="estimate" type="label" />
+ <item col="1" row="1" expand="default" for="estimate" type="value" />
+ <item col="0" row="2" for="website" type="label" />
+ <item col="1" row="2" expand="default" for="website" type="value" />
+ <item col="0" row="3" for="history" type="label" />
+ <item col="1" row="3" colspan="3" expand="true" for="history" type="value" />
+ <item col="0" row="4" for="references" type="label" />
+ <item col="1" row="4" colspan="3" expand="true" for="references" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Pictures" type="tab" value="bla">
+ <item type="box" expand="true">
+ <item cols="2" rows="5" expand="true" type="table">
+ <item row="0" col="0" expand="true" type="label" label="Front" align="center" />
+ <item row="0" col="1" expand="true" type="label" label="Back" align="center" />
+ <item row="1" col="0" expand="true" for="front" type="value" height="150" />
+ <item row="1" col="1" expand="true" for="back" type="value" height="150" />
+ <item row="2" col="0" expand="true" colspan="2" type="label" label="Edge" align="center" />
+ <item row="3" col="0" expand="true" for="edge1" type="value" height="150" />
+ <item row="3" col="1" expand="true" for="edge2" type="value" height="150" />
+ <item row="4" col="0" expand="true" for="edge3" type="value" height="150" />
+ <item row="4" col="1" expand="true" for="edge4" type="value" height="150" />
+ </item>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item style="page" type="box" width="150">
+ <item for="picture" type="value" width="140" />
+ </item>
+ <item expand="true" type="box">
+ <item type="table" cols="2" rows="4" expand="true">
+ <item col="0" row="0" for="currency" type="label" />
+ <item col="1" row="0" for="currency" type="value" expand="true" />
+ <item col="0" row="1" for="value" type="label" />
+ <item col="1" row="1" for="value" type="value" expand="true" />
+ <item col="0" row="2" for="year" type="label" />
+ <item col="1" row="2" for="year" type="value" expand="true" />
+ <item col="0" row="3" for="country" type="label" />
+ <item col="1" row="3" for="country" type="value" expand="true" />
+ </item>
+ </item>
+ </item>
+ <item type="box">
+ <item type="table" cols="2" rows="4" expand="true">
+ <item col="0" row="0" for="added" type="label" />
+ <item col="1" row="0" for="added" type="value" />
+ <item col="0" row="1" for="condition" type="label" />
+ <item col="1" row="1" for="condition" type="value" />
+ <item col="0" row="2" for="type" type="label" />
+ <item col="1" row="2" for="type" type="value" />
+ <item col="0" row="3" for="comments" type="label" />
+ <item col="1" row="3" for="comments" type="value" expand="horizontal" height="5em" />
+ </item>
+ <item type="expander" title="Description">
+ <item type="table" cols="2" rows="5" expand="true">
+ <item col="0" row="0" for="diameter" type="label" />
+ <item col="1" row="0" for="diameter" type="value" />
+ <item col="0" row="1" for="metal" type="label" />
+ <item col="1" row="1" for="metal" type="value" flat="true" />
+ <item col="0" row="2" for="edge" type="label" />
+ <item col="1" row="2" for="edge" type="value" expand="true" />
+ <item col="0" row="3" for="head" type="label" />
+ <item col="1" row="3" for="head" type="value" expand="true" />
+ <item col="0" row="4" for="tail" type="label" />
+ <item col="1" row="4" for="tail" type="value" expand="true" />
+ </item>
+ </item>
+ <item type="expander" title="Other">
+ <item type="table" cols="2" rows="5" expand="true">
+ <item col="0" row="0" for="location" type="label" />
+ <item col="1" row="0" for="location" type="value" expand="true" />
+ <item col="0" row="1" for="estimate" type="label" />
+ <item col="1" row="1" for="estimate" type="value" expand="true" />
+ <item col="0" row="2" for="website" type="label" />
+ <item col="1" row="2" for="website" type="value" expand="true" />
+ <item col="0" row="3" for="history" type="label" />
+ <item col="1" row="3" for="history" type="value" expand="true" />
+ <item col="0" row="4" for="references" type="label" />
+ <item col="1" row="4" for="references" type="value" expand="true" />
+ </item>
+ </item>
+ <item type="expander" title="Pictures">
+ <item type="table" cols="2" rows="5" expand="true">
+ <item row="0" col="0" type="label" label="Front" align="center" expand="true" />
+ <item row="0" col="1" type="label" label="Back" align="center" expand="true" />
+ <item row="1" col="0" for="front" type="value" expand="true" />
+ <item row="1" col="1" for="back" type="value" expand="true" />
+ <item row="2" col="0" colspan="2" type="label" label="Edge" align="center" expand="true" />
+ <item row="3" col="0" for="edge1" type="value" expand="true" />
+ <item row="3" col="1" for="edge2" type="value" expand="true" />
+ <item row="4" col="0" for="edge3" type="value" expand="true" />
+ <item row="4" col="1" for="edge4" type="value" expand="true" />
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCcomics.gcm b/lib/gcstar/GCModels/GCcomics.gcm
new file mode 100644
index 0000000..528a9f7
--- /dev/null
+++ b/lib/gcstar/GCModels/GCcomics.gcm
@@ -0,0 +1,353 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCcomics">
+ <lang>GCcomics</lang>
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <search>
+ <field>series</field>
+ <field>writer</field>
+ </search>
+ <results>
+ <field>series</field>
+ <field>volume</field>
+ <field>title</field>
+ <field>type</field>
+ <field>format</field>
+ <field>publishdate</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>11</paddingRight>
+ <paddingTop>12</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+
+ <values id="signing">
+ <value displayed="SigningNo">0</value>
+ <value displayed="SigningYes">1</value>
+ </values>
+ <values id="favouriteYesno">
+ <value displayed="PanelFavourite">1</value>
+ <value displayed="">0</value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ <filter />
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="name"
+ group="main"
+ init="%series% #%volume[%03d]% %title%"
+ label="Name"
+ type="formatted" />
+ <field value="series"
+ type="history text"
+ label="Series"
+ init="New Comic"
+ group="main"
+ imported="true"/>
+ <field value="volume"
+ type="number"
+ label="Volume"
+ init="1"
+ min="0"
+ max="9999"
+ group="main"
+ imported="true"/>
+ <field value="title"
+ type="short text"
+ label="Title"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="writer"
+ type="history text"
+ label="Writer"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="illustrator"
+ type="history text"
+ label="Illustrator"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="colourist"
+ type="history text"
+ label="Colourist"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="publisher"
+ type="history text"
+ label="Publisher"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="collection"
+ type="history text"
+ label="Collection"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="publishdate"
+ type="date"
+ label="PublishDate"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="printdate"
+ type="date"
+ label="PrintingDate"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="image"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="isbn"
+ type="short text"
+ label="ISBN"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="type"
+ type="history text"
+ label="Type"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="category"
+ type="history text"
+ label="Category"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="numberboards"
+ type="number"
+ label="NumberBoards"
+ init="1"
+ min="0"
+ max="9999"
+ group="details"
+ imported="true"/>
+ <field value="signing"
+ type="yesno"
+ label="Signing"
+ init="0"
+ group="details"
+ imported="false"/>
+ <field value="cost"
+ type="number"
+ label="Cost"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="Rating"
+ init="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="file"
+ type="file"
+ format="simple"
+ label="File"
+ init=""
+ group="details"
+ imported="false"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="series" comparison="contain" quick="true"/>
+ <filter field="writer" comparison="contain" quick="true"/>
+ <filter field="illustrator" comparison="contain" quick="true"/>
+ <filter field="colourist" comparison="contain" quick="true"/>
+ <filter field="publisher" comparison="contain" quick="true"/>
+ <filter field="publishdate" comparison="range" numeric="true" preprocess="extractYear"/>
+ <filter field="printdate" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true" />
+ <item type="label" for="series" nomargin="true" />
+ <item type="value" for="series" expand="true" nomargin="true" />
+ <item type="label" for="volume" nomargin="true" />
+ <item type="value" for="volume" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="value" for="image" width="130" height="170"/>
+ <item type="table" rows="5" cols="4" expand="true">
+ <item type="label" for="title" row="0" col="0"/>
+ <item type="value" for="title" row="0" col="1" colspan="3"/>
+ <item type="label" for="writer" row="1" col="0"/>
+ <item type="value" for="writer" row="1" col="1" colspan="3"/>
+ <item type="label" for="illustrator" row="2" col="0"/>
+ <item type="value" for="illustrator" row="2" col="1" colspan="3"/>
+ <item type="label" for="colourist" row="3" col="0"/>
+ <item type="value" for="colourist" row="3" col="1" colspan="3"/>
+ <item type="label" for="publisher" row="4" col="0"/>
+ <item type="value" for="publisher" row="4" col="1" colspan="3"/>
+ </item>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="7" cols="4">
+ <item type="label" for="collection" row="0" col="0"/>
+ <item type="value" for="collection" row="0" col="1" colspan="3"/>
+ <item type="label" for="type" row="1" col="0"/>
+ <item type="value" for="type" row="1" col="1"/>
+ <item type="label" for="category" row="1" col="2"/>
+ <item type="value" for="category" row="1" col="3"/>
+ <item type="label" for="publishdate" row="2" col="0"/>
+ <item type="value" for="publishdate" row="2" col="1"/>
+ <item type="label" for="printdate" row="2" col="2"/>
+ <item type="value" for="printdate" row="2" col="3"/>
+ <item type="label" for="rating" row="3" col="0"/>
+ <item type="value" for="rating" row="3" col="1"/>
+ <item type="label" for="added" row="4" col="0"/>
+ <item type="value" for="added" row="4" col="1"/>
+ <item type="label" for="cost" row="4" col="2"/>
+ <item type="value" for="cost" row="4" col="3"/>
+ <item type="label" for="isbn" row="5" col="0"/>
+ <item type="value" for="isbn" row="5" col="1"/>
+ <item type="label" for="format" row="5" col="2"/>
+ <item type="value" for="format" row="5" col="3"/>
+ <item type="label" for="numberboards" row="6" col="0"/>
+ <item type="value" for="numberboards" row="6" col="1"/>
+ <item type="value" for="signing" row="6" col="2" colspan="2"/>
+
+ </item>
+ <item type="line">
+ <item type="label" for="file"/>
+ <item type="value" for="file" expand="true"/>
+ <item type="launcher" for="file"/>
+ </item>
+
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCfilms.gcm b/lib/gcstar/GCModels/GCfilms.gcm
new file mode 100644
index 0000000..a5e34f4
--- /dev/null
+++ b/lib/gcstar/GCModels/GCfilms.gcm
@@ -0,0 +1,604 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCfilms">
+ <lang>GCfilms</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <groupby>serie</groupby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>title</title>
+ <cover>image</cover>
+ <url>webPage</url>
+ <play>trailer</play>
+ <results>
+ <field>title</field>
+ <field>date</field>
+ <field>director</field>
+ <field>actors</field>
+ <field>original</field>
+ <field>country</field>
+ <field>format</field>
+ </results>
+ <summary>
+ <field>director</field>
+ <field>date</field>
+ <field>genre</field>
+ <field>format</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="ages">
+ <value displayed="">0</value>
+ <value displayed="AgeUnrated">1</value>
+ <value displayed="AgeAll">2</value>
+ <value displayed="AgeParent">5</value>
+ <value displayed="10">10</value>
+ <value displayed="11">11</value>
+ <value displayed="12">12</value>
+ <value displayed="13">13</value>
+ <value displayed="14">14</value>
+ <value displayed="15">15</value>
+ <value displayed="16">16</value>
+ <value displayed="17">17</value>
+ <value displayed="18">18</value>
+ <value displayed="19">19</value>
+ <value displayed="20">20</value>
+ <value displayed="21">21</value>
+ </values>
+ <values id="seen">
+ <value displayed="SeenNo">0</value>
+ <value displayed="SeenYes">1</value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="main" label="Main"/>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ <filter field="seen" comparison="eq" numeric="true" value="0" after="1"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="main"
+ imported="false"/>
+ <field value="title"
+ type="short text"
+ label="Title"
+ init="NewItem"
+ group="main"
+ imported="true"/>
+ <field value="date"
+ type="date"
+ label="Date"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="time"
+ type="short text"
+ label="Time"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="director"
+ type="short text"
+ label="Director"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="country"
+ type="single list"
+ label="Country"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=",,,"
+ group="info"
+ imported="true"/>
+ <field value="image"
+ type="image"
+ label="Image"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="image"
+ imported="true"/>
+ <field value="actors"
+ type="double list"
+ label="Actors"
+ label1="Actor"
+ label2="Role"
+ init=""
+ group="info"
+ history="false"
+ imported="true"/>
+ <field value="original"
+ type="short text"
+ label="Original"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="synopsis"
+ type="long text"
+ label="Synopsis"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="webPage"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="main"
+ imported="true"/>
+ <field value="seen"
+ type="yesno"
+ label="Seen"
+ init="0"
+ notnull="true"
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="region"
+ type="history text"
+ label="Region"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="format"
+ type="history text"
+ label="Format"
+ init="DVD"
+ group="details"
+ imported="false"/>
+ <field value="number"
+ type="number"
+ label="Number"
+ init="1"
+ min="0"
+ max="9999"
+ group="details"
+ imported="false"/>
+ <field value="identifier"
+ type="number"
+ label="Identifier"
+ init="0"
+ min="0"
+ max="999999"
+ group="details"
+ imported="false"/>
+ <field value="place"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ min="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ min="0"
+ max="10"
+ group="info"
+ imported="true"/>
+ <field value="comment"
+ type="long text"
+ label="Comment"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="audio"
+ type="double list"
+ label="Audio"
+ label1="Audio"
+ label2="Encoding"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="subt"
+ type="single list"
+ label="Subtitles"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="age"
+ type="options"
+ label="MinimumAge"
+ init=""
+ values="ages"
+ separator="4"
+ group="info"
+ imported="true"/>
+ <field value="video"
+ type="history text"
+ label="Video"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="serie"
+ type="history text"
+ label="Serie"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="rank"
+ type="number"
+ label="Rank"
+ init=""
+ min="0"
+ max="999"
+ group="details"
+ imported="false"/>
+ <field value="trailer"
+ type="file"
+ format="video"
+ label="Trailer"
+ init=""
+ group="details"
+ imported="false"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="title" comparison="contain"/>
+ <filter field="original" comparison="contain"/>
+ <filter field="director" comparison="contain"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ <filter field="actors" comparison="contain"/>
+ <filter field="age" label="FilterAudienceAge" comparison="le" numeric="true" quick="true"/>
+ <filter field="date" comparison="range" numeric="true" preprocess="extractYear"/>
+ </group>
+ <group label="Languages">
+ <filter field="audio" comparison="contain"/>
+ <filter field="subt" comparison="contain"/>
+ </group>
+ <group label="Details">
+ <filter field="seen" comparison="eq" values="both" labeloff="FilterSeenNo" labelon="FilterSeenYes" quick="true"/>
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ <group label="PanelLending">
+ <filter field="borrower" comparison="eq" quick="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5" nomargin="true" />
+ <item type="value" for="title" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="label" for="original"/>
+ <item type="value" for="original" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="value" for="image" width="130" height="170"/>
+ <item type="box" width="6"/>
+ <item type="table" rows="4" cols="2">
+ <item type="label" for="date" row="0" col="0"/>
+ <item type="value" for="date" row="0" col="1"/>
+ <item type="label" for="director" row="1" col="0"/>
+ <item type="value" for="director" row="1" col="1"/>
+ <item type="label" for="time" row="2" col="0"/>
+ <item type="value" for="time" row="2" col="1"/>
+ <item type="label" for="age" row="3" col="0"/>
+ <item type="value" for="age" row="3" col="1"/>
+ </item>
+ </item>
+ <item type="expander" title="Country" collapsed="%country%">
+ <item type="value" for="country"/>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="synopsis" row="0" col="0" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="7" cols="3">
+ <item type="value" for="seen" row="0" col="0" colspan="2"/>
+ <item type="label" for="identifier" row="0" col="2"/>
+ <item type="value" for="identifier" row="0" col="3"/>
+ <item type="label" for="rating" row="1" col="0"/>
+ <item type="value" for="rating" row="1" col="1" colspan="1"/>
+ <item type="label" for="ratingpress" row="1" col="2"/>
+ <item type="value" for="ratingpress" row="1" col="3"/>
+ <item type="label" for="format" row="2" col="0"/>
+ <item type="value" for="format" row="2" col="1" expand="true"/>
+ <item type="label" for="number" row="2" col="2"/>
+ <item type="value" for="number" row="2" col="3" expand="true"/>
+ <item type="label" for="video" row="3" col="0"/>
+ <item type="value" for="video" row="3" col="1"/>
+ <item type="label" for="region" row="3" col="2"/>
+ <item type="value" for="region" row="3" col="3"/>
+ <item type="label" for="serie" row="4" col="0"/>
+ <item type="value" for="serie" row="4" col="1"/>
+ <item type="label" for="rank" row="4" col="2"/>
+ <item type="value" for="rank" row="4" col="3"/>
+ <item type="label" for="added" row="5" col="0"/>
+ <item type="value" for="added" row="5" col="1"/>
+ <item type="label" for="place" row="5" col="2"/>
+ <item type="value" for="place" row="5" col="3"/>
+ <item type="label" for="trailer" row="6" col="0"/>
+ <item type="line" row="6" col="1" colspan="3">
+ <item type="value" for="trailer" expand="true" nomargin="true"/>
+ <item type="launcher" for="trailer" nomargin="true"/>
+ <item type="extractor" for="trailer" nomargin="true"/>
+ </item>
+ </item>
+ <item type="expander" title="Languages" collapsed="=audio[@Audio@@Separator@%audio%]=^ - ^=subt[@Subtitles@@Separator@%subt%]=">
+ <item type="line" expand="true">
+ <item type="value" for="audio" expand="true"/>
+ <item type="value" for="subt" expand="true"/>
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item type="label" for="comment"/>
+ <item type="value" for="comment" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="webPage" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+
+ <panel name="compact" label="PanelCompact" editable="true">
+ <item type="line">
+ <item type="value" for="id" width="5"/>
+ <item type="value" for="title" expand="true"/>
+ <item type="special" for="searchButton"/>
+ <item type="special" for="deleteButton"/>
+ </item>
+ <item type="line">
+ <item type="box">
+ <item type="value" for="image" width="130" height="170"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" for="title" rows="7" cols="8">
+ <item type="label" for="original" row="0" col="0"/>
+ <item type="value" for="original" row="0" col="1" colspan="4"/>
+ <item type="label" for="date" row="1" col="0"/>
+ <item type="value" for="date" row="1" col="1" width="18" expand="true"/>
+ <item type="label" for="time" row="1" col="3"/>
+ <item type="value" for="time" row="1" col="4" width="8" expand="true"/>
+ <item type="label" for="age" row="1" col="6"/>
+ <item type="value" for="age" row="1" col="7"/>
+ <item type="label" for="director" row="2" col="0"/>
+ <item type="value" for="director" row="2" col="1" width="18"/>
+ <item type="label" for="ratingpress" row="2" col="3"/>
+ <item type="value" for="ratingpress" row="2" col="4"/>
+ <item type="label" for="video" row="2" col="6"/>
+ <item type="value" for="video" row="2" col="7" width="8"/>
+ <item type="label" for="serie" row="3" col="0"/>
+ <item type="value" for="serie" row="3" col="1" width="8"/>
+ <item type="label" for="rank" row="3" col="3"/>
+ <item type="value" for="rank" row="3" col="4"/>
+ <item type="label" for="place" row="3" col="6"/>
+ <item type="value" for="place" row="3" col="7" width="8"/>
+ <item type="label" for="format" row="4" col="0"/>
+ <item type="value" for="format" row="4" col="1" width="8"/>
+ <item type="label" for="number" row="4" col="3"/>
+ <item type="value" for="number" row="4" col="4"/>
+ <item type="label" for="region" row="4" col="6"/>
+ <item type="value" for="region" row="4" col="7" width="8"/>
+ <item type="label" for="identifier" row="5" col="0"/>
+ <item type="value" for="identifier" row="5" col="1"/>
+ <item type="value" for="seen" row="5" col="6" colspan="2"/>
+ <item type="label" for="rating" row="5" col="3"/>
+ <item type="value" for="rating" row="5" col="4"/>
+ <item type="label" for="trailer" row="6" col="0"/>
+ <item type="value" for="trailer" row="6" col="1" colspan="4" expand="true"/>
+ <item type="label" for="added" row="6" col="6"/>
+ <item type="value" for="added" row="6" col="7"/>
+ </item>
+ <item type="expander" title="Country" collapsed="%country%">
+ <item type="value" for="country"/>
+ </item>
+ <item type="expander" title="Genre" collapsed="%genre%">
+ <item type="value" for="genre"/>
+ </item>
+ <item type="expander" title="Languages" collapsed="=audio[@Audio@@Separator@%audio%]=^ - ^=subt[@Subtitles@@Separator@%subt%]=">
+ <item type="line" expand="true">
+ <item type="value" for="audio"/>
+ <item type="value" for="subt"/>
+ </item>
+ </item>
+ <item type="expander" title="Actors" collapsed="%actors%">
+ <item type="value" for="actors"/>
+ </item>
+ </item>
+ </item>
+ <item type="table" rows="2" cols="2" expand="true">
+ <item type="label" for="synopsis" row="0" col="0"/>
+ <item type="value" for="synopsis" row="0" col="1" expand="true"/>
+ <item type="label" for="comment" row="1" col="0"/>
+ <item type="value" for="comment" row="1" col="1" expand="true"/>
+ </item>
+ <item type="line">
+ <item type="frame" value="lending" title="PanelLending" row="4" col="4" expand="true" nomargin="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ <item type="label" for="borrowings" row="2" col="0" colspan="1" align="top"/>
+ <item type="value" for="borrowings" row="2" col="1" colspan="2"/>
+ </item>
+ <item type="box">
+ <item type="value" for="webPage" place="end" width="200"/>
+ </item>
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="title" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="100" expand="false" style="page"/>
+ <item type="value" for="original" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="100" expand="false" style="box">
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ <item type="value" for="seen" style="box" nomargin="true" values="seen"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="image"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="6" cols="2" expand="true">
+ <item type="label" for="date" row="0" col="0"/>
+ <item type="value" for="date" row="0" col="1" expand="true"/>
+ <item type="label" for="director" row="1" col="0"/>
+ <item type="value" for="director" row="1" col="1" expand="true"/>
+ <item type="label" for="time" row="2" col="0"/>
+ <item type="value" for="time" row="2" col="1" expand="true"/>
+ <item type="label" for="country" row="3" col="0"/>
+ <item type="value" for="country" row="3" col="1" expand="true"/>
+ <item type="label" for="age" row="4" col="0"/>
+ <item type="value" for="age" row="4" col="1" expand="true" values="ages"/>
+ <item type="label" for="genre" row="5" col="0"/>
+ <item type="value" for="genre" flat="true" row="5" col="1" expand="true"/>
+ <item type="label" for="ratingpress" row="6" col="0"/>
+ <item type="formatted" name="fullRatingpress" value="%ratingpress%/10" row="6" col="1"/>
+ </item>
+ </item>
+ </item>
+ <item type="box">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="actors" row="1" col="0"/>
+ <item type="value" for="actors" row="1" col="1" expand="true" flat="true" height="100"/>
+ <item type="label" for="synopsis" row="2" col="0"/>
+ <item type="value" for="synopsis" row="2" col="1" height="100" expand="true"/>
+ <item type="label" for="comment" row="3" col="0"/>
+ <item type="value" for="comment" row="3" col="1" height="100" expand="true"/>
+ </item>
+ <item type="expander" title="Details">
+ <item type="table" rows="8" cols="2" expand="true">
+ <item type="label" for="format" row="0" col="0"/>
+ <item type="formatted" name="fullformat" value="%format% (%number%)" row="0" col="1" expand="true"/>
+ <item type="label" for="region" row="1" col="0"/>
+ <item type="value" for="region" row="1" col="1" expand="true"/>
+ <item type="label" for="place" row="2" col="0"/>
+ <item type="value" for="place" row="2" col="1" expand="true"/>
+ <item type="label" for="identifier" row="3" col="0"/>
+ <item type="value" for="identifier" row="3" col="1" expand="true"/>
+ <item type="label" for="serie" row="4" col="0"/>
+ <item type="value" for="serie" row="4" col="1" expand="true"/>
+ <item type="label" for="audio" row="5" col="0"/>
+ <item type="value" for="audio" flat="true" row="5" col="1" expand="true"/>
+ <item type="label" for="subt" row="6" col="0"/>
+ <item type="value" for="subt" flat="true" row="6" col="1" expand="true"/>
+ <item type="label" for="video" row="7" col="0"/>
+ <item type="value" for="video" row="7" col="1" expand="true"/>
+ </item>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCgames.gcm b/lib/gcstar/GCModels/GCgames.gcm
new file mode 100644
index 0000000..3792063
--- /dev/null
+++ b/lib/gcstar/GCModels/GCgames.gcm
@@ -0,0 +1,492 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCgames">
+ <lang>GCgames</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <groupby>platform</groupby>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>boxpic</cover>
+ <url>web</url>
+ <play>executable</play>
+ <search>
+ <field>ean</field>
+ <field>name</field>
+ </search>
+ <results>
+ <field>name</field>
+ <field>platform</field>
+ <field>genre</field>
+ <field>released</field>
+ </results>
+ <summary>
+ <field>platform</field>
+ <field>genre</field>
+ <field>editor</field>
+ <field>completion</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="">
+ <value displayed=""></value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ <group id="tips" label="Tips"/>
+ </groups>
+
+ <random>
+ <filter field="completion" comparison="lt" numeric="true" value="100"/>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="info"
+ imported="false"/>
+ <field value="ean"
+ type="number"
+ label="Ean"
+ tip="Ean"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="info"
+ imported="true"/>
+ <field value="boxpic"
+ type="image"
+ label="Box"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="boxpic"
+ imported="true"/>
+ <field value="platform"
+ type="history text"
+ label="Platform"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="players"
+ type="short text"
+ label="Players"
+ init="1"
+ min="1"
+ max="10"
+ group="info"
+ imported="true"/>
+ <field value="editor"
+ type="short text"
+ label="Editor"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="developer"
+ type="short text"
+ label="Developer"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="released"
+ type="date"
+ label="Released"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="description"
+ type="long text"
+ label="Description"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="web"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="genre"
+ type="single list"
+ label="Genre"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="false"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ min="0"
+ max="10"
+ group="details"
+ imported="true"/>
+ <field value="case"
+ type="yesno"
+ label="Case"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="manual"
+ type="yesno"
+ label="Manual"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="exclusive"
+ type="yesno"
+ label="Exclusive"
+ init="0"
+ group="details"
+ imported="true"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="completion"
+ type="number"
+ label="Completion"
+ init="0"
+ min="0"
+ max="200"
+ step="0.1"
+ group="details"
+ imported="false"/>
+ <field value="resolutions"
+ type="single list"
+ label="Resolutions"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="installationsize"
+ type="number"
+ label="InstallationSize"
+ init="0"
+ group="details"
+ imported="false"/>
+ <field value="installationsizeunit"
+ type="options"
+ label=""
+ init="0"
+ values="filesizeunits"
+ group="details"
+ imported="false"
+ relatedto="installationsize"/>
+ <field value="executable"
+ type="file"
+ format="program"
+ label="Executable"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="screenshot1"
+ type="image"
+ label="Screenshot1"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="screenshot2"
+ type="image"
+ label="Screenshot2"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="comments"
+ type="long text"
+ label="Comments"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="code"
+ type="double list"
+ history="false"
+ label="Codes"
+ label1="Code"
+ label2="Effect"
+ init=""
+ group="tips"
+ imported="true"/>
+ <field value="unlockable"
+ type="double list"
+ history="false"
+ label="Unlockables"
+ label1="Unlockable"
+ label2="Howto"
+ init=""
+ group="tips"
+ imported="true"/>
+ <field value="secrets"
+ type="long text"
+ label="Secrets"
+ init=""
+ group="tips"
+ imported="true"/>
+ <field value="region"
+ type="history text"
+ label="Region"
+ init=""
+ group="details"
+ imported="true"/>
+ <field value="serialnumber"
+ type="short text"
+ label="SerialNumber"
+ init=""
+ group="details"
+ imported="true"/>
+
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="name" comparison="contain"/>
+ <filter field="platform" comparison="eq" quick="true"/>
+ <filter field="genre" comparison="contain" quick="true"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ <filter field="completion" comparison="range" numeric="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="ean" width="10" tip="" nomargin="true" />
+ <item type="value" for="name" expand="true" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="box">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ </item>
+ <item type="table" title="Information" rows="6" cols="5">
+ <item type="label" for="platform" row="0" col="0"/>
+ <item type="value" for="platform" row="0" col="1"/>
+ <item type="label" for="players" row="1" col="0"/>
+ <item type="value" for="players" row="1" col="1"/>
+ <item type="label" for="editor" row="2" col="0"/>
+ <item type="value" for="editor" row="2" col="1"/>
+ <item type="label" for="developer" row="3" col="0"/>
+ <item type="value" for="developer" row="3" col="1"/>
+ <item type="label" for="released" row="4" col="0"/>
+ <item type="value" for="released" row="4" col="1"/>
+ <item type="expander" title="Genre" collapsed="%genre%" row="5" col="0" colspan="2">
+ <item type="value" for="genre"/>
+ </item>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="7" cols="5">
+ <item type="line" row="0" col="0" colspan="3">
+ <item type="value" for="case" />
+ <item type="value" for="manual" />
+ <item type="value" for="exclusive" />
+ </item>
+ <item type="label" for="rating" row="1" col="0"/>
+ <item type="value" for="rating" row="1" col="1"/>
+ <item type="label" for="ratingpress" row="1" col="2"/>
+ <item type="value" for="ratingpress" row="1" col="3" colspan="2"/>
+ <item type="label" for="completion" row="2" col="0"/>
+ <item type="value" for="completion" row="2" col="1"/>
+ <item type="label" for="added" row="2" col="2"/>
+ <item type="value" for="added" row="2" col="3" colspan="2"/>
+ <item type="label" for="serialnumber" row="3" col="0"/>
+ <item type="value" for="serialnumber" row="3" col="1"/>
+ <item type="label" for="region" row="3" col="2"/>
+ <item type="value" for="region" row="3" col="3" colspan="2" />
+ <item type="label" for="location" row="4" col="0"/>
+ <item type="value" for="location" row="4" col="1"/>
+ <item type="label" for="installationsize" row="4" col="2"/>
+ <item type="value" for="installationsize" row="4" col="3"/>
+ <item type="value" for="installationsizeunit" row="4" col="4"/>
+ <item type="label" for="executable" row="5" col="0"/>
+ <item type="line" row="5" col="1" colspan="4">
+ <item type="value" for="executable" nomargin="true" expand="true"/>
+ <item type="launcher" for="executable" nomargin="true"/>
+ </item>
+ <item type="expander" title="Resolutions" collapsed="%resolutions%" row="6" col="0" colspan="5">
+ <item type="value" for="resolutions"/>
+ </item>
+ </item>
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" label="Screenshots" row="0" col="0" colspan="2"/>
+ <item type="value" for="screenshot1" row="1" col="0" width="200" height="150"/>
+ <item type="value" for="screenshot2" row="1" col="1" width="200" height="150"/>
+ <item type="label" for="comments" row="2" col="0" colspan="2"/>
+ <item type="value" for="comments" row="3" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="tips" title="Tips">
+ <item type="expander" title="Codes">
+ <item type="value" for="code" expand="true"/>
+ </item>
+ <item type="expander" title="Unlockables">
+ <item type="value" for="unlockable" expand="true"/>
+ </item>
+ <item type="box" expand="true" nomargin="true">
+ <item type="label" for="secrets"/>
+ <item type="value" for="secrets" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="web" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="name" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="150" expand="false" style="page"/>
+ <item type="value" for="platform" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="150" expand="false" style="box">
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ <item type="value" for="editor" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="boxpic" width="140"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="6" cols="2" expand="true">
+ <item type="label" for="genre" row="0" col="0"/>
+ <item type="value" for="genre" flat="true" row="0" col="1" expand="true"/>
+ <item type="label" for="developer" row="1" col="0"/>
+ <item type="value" for="developer" row="1" col="1" expand="true"/>
+ <item type="label" for="players" row="2" col="0"/>
+ <item type="value" for="players" row="2" col="1" expand="true"/>
+ <item type="label" for="released" row="3" col="0"/>
+ <item type="value" for="released" row="3" col="1" expand="true"/>
+ <item type="label" for="completion" row="4" col="0"/>
+ <item type="value" for="completion" row="4" col="1" expand="true"/>
+ <item type="label" for="location" row="5" col="0"/>
+ <item type="value" for="location" row="5" col="1" expand="true"/>
+ </item>
+ </item>
+ </item>
+ <item type="value" for="description" height="5em"/>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="screenshot1" row="0" col="0" width="200" height="150" expand="true"/>
+ <item type="value" for="screenshot2" row="0" col="1" width="200" height="150" expand="true"/>
+ </item>
+ <item type="expander" title="Codes">
+ <item type="value" for="code" expand="true"/>
+ </item>
+ <item type="expander" title="Unlockables">
+ <item type="value" for="unlockable" expand="true"/>
+ </item>
+ <item type="expander" title="Secrets">
+ <item type="value" for="secrets" expand="true" height="5em"/>
+ </item>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true" />
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCminicars.gcm b/lib/gcstar/GCModels/GCminicars.gcm
new file mode 100644
index 0000000..ba43eb0
--- /dev/null
+++ b/lib/gcstar/GCModels/GCminicars.gcm
@@ -0,0 +1,892 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCminicars">
+
+ <lang>GCminicars</lang>
+
+ <options>
+
+ <defaults>
+ <image>no_minicars.png</image>
+ <groupby>scale</groupby>
+ </defaults>
+
+ <fields>
+ <cover>picture</cover>
+ <id>gcsautoid</id>
+ <play>playlist</play>
+ <title>name</title>
+ </fields>
+
+ <overlay>
+ <image>minicars.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>12</paddingRight>
+ <paddingTop>0</paddingTop>
+ <paddingBottom>12</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+
+ </options>
+
+ <groups>
+ <group id="Main" label="Main" />
+ <group id="Details" label="Details" />
+ <group id="Catalogs" label="Catalogs" />
+ <group id="Pictures" label="Pictures" />
+ <group id="PanelLending" label="PanelLending" />
+ <group id="Realmodel" label="Realmodel" />
+ </groups>
+
+ <filters>
+
+ <group label="Main">
+ <filter comparison="range" field="year" labelselect="Intervalle" numeric="true" quick="true" />
+ <filter comparison="contain" field="picture" numeric="true" quick="false" />
+ <filter comparison="eq" field="exchange" numeric="false" quick="true" />
+ </group>
+
+ <group label="Details">
+ <filter comparison="ge" field="acquisition" labelselect="&gt;=" numeric="false" quick="false" />
+ </group>
+
+ </filters>
+
+ <random></random>
+
+ <fields lending="true" tags="true">
+
+<!-- Definition des Champs Communs -->
+
+ <field value="playlist" format="audio" group="" init="..\lib\gcstar\GCHelp\GCHelpMinicars.pdf" label="Help" type="file" />
+ <field value="name" group="" init="%scale% %manufacturer% %constructor% %modele% %version% (%year%)" label="Name" type="formatted" />
+
+<!-- Definition des Champs "Main" -->
+
+ <field value="gcsautoid" displayed="" group="" imported="false" init="" label="" type="number" />
+ <field value="rating1" group="Main" label="Rating1" max="10" init="0" type="number" displayas="graphical"/>
+
+ <field value="picture" default="view" group="Main" init="" label="Picture" type="image" />
+ <field value="logo1" default="view" group="Main" init="" label="Logo1" type="image" />
+ <field value="logo2" default="view" group="Main" init="" label="Logo2" type="image" />
+ <field value="scale" flat="true" group="Main" history="true" init="" label="Scale" type="history text" />
+ <field value="type1" flat="true" group="Main" history="true" init="" label="Type1" type="history text" />
+ <field value="manufacturer" flat="true" group="Main" history="true" init="" label="Manufacturer" type="history text" />
+ <field value="version" flat="true" group="Main" history="true" init="" label="Version" type="short text" />
+ <field value="modele" group="Main" label="Modele" history="false" type="history text" init="" />
+ <field value="constructor" flat="true" group="Main" history="true" init="" label="Constructor" type="history text" />
+ <field value="year" group="Main" init="" label="Year" type="number" />
+ <field value="comments1" group="Main" init="" label="Comments1" type="long text" />
+ <field value="exchange" group="Main" init="0" label="Exchange" type="yesno" />
+ <field value="wanted" group="Main" init="0" label="Wanted" type="yesno" />
+ <field value="pub" group="Main" label="Pub" history="false" type="history text" init="" />
+ <field value="transformation" group="Main" init="0" label="Transformation" type="yesno" />
+ <field value="kit" group="Main" init="0" label="Kit" type="yesno" />
+ <field value="reference" group="Main" init="" label="Reference" type="short text" />
+ <field value="color" flat="true" group="Main" history="true" init="" label="Color" type="short text" />
+
+<!-- Definition des Champs "Details" -->
+
+ <field value="material" flat="true" group="Details" history="true" init="" label="Material" type="single list" />
+ <field value="added" group="Details" init="current" label="PanelAdded" type="date" />
+ <field value="rating2" group="Details" init="0" label="Rating2" min="0" max="10" type="number" displayas="graphical" />
+ <field value="rating3" group="Details" init="0" label="Rating3" min="0" max="10" type="number" displayas="graphical" />
+ <field value="acquisition" group="Details" init="" label="Acquisition" type="date" />
+ <field value="comments2" group="Details" init="" label="Comments2" type="long text" />
+ <field value="buyprice" group="Details" init="" label="Buyprice" type="number" />
+ <field value="finishline" group="Details" init="" label="Finishline" type="number" />
+ <field value="carnumber" group="Details" init="" label="Carnumber" type="number" />
+ <field value="courseyear" group="Details" init="" label="Courseyear" type="date" />
+ <field value="courselocation" group="Details" history="true" init="" label="Courselocation" type="history text" />
+ <field value="location" group="Details" init="" label="Location" type="short text" />
+ <field value="box1" flat="true" group="Details" history="true" init="" label="Box1" type="history text" />
+ <field value="box2" flat="true" group="Details" history="true" init="" label="Box2" type="history text" />
+ <field value="condition" flat="true" group="Details" history="true" init="" label="Condition" type="history text" />
+ <field value="pilots" group="Details" init="" label="Pilots" type="short text" />
+ <field value="copilots" group="Details" init="" label="Copilots" type="short text" />
+ <field value="course" flat="true" group="Details" history="true" init="" label="Course" type="history text" />
+ <field value="pub2" group="Details" init="" label="Pub2" type="short text" />
+ <field value="edition" flat="true" group="Details" history="true" init="" label="Edition" type="history text" />
+ <field value="estimate" group="Details" init="" label="Estimate" type="number" />
+ <field value="weight" group="Details" init="" label="Weight" type="short text" />
+ <field value="parts" group="Details" init="" label="Parts" type="number" />
+ <field value="decorations" group="Details" init="" label="Decorations" type="number" />
+ <field value="team" group="Details" history="true" init="" label="Team" type="history text" />
+ <field value="personalref" group="Details" init="" label="Personalref" type="short text" />
+ <field value="madein" flat="true" group="Details" history="true" init="" label="Madein" type="history text" />
+ <field value="interior" group="Details" init="" label="Interior" type="short text" />
+ <field value="serial" group="Details" init="" label="Serial" type="short text" />
+ <field value="serialnumber" group="Details" init="" label="Serialnumber" type="short text" />
+ <field value="lwh" group="Details" history="true" init="" label="Lwh" type="short text" />
+ <field value="designed" group="Details" history="true" init="" label="Designed" type="history text" />
+ <field value="containbox" group="Details" init="" label="Containbox" type="short text" />
+ <field value="framecar" group="Details" init="" label="Framecar" type="short text" />
+ <field value="bodycar" group="Details" init="" label="Bodycar" type="short text" />
+ <field value="registrationnumber1" group="Details" init="" label="Registrationnumber1" type="short text" />
+ <field value="registrationnumber2" group="Details" init="" label="Registrationnumber2" type="short text" />
+ <field value="collectiontype" group="Details" history="true" init="" label="Collectiontype" type="history text" />
+ <field value="wheels" group="Details" init="" label="Wheels" type="short text" />
+ <field value="characters" group="Details" init="" label="Characters" type="short text" />
+ <field value="filmcar" group="Details" init="" label="Filmcar" type="short text" />
+ <field value="filmpart" group="Details" init="" label="Filmpart" type="short text" />
+ <field value="decorationset" group="Details" init="" label="Decorationset" type="short text" />
+ <field value="molding" group="Details" init="" label="Molding" type="short text" />
+ <field value="detailsparts" group="Details" init="" label="Detailsparts" type="short text" />
+ <field value="detailsdecorations" group="Details" init="" label="Detailsdecorations" type="short text" />
+ <field value="colormirror" group="Details" init="%color%" label="Colormirror" type="formatted" />
+ <field value="steeringwheel" group="Details" init="" label="Steeringwheel" type="short text" />
+
+<!-- Definition des Champs "Catalogs" -->
+
+ <field value="websitec" group="Catalogs" init="" label="Websitec" type="url" />
+ <field value="websitem" group="Catalogs" init="" label="Websitem" type="url" />
+ <field value="websiteo" group="Catalogs" init="" label="Websiteo" type="url" />
+ <field value="barcode" group="Catalogs" init="" label="Barcode" type="number" />
+ <field value="catalogyear" group="Catalogs" init="" label="Catalogyear" type="date" />
+ <field value="catalogpage" group="Catalogs" init="" label="Catalogpage" type="short text" />
+ <field value="catalogedition" group="Catalogs" init="" label="Catalogedition" type="short text" />
+ <field value="catalogprice" group="Catalogs" init="" label="Catalogprice" type="number" />
+ <field value="picture2" default="view" group="Catalogs" init="" label="Picture2" type="image" />
+ <field value="catalog1" default="view" group="Catalogs" init="" label="Catalog1" type="image" />
+ <field value="catalog2" default="view" group="Catalogs" init="" label="Catalog2" type="image" />
+ <field value="comments3" group="Catalogs" init="" label="Comments3" type="long text" />
+ <field value="year3" group="Catalogs" init="" label="Year3" type="date" />
+ <field value="referencemirror" group="Catalogs" init="%reference%" label="Referencemirror" type="formatted" />
+
+<!-- Definition des Champs "Pictures" -->
+
+ <field value="top" default="view" group="Pictures" init="" label="Top" type="image" />
+ <field value="back" default="view" group="Pictures" init="" label="Back" type="image" />
+ <field value="edge1" default="view" group="Pictures" init="" label="Edge1" type="image" />
+ <field value="edge2" default="view" group="Pictures" init="" label="Edge2" type="image" />
+ <field value="edge3" default="view" group="Pictures" init="" label="Edge3" type="image" />
+ <field value="edge4" default="view" group="Pictures" init="" label="Edge4" type="image" />
+ <field value="edge5" default="view" group="Pictures" init="" label="Edge5" type="image" />
+ <field value="edge6" default="view" group="Pictures" init="" label="Edge6" type="image" />
+ <field value="edge7" default="view" group="Pictures" init="" label="Edge7" type="image" />
+ <field value="edge8" default="view" group="Pictures" init="" label="Edge8" type="image" />
+ <field value="edge9" default="view" group="Pictures" init="" label="Edge9" type="image" />
+ <field value="otherscomments" group="Pictures" init="" label="OthersComments" type="long text" />
+ <field value="othersdetails" group="Pictures" init="" label="OthersDetails" type="long text" />
+
+<!-- Definition des Champs "PanelLending" -->
+
+ <field value="comments4" group="PanelLending" init="" label="Comments4" type="long text" />
+
+<!-- Definition des Champs "Realmodel" -->
+
+ <field value="front2" default="view" group="Realmodel" init="" label="Head" type="image" />
+ <field value="back2" default="view" group="Realmodel" init="" label="Tail" type="image" />
+ <field value="edge10" default="view" group="Realmodel" init="" label="Edge10" type="image" />
+ <field value="edge20" default="view" group="Realmodel" init="" label="Edge20" type="image" />
+ <field value="edge30" default="view" group="Realmodel" init="" label="Edge30" type="image" />
+ <field value="edge40" default="view" group="Realmodel" init="" label="Edge40" type="image" />
+ <field value="comments5" group="Realmodel" init="" label="Comments5" type="long text" />
+ <field value="difference" group="Realmodel" init="" label="Difference" type="long text" />
+
+ </fields>
+
+<!-- Lecture / Ecriture -->
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item cols="4" rows="1" type="table" expand="true" >
+ <item col="0" row="1" expand="true" for="name" type="value" />
+ <!--<item col="2" row="1" for="playlist" type="label" />
+ <item col="3" row="1" for="playlist" type="launcher" label="Help1" />-->
+ </item>
+ </item>
+ <item expand="true" type="notebook">
+
+<!-- Onglet "Main" -->
+
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="Picture1" align="center" />
+ <item row="8" col="0" expand="false" for="picture" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="10" type="table" expand="true">
+ <item row="1" col="0" for="scale" type="label" />
+ <item row="1" col="1" for="scale" expand="true" type="value" />
+ <item row="2" col="0" for="manufacturer" type="label" />
+ <item row="2" col="1" for="manufacturer" expand="true" type="value" />
+ <item row="3" col="0" for="type1" type="label" />
+ <item row="3" col="1" for="type1" expand="true" type="value" />
+ <item row="4" col="0" for="constructor" type="label" />
+ <item row="4" col="1" for="constructor" expand="true" type="value" />
+ <item row="5" col="0" for="modele" type="label" />
+ <item row="5" col="1" for="modele" expand="true" type="value" />
+ <item row="6" col="0" for="version" type="label" />
+ <item row="6" col="1" for="version" expand="true" type="value" />
+ <item row="7" col="0" for="color" type="label" />
+ <item row="7" col="1" for="color" expand="true" type="value" />
+ <item row="8" col="0" for="pub" type="label" />
+ <item row="8" col="1" for="pub" expand="true" type="value" />
+ <item row="9" col="0" for="year" type="label" />
+ <item row="9" col="1" for="year" expand="true" type="value" />
+ <item row="10" col="0" for="reference" type="label" />
+ <item row="10" col="1" for="reference" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="3" expand="true" type="label" label="Constructor" align="center" />
+ <item row="1" expand="true" type="label" label="Manufacturer" align="center" />
+ <item row="0" for="logo1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="logo2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="kit" type="value" />
+ <item row="0" col="1" expand="true" for="transformation" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Details" -->
+
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item type="label" label="MiscCharacteristics" align="center" />
+ <item cols="4" expand="true" rows="29" type="table" >
+ <item row="0" col="0" collapsed="%material%" colspan="2" title="Material" type="expander">
+ <item for="material" type="value" />
+ </item>
+ <item col="2" row="0" for="molding" type="label" />
+ <item col="3" row="0" for="molding" type="value" />
+ <item col="0" row="1" for="condition" type="label" />
+ <item col="1" row="1" for="condition" type="value" />
+ <item col="2" row="1" for="added" type="label" />
+ <item col="3" row="1" for="added" type="value" />
+ <item col="0" row="2" for="edition" type="label" />
+ <item col="1" row="2" for="edition" type="value" />
+ <item col="2" row="2" for="collectiontype" type="label" />
+ <item col="3" row="2" for="collectiontype" type="value" />
+
+ <item col="0" row="3" for="serial" type="label" />
+ <item col="1" row="3" for="serial" type="value" />
+ <item col="2" row="3" for="serialnumber" type="label" />
+ <item col="3" row="3" for="serialnumber" type="value" />
+ <item col="0" row="4" for="designed" type="label" />
+ <item col="1" row="4" for="designed" type="value" />
+ <item col="2" row="4" for="madein" type="label" />
+ <item col="3" row="4" for="madein" type="value" />
+
+ <item col="0" row="5" for="box1" type="label" />
+ <item col="1" row="5" for="box1" type="value" />
+ <item col="2" row="5" for="box2" type="label" />
+ <item col="3" row="5" for="box2" type="value" />
+ <item col="0" row="6" for="containbox" type="label" />
+ <item col="1" row="6" for="containbox" type="value" />
+
+ <item col="0" row="7" for="rating2" type="label" />
+ <item col="1" row="7" for="rating2" type="value" align="center"/>
+ <item col="2" row="7" for="rating3" type="label" />
+ <item col="3" row="7" for="rating3" type="value" align="center"/>
+ <item col="0" row="8" for="acquisition" type="label" />
+ <item col="1" row="8" for="acquisition" type="value" />
+ <item col="2" row="8" for="location" type="label" />
+ <item col="3" row="8" for="location" type="value" />
+ <item col="0" row="9" for="buyprice" type="label" />
+ <item col="1" row="9" for="buyprice" type="value" />
+ <item col="2" row="9" for="estimate" type="label" />
+ <item col="3" row="9" for="estimate" type="value" />
+
+ <item col="0" row="10" for="comments2" type="label" />
+ <item col="0" row="11" colspan="4" for="comments2" expand="true" type="value" />
+
+ <item col="1" row="12" type="label" label="Diorama" align="center" />
+ <item col="0" row="13" for="decorationset" type="label" />
+ <item col="1" row="13" for="decorationset" type="value" />
+ <item col="0" row="14" for="characters" type="label" />
+ <item col="1" row="14" for="characters" type="value" />
+
+ <item col="3" row="12" type="label" label="CarFromFilm" align="center" />
+ <item col="2" row="13" for="filmcar" type="label" />
+ <item col="3" row="13" for="filmcar" type="value" />
+ <item col="2" row="14" for="filmpart" type="label" />
+ <item col="3" row="14" for="filmpart" type="value" />
+
+ <item col="1" row="15" type="label" label="VehiculeDetails" align="center" />
+ <item col="0" row="16" for="parts" type="label" />
+ <item col="1" row="16" for="parts" type="value" />
+ <item col="0" row="17" for="detailsparts" type="label" />
+ <item col="1" row="17" for="detailsparts" type="value" />
+ <item col="0" row="18" for="decorations" type="label" />
+ <item col="1" row="18" for="decorations" type="value" />
+ <item col="0" row="19" for="detailsdecorations" type="label" />
+ <item col="1" row="19" for="detailsdecorations" type="value" />
+ <item col="0" row="20" for="lwh" type="label" />
+ <item col="1" row="20" for="lwh" type="value" />
+ <item col="0" row="21" for="weight" type="label" />
+ <item col="1" row="21" for="weight" type="value" />
+ <item col="0" row="22" for="framecar" type="label" />
+ <item col="1" row="22" for="framecar" type="value" />
+ <item col="0" row="23" for="bodycar" type="label" />
+ <item col="1" row="23" for="bodycar" type="value" />
+ <item col="0" row="24" for="colormirror" type="label" />
+ <item col="1" row="24" for="colormirror" type="value" />
+ <item col="0" row="25" for="interior" type="label" />
+ <item col="1" row="25" for="interior" type="value" />
+ <item col="0" row="26" for="wheels" type="label" />
+ <item col="1" row="26" for="wheels" type="value" />
+ <item col="0" row="27" for="registrationnumber1" type="label" />
+ <item col="1" row="27" for="registrationnumber1" type="value" />
+ <item col="2" row="27" for="registrationnumber2" type="label" />
+ <item col="3" row="27" for="registrationnumber2" type="value" />
+ <item col="0" row="28" for="steeringwheel" type="label" />
+ <item col="1" row="28" for="steeringwheel" type="value" />
+
+ <item col="3" row="15" type="label" label="RacingCar" align="center" />
+ <item col="2" row="16" for="course" type="label" />
+ <item col="3" row="16" for="course" type="value" />
+ <item col="2" row="17" for="courselocation" type="label" />
+ <item col="3" row="17" for="courselocation" type="value" />
+ <item col="2" row="18" for="courseyear" type="label" />
+ <item col="3" row="18" for="courseyear" type="value" />
+ <item col="2" row="19" for="team" type="label" />
+ <item col="3" row="19" for="team" type="value" />
+ <item col="2" row="20" for="pilots" type="label" />
+ <item col="3" row="20" for="pilots" type="value" />
+ <item col="2" row="21" for="copilots" type="label" />
+ <item col="3" row="21" for="copilots" type="value" />
+ <item col="2" row="22" for="carnumber" type="label" />
+ <item col="3" row="22" for="carnumber" type="value" />
+ <item col="2" row="23" for="pub2" type="label" />
+ <item col="3" row="23" for="pub2" type="value" />
+ <item col="2" row="24" for="finishline" type="label" />
+ <item col="3" row="24" for="finishline" type="value" />
+
+ </item>
+
+ </item>
+
+<!-- Onglet "Catalogs" -->
+
+ <item expand="true" title="Catalogs" type="tab" value="bla">
+ <item type="line">
+ <item cols="1" rows="9" type="table" expand="true">
+ <item row="8" col="0" expand="true" type="label" label="OfficialPicture" align="center" />
+ <item row="7" col="0" expand="false" for="picture2" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item col="0" row="0" for="barcode" type="label" />
+ <item col="1" row="0" for="barcode" type="value" />
+ <item col="0" row="1" for="referencemirror" type="label" />
+ <item col="1" row="1" for="referencemirror" type="value" />
+ <item col="0" row="2" for="year3" type="label" />
+ <item col="1" row="2" for="year3" type="value" />
+ <item col="0" row="3" for="catalogyear" type="label" />
+ <item col="1" row="3" for="catalogyear" type="value" />
+ <item col="0" row="4" for="catalogedition" type="label" />
+ <item col="1" row="4" for="catalogedition" type="value" />
+ <item col="0" row="5" for="catalogpage" type="label" />
+ <item col="1" row="5" for="catalogpage" type="value" />
+ <item col="0" row="6" for="catalogprice" type="label" />
+ <item col="1" row="6" for="catalogprice" type="value" />
+ <item col="0" row="7" for="personalref" type="label" />
+ <item col="1" row="7" for="personalref" type="value" />
+ <item col="0" row="8" for="websitem" type="label" />
+ <item col="1" row="8" for="websitem" expand="default" type="value" />
+ <item col="0" row="9" for="websitec" type="label" />
+ <item col="1" row="9" for="websitec" expand="default" type="value" />
+ <item col="0" row="10" for="websiteo" type="label" />
+ <item col="1" row="10" for="websiteo" expand="default" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="1" expand="true" type="label" label="CatalogCoverPicture" align="center" />
+ <item row="3" expand="true" type="label" label="CatalogPagePicture" align="center" />
+ <item row="0" for="catalog1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="catalog2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item for="comments3" type="label" />
+ <item for="comments3" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Pictures" -->
+
+ <item expand="true" title="Pictures" type="tab" value="bla" >
+
+ <item align="left" for="othersdetails" type="label" />
+ <item expand="true" type="line">
+ <item for="othersdetails" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="3" rows="11" type="table" expand="true" >
+ <item row="1" col="0" expand="false" for="edge1" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="edge2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="2" expand="false" for="edge3" type="value" height="180" width="240" align="center" />
+ <item row="5" col="0" expand="false" for="edge4" type="value" height="180" width="240" align="center" />
+ <item row="5" col="1" expand="false" for="edge5" type="value" height="180" width="240" align="center" />
+ <item row="5" col="2" expand="false" for="edge6" type="value" height="180" width="240" align="center" />
+ <item row="9" col="0" expand="false" for="edge7" type="value" height="180" width="240" align="center" />
+ <item row="9" col="1" expand="false" for="edge8" type="value" height="180" width="240" align="center" />
+ <item row="9" col="2" expand="false" for="edge9" type="value" height="180" width="240" align="center" />
+
+ <item row="2" col="0" expand="true" type="label" label="AVG" align="center" />
+ <item row="2" col="1" expand="true" type="label" label="AV" align="center" />
+ <item row="2" col="2" expand="true" type="label" label="AVD" align="center" />
+ <item row="6" col="0" expand="true" type="label" label="G" align="center" />
+ <item row="6" col="1" expand="true" type="label" label="BOX" align="center" />
+ <item row="6" col="2" expand="true" type="label" label="D" align="center" />
+ <item row="10" col="0" expand="true" type="label" label="ARG" align="center" />
+ <item row="10" col="1" expand="true" type="label" label="AR" align="center" />
+ <item row="10" col="2" expand="true" type="label" label="ARD" align="center" />
+
+ </item>
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="2" type="table" expand="true" >
+ <item row="0" col="0" expand="false" for="top" type="value" height="180" width="240" align="center" />
+ <item row="0" col="1" expand="false" for="back" type="value" height="180" width="240" align="center" />
+ <item row="1" col="0" expand="true" type="label" label="Top1" align="center" />
+ <item row="1" col="1" expand="true" type="label" label="Back1" align="center" />
+
+ </item>
+ </item>
+
+ <item align="left" for="otherscomments" type="label" />
+ <item expand="true" type="line">
+ <item for="otherscomments" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelLending" -->
+
+ <item title="PanelLending" type="tab" value="lending">
+ <item type="label" label="LendingExplanation" align="center" />
+ <item rows="3" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" for="borrower" row="0" type="value" />
+ <item col="2" for="mailButton" row="0" type="special" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" for="lendDate" row="1" type="value" />
+ <item col="2" for="itemBackButton" row="1" type="special" />
+ </item>
+ <item align="left" for="borrowings" type="label" />
+ <item expand="true" type="line">
+ <item type="box" width="64" />
+ <item expand="true" for="borrowings" type="value" />
+ <item type="box" width="64" />
+ </item>
+ <item align="left" for="comments4" type="label" />
+ <item expand="true" type="line">
+ <item for="comments4" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Realmodel" -->
+
+ <item expand="true" title="Realmodel" type="tab" value="bla" >
+
+ <item align="left" for="difference" type="label" />
+ <item expand="true" type="line">
+ <item for="difference" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="5" type="table" expand="true" >
+ <item row="0" col="0" expand="true" type="label" label="Front2" align="center" />
+ <item row="0" col="1" expand="true" type="label" label="Back2" align="center" />
+ <item row="1" col="0" expand="false" for="front2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="back2" type="value" height="180" width="240" align="center" />
+ <item row="2" col="0" expand="true" colspan="2" type="label" label="Others" align="center" />
+ <item row="3" col="0" expand="false" for="edge10" type="value" height="180" width="240" align="center" />
+ <item row="3" col="1" expand="false" for="edge20" type="value" height="180" width="240" align="center" />
+ <item row="4" col="0" expand="false" for="edge30" type="value" height="180" width="240" align="center" />
+ <item row="4" col="1" expand="false" for="edge40" type="value" height="180" width="240" align="center" />
+ </item>
+ </item>
+
+ <item align="left" for="comments5" type="label" />
+ <item expand="true" type="line">
+ <item for="comments5" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelTags" -->
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+<!-- "Lecture Seule" -->
+
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+
+<!-- Onglet "Main" -->
+
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="Picture1" align="center" />
+ <item row="8" col="0" expand="false" for="picture" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="10" type="table" expand="true">
+ <item row="1" col="0" for="scale" type="label" />
+ <item row="1" col="1" for="scale" expand="true" type="value" />
+ <item row="2" col="0" for="manufacturer" type="label" />
+ <item row="2" col="1" for="manufacturer" expand="true" type="value" />
+ <item row="3" col="0" for="type1" type="label" />
+ <item row="3" col="1" for="type1" expand="true" type="value" />
+ <item row="4" col="0" for="constructor" type="label" />
+ <item row="4" col="1" for="constructor" expand="true" type="value" />
+ <item row="5" col="0" for="modele" type="label" />
+ <item row="5" col="1" for="modele" expand="true" type="value" />
+ <item row="6" col="0" for="version" type="label" />
+ <item row="6" col="1" for="version" expand="true" type="value" />
+ <item row="7" col="0" for="color" type="label" />
+ <item row="7" col="1" for="color" expand="true" type="value" />
+ <item row="8" col="0" for="pub" type="label" />
+ <item row="8" col="1" for="pub" expand="true" type="value" />
+ <item row="9" col="0" for="year" type="label" />
+ <item row="9" col="1" for="year" expand="true" type="value" />
+ <item row="10" col="0" for="reference" type="label" />
+ <item row="10" col="1" for="reference" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="3" expand="true" type="label" label="Constructor" align="center" />
+ <item row="1" expand="true" type="label" label="Manufacturer" align="center" />
+ <item row="0" for="logo1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="logo2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="kit" type="value" />
+ <item row="0" col="1" expand="true" for="transformation" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Details" -->
+
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item type="label" label="MiscCharacteristics" align="center" />
+ <item cols="4" expand="true" rows="29" type="table" >
+ <item row="0" col="0" collapsed="%material%" colspan="2" title="Material" type="expander">
+ <item for="material" type="value" />
+ </item>
+ <item col="2" row="0" for="molding" type="label" />
+ <item col="3" row="0" for="molding" type="value" />
+ <item col="0" row="1" for="condition" type="label" />
+ <item col="1" row="1" for="condition" type="value" />
+ <item col="2" row="1" for="added" type="label" />
+ <item col="3" row="1" for="added" type="value" />
+ <item col="0" row="2" for="edition" type="label" />
+ <item col="1" row="2" for="edition" type="value" />
+ <item col="2" row="2" for="collectiontype" type="label" />
+ <item col="3" row="2" for="collectiontype" type="value" />
+
+ <item col="0" row="3" for="serial" type="label" />
+ <item col="1" row="3" for="serial" type="value" />
+ <item col="2" row="3" for="serialnumber" type="label" />
+ <item col="3" row="3" for="serialnumber" type="value" />
+ <item col="0" row="4" for="designed" type="label" />
+ <item col="1" row="4" for="designed" type="value" />
+ <item col="2" row="4" for="madein" type="label" />
+ <item col="3" row="4" for="madein" type="value" />
+
+ <item col="0" row="5" for="box1" type="label" />
+ <item col="1" row="5" for="box1" type="value" />
+ <item col="2" row="5" for="box2" type="label" />
+ <item col="3" row="5" for="box2" type="value" />
+ <item col="0" row="6" for="containbox" type="label" />
+ <item col="1" row="6" for="containbox" type="value" />
+
+ <item col="0" row="7" for="rating2" type="label" />
+ <item col="1" row="7" for="rating2" type="value" align="center"/>
+ <item col="2" row="7" for="rating3" type="label" />
+ <item col="3" row="7" for="rating3" type="value" align="center"/>
+ <item col="0" row="8" for="acquisition" type="label" />
+ <item col="1" row="8" for="acquisition" type="value" />
+ <item col="2" row="8" for="location" type="label" />
+ <item col="3" row="8" for="location" type="value" />
+ <item col="0" row="9" for="buyprice" type="label" />
+ <item col="1" row="9" for="buyprice" type="value" />
+ <item col="2" row="9" for="estimate" type="label" />
+ <item col="3" row="9" for="estimate" type="value" />
+
+ <item col="0" row="10" for="comments2" type="label" />
+ <item col="0" row="11" colspan="4" for="comments2" expand="true" type="value" />
+
+ <item col="1" row="12" type="label" label="Diorama" align="center" />
+ <item col="0" row="13" for="decorationset" type="label" />
+ <item col="1" row="13" for="decorationset" type="value" />
+ <item col="0" row="14" for="characters" type="label" />
+ <item col="1" row="14" for="characters" type="value" />
+
+ <item col="3" row="12" type="label" label="CarFromFilm" align="center" />
+ <item col="2" row="13" for="filmcar" type="label" />
+ <item col="3" row="13" for="filmcar" type="value" />
+ <item col="2" row="14" for="filmpart" type="label" />
+ <item col="3" row="14" for="filmpart" type="value" />
+
+ <item col="1" row="15" type="label" label="VehiculeDetails" align="center" />
+ <item col="0" row="16" for="parts" type="label" />
+ <item col="1" row="16" for="parts" type="value" />
+ <item col="0" row="17" for="detailsparts" type="label" />
+ <item col="1" row="17" for="detailsparts" type="value" />
+ <item col="0" row="18" for="decorations" type="label" />
+ <item col="1" row="18" for="decorations" type="value" />
+ <item col="0" row="19" for="detailsdecorations" type="label" />
+ <item col="1" row="19" for="detailsdecorations" type="value" />
+ <item col="0" row="20" for="lwh" type="label" />
+ <item col="1" row="20" for="lwh" type="value" />
+ <item col="0" row="21" for="weight" type="label" />
+ <item col="1" row="21" for="weight" type="value" />
+ <item col="0" row="22" for="framecar" type="label" />
+ <item col="1" row="22" for="framecar" type="value" />
+ <item col="0" row="23" for="bodycar" type="label" />
+ <item col="1" row="23" for="bodycar" type="value" />
+ <item col="0" row="24" for="colormirror" type="label" />
+ <item col="1" row="24" for="colormirror" type="value" />
+ <item col="0" row="25" for="interior" type="label" />
+ <item col="1" row="25" for="interior" type="value" />
+ <item col="0" row="26" for="wheels" type="label" />
+ <item col="1" row="26" for="wheels" type="value" />
+ <item col="0" row="27" for="registrationnumber1" type="label" />
+ <item col="1" row="27" for="registrationnumber1" type="value" />
+ <item col="2" row="27" for="registrationnumber2" type="label" />
+ <item col="3" row="27" for="registrationnumber2" type="value" />
+ <item col="0" row="28" for="steeringwheel" type="label" />
+ <item col="1" row="28" for="steeringwheel" type="value" />
+
+ <item col="3" row="15" type="label" label="RacingCar" align="center" />
+ <item col="2" row="16" for="course" type="label" />
+ <item col="3" row="16" for="course" type="value" />
+ <item col="2" row="17" for="courselocation" type="label" />
+ <item col="3" row="17" for="courselocation" type="value" />
+ <item col="2" row="18" for="courseyear" type="label" />
+ <item col="3" row="18" for="courseyear" type="value" />
+ <item col="2" row="19" for="team" type="label" />
+ <item col="3" row="19" for="team" type="value" />
+ <item col="2" row="20" for="pilots" type="label" />
+ <item col="3" row="20" for="pilots" type="value" />
+ <item col="2" row="21" for="copilots" type="label" />
+ <item col="3" row="21" for="copilots" type="value" />
+ <item col="2" row="22" for="carnumber" type="label" />
+ <item col="3" row="22" for="carnumber" type="value" />
+ <item col="2" row="23" for="pub2" type="label" />
+ <item col="3" row="23" for="pub2" type="value" />
+ <item col="2" row="24" for="finishline" type="label" />
+ <item col="3" row="24" for="finishline" type="value" />
+
+ </item>
+
+ </item>
+
+<!-- Onglet "Catalogs" -->
+
+ <item expand="true" title="Catalogs" type="tab" value="bla">
+ <item type="line">
+ <item cols="1" rows="9" type="table" expand="true">
+ <item row="8" col="0" expand="true" type="label" label="OfficialPicture" align="center" />
+ <item row="7" col="0" expand="false" for="picture2" height="180" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item col="0" row="0" for="barcode" type="label" />
+ <item col="1" row="0" for="barcode" type="value" />
+ <item col="0" row="1" for="referencemirror" type="label" />
+ <item col="1" row="1" for="referencemirror" type="value" />
+ <item col="0" row="2" for="year3" type="label" />
+ <item col="1" row="2" for="year3" type="value" />
+ <item col="0" row="3" for="catalogyear" type="label" />
+ <item col="1" row="3" for="catalogyear" type="value" />
+ <item col="0" row="4" for="catalogedition" type="label" />
+ <item col="1" row="4" for="catalogedition" type="value" />
+ <item col="0" row="5" for="catalogpage" type="label" />
+ <item col="1" row="5" for="catalogpage" type="value" />
+ <item col="0" row="6" for="catalogprice" type="label" />
+ <item col="1" row="6" for="catalogprice" type="value" />
+ <item col="0" row="7" for="personalref" type="label" />
+ <item col="1" row="7" for="personalref" type="value" />
+ <item col="0" row="8" for="websitem" type="label" />
+ <item col="1" row="8" for="websitem" expand="default" type="value" />
+ <item col="0" row="9" for="websitec" type="label" />
+ <item col="1" row="9" for="websitec" expand="default" type="value" />
+ <item col="0" row="10" for="websiteo" type="label" />
+ <item col="1" row="10" for="websiteo" expand="default" type="value" />
+ </item>
+ <item cols="1" rows="4" type="table" expand="true">
+ <item row="1" expand="true" type="label" label="CatalogCoverPicture" align="center" />
+ <item row="3" expand="true" type="label" label="CatalogPagePicture" align="center" />
+ <item row="0" for="catalog1" expand="false" height="120" type="value" width="120" />
+ <item row="2" for="catalog2" expand="false" height="120" type="value" width="120" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item for="comments3" type="label" />
+ <item for="comments3" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Pictures" -->
+
+ <item expand="true" title="Pictures" type="tab" value="bla" >
+
+ <item align="left" for="othersdetails" type="label" />
+ <item expand="true" type="line">
+ <item for="othersdetails" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="3" rows="11" type="table" expand="true" >
+ <item row="1" col="0" expand="false" for="edge1" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="edge2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="2" expand="false" for="edge3" type="value" height="180" width="240" align="center" />
+ <item row="5" col="0" expand="false" for="edge4" type="value" height="180" width="240" align="center" />
+ <item row="5" col="1" expand="false" for="edge5" type="value" height="180" width="240" align="center" />
+ <item row="5" col="2" expand="false" for="edge6" type="value" height="180" width="240" align="center" />
+ <item row="9" col="0" expand="false" for="edge7" type="value" height="180" width="240" align="center" />
+ <item row="9" col="1" expand="false" for="edge8" type="value" height="180" width="240" align="center" />
+ <item row="9" col="2" expand="false" for="edge9" type="value" height="180" width="240" align="center" />
+
+ <item row="2" col="0" expand="true" type="label" label="AVG" align="center" />
+ <item row="2" col="1" expand="true" type="label" label="AV" align="center" />
+ <item row="2" col="2" expand="true" type="label" label="AVD" align="center" />
+ <item row="6" col="0" expand="true" type="label" label="G" align="center" />
+ <item row="6" col="1" expand="true" type="label" label="BOX" align="center" />
+ <item row="6" col="2" expand="true" type="label" label="D" align="center" />
+ <item row="10" col="0" expand="true" type="label" label="ARG" align="center" />
+ <item row="10" col="1" expand="true" type="label" label="AR" align="center" />
+ <item row="10" col="2" expand="true" type="label" label="ARD" align="center" />
+
+ </item>
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="2" type="table" expand="true" >
+ <item row="0" col="0" expand="false" for="top" type="value" height="180" width="240" align="center" />
+ <item row="0" col="1" expand="false" for="back" type="value" height="180" width="240" align="center" />
+ <item row="1" col="0" expand="true" type="label" label="Top1" align="center" />
+ <item row="1" col="1" expand="true" type="label" label="Back1" align="center" />
+
+ </item>
+ </item>
+
+ <item align="left" for="otherscomments" type="label" />
+ <item expand="true" type="line">
+ <item for="otherscomments" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelLending" -->
+
+ <item title="PanelLending" type="tab" value="lending">
+ <item type="label" label="LendingExplanation" align="center" />
+ <item rows="3" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" for="borrower" row="0" type="value" />
+ <item col="2" for="mailButton" row="0" type="special" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" for="lendDate" row="1" type="value" />
+ <item col="2" for="itemBackButton" row="1" type="special" />
+ </item>
+ <item align="left" for="borrowings" type="label" />
+ <item expand="true" type="line">
+ <item type="box" width="64" />
+ <item expand="true" for="borrowings" type="value" />
+ <item type="box" width="64" />
+ </item>
+ <item align="left" for="comments4" type="label" />
+ <item expand="true" type="line">
+ <item for="comments4" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "Realmodel" -->
+
+ <item expand="true" title="Realmodel" type="tab" value="bla" >
+
+ <item align="left" for="difference" type="label" />
+ <item expand="true" type="line">
+ <item for="difference" expand="true" type="value" />
+ </item>
+
+ <item type="line" >
+ <item cols="2" rows="5" type="table" expand="true" >
+ <item row="0" col="0" expand="true" type="label" label="Front2" align="center" />
+ <item row="0" col="1" expand="true" type="label" label="Back2" align="center" />
+ <item row="1" col="0" expand="false" for="front2" type="value" height="180" width="240" align="center" />
+ <item row="1" col="1" expand="false" for="back2" type="value" height="180" width="240" align="center" />
+ <item row="2" col="0" expand="true" colspan="2" type="label" label="Others" align="center" />
+ <item row="3" col="0" expand="false" for="edge10" type="value" height="180" width="240" align="center" />
+ <item row="3" col="1" expand="false" for="edge20" type="value" height="180" width="240" align="center" />
+ <item row="4" col="0" expand="false" for="edge30" type="value" height="180" width="240" align="center" />
+ <item row="4" col="1" expand="false" for="edge40" type="value" height="180" width="240" align="center" />
+ </item>
+ </item>
+
+ <item align="left" for="comments5" type="label" />
+ <item expand="true" type="line">
+ <item for="comments5" expand="true" type="value" />
+ </item>
+ </item>
+
+<!-- Onglet "PanelTags" -->
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" collapse="true"/>
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCmusics.gcm b/lib/gcstar/GCModels/GCmusics.gcm
new file mode 100644
index 0000000..acfaf8c
--- /dev/null
+++ b/lib/gcstar/GCModels/GCmusics.gcm
@@ -0,0 +1,250 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCmusics">
+ <lang>GCmusics</lang>
+
+ <options>
+ <defaults>
+ <image>cd_no.png</image>
+ <listImageWidth>125</listImageWidth>
+ <listImageHeight>120</listImageHeight>
+ </defaults>
+ <fields>
+ <cover>cover</cover>
+ <id>gcsautoid</id>
+ <play>playlist</play>
+ <title>title</title>
+ <url>web</url>
+ <search>
+ <field>unique</field>
+ <field>title</field>
+ <field>artist</field>
+ <field>label</field>
+ </search>
+ <results>
+ <field>title</field>
+ <field>artist</field>
+ <field>release</field>
+ </results>
+ <summary>
+ <field>artist</field>
+ <field>release</field>
+ <field>genre</field>
+ <field>format</field>
+ <field>borrower</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+
+ <overlay>
+ <image>cd.png</image>
+ <paddingLeft>44</paddingLeft>
+ <paddingRight>13</paddingRight>
+ <paddingTop>15</paddingTop>
+ <paddingBottom>4</paddingBottom>
+ </overlay>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ </options>
+
+ <groups>
+ <group id="main" label="General" />
+ <group id="details" label="Details" />
+ </groups>
+
+
+
+ <random></random>
+
+ <fields lending="true" tags="true">
+ <field value="gcsautoid" group="" imported="false" init="" label="" type="number" />
+ <field value="unique" group="main" init="" label="Unique" type="short text" />
+ <field value="title" group="main" init="NewItem" label="Title" type="short text" imported="true"/>
+ <field value="cover" default="view" group="main" init="" label="Cover" type="image" imported="true"/>
+ <field value="backpic" type="image" label="ContextImgBack" init="" group="main" linkedto="cover" imported="true"/>
+ <field value="artist" group="main" init="" label="Artist" type="short text" imported="true" />
+ <field value="running" group="main" init="0" label="Running" type="short text" imported="true" />
+ <field value="release" group="main" init="" label="Release" type="date" imported="true" />
+ <field value="label" group="main" init="" label="Label" type="history text" imported="true"/>
+ <field value="genre" group="main" history="true" init="" label="Genre" type="single list" imported="true" />
+ <field value="tracks" group="main" history="false" init="" label="Tracks" type="triple list" imported="true" label1="Number" label2="Track" label3="Time"/>
+ <field value="rating" group="details" init="0" label="PanelRating" max="10" type="number" displayas="graphical" />
+ <field value="ratingpress" group="details" init="0" label="PanelPressRating" max="10" type="number" displayas="graphical" imported="true" />
+ <field value="added" group="details" init="current" label="PanelAdded" type="date" />
+ <field value="location" group="details" init="" label="PanelLocation" type="history text" imported="false"/>
+ <field value="origin" group="details" init="" label="Origin" type="history text" imported="true" />
+ <field value="composer" group="details" init="" label="Composer" type="short text" imported="true" />
+ <field value="producer" group="details" init="" label="Producer" type="short text" imported="true" />
+ <field value="format" group="details" init="" label="Format" type="history text" imported="true" />
+ <field value="playlist" format="audio" group="details" init="" label="Playlist" type="file" />
+ <field value="comments" group="details" init="" label="Comments" type="long text" />
+ <field value="web" group="main" init="" label="Url" type="button" format="url" imported="true" />
+ </fields>
+
+ <filters>
+ <group label="Main">
+ <filter comparison="contain" field="unique" numeric="false" quick="false" />
+ <filter comparison="contain" field="title" numeric="false" quick="false" />
+ <filter comparison="contain" field="artist" numeric="false" quick="false" />
+ <filter comparison="contain" field="genre" numeric="false" quick="true" />
+ </group>
+ <group label="Details">
+ <filter comparison="contain" field="label" numeric="false" quick="false" />
+ </group>
+ </filters>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item for="unique" type="value" width="13" nomargin="true" />
+ <item expand="true" for="title" type="value" nomargin="true" />
+ <item type="special" for="searchButton" nomargin="true" />
+ <item type="special" for="refreshButton" nomargin="true" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line">
+ <item for="cover" height="150" type="value" width="150" />
+ <item cols="2" rows="4" type="table">
+ <item col="0" row="0" for="artist" type="label" />
+ <item col="1" row="0" for="artist" type="value" />
+ <item col="0" row="1" for="running" type="label" />
+ <item col="1" row="1" for="running" type="value" />
+ <item col="0" row="2" for="release" type="label" />
+ <item col="1" row="2" for="release" type="value" />
+ <item col="0" row="3" for="label" type="label" />
+ <item col="1" row="3" for="label" type="value" />
+ </item>
+ </item>
+ <item collapsed="%genre%" title="Genre" type="expander">
+ <item for="genre" type="value" />
+ </item>
+ <item type="box" expand="true">
+ <item expand="true" for="tracks" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Details" type="tab" value="bla">
+ <item cols="4" rows="6" expand="true" type="table">
+ <item col="0" row="0" type="label" for="rating"/>
+ <item col="1" row="0" type="value" for="rating"/>
+ <item col="2" row="0" type="label" for="ratingpress"/>
+ <item col="3" row="0" type="value" for="ratingpress"/>
+ <item col="0" row="1" type="label" for="location"/>
+ <item col="1" row="1" type="value" for="location"/>
+ <item col="2" row="1" type="label" for="added"/>
+ <item col="3" row="1" type="value" for="added"/>
+ <item col="0" row="2" for="origin" type="label" />
+ <item col="1" row="2" for="origin" type="value" />
+ <item col="2" row="2" for="format" type="label" />
+ <item col="3" row="2" for="format" type="value" />
+ <item col="0" row="3" type="label" for="composer"/>
+ <item col="1" row="3" type="value" for="composer"/>
+ <item col="2" row="3" type="label" for="producer"/>
+ <item col="3" row="3" type="value" for="producer"/>
+ <item col="0" row="4" for="playlist" type="label" />
+ <item type="line" col="1" row="4" colspan="3">
+ <item type="value" for="playlist" expand="true" nomargin="true"/>
+ <item type="launcher" for="playlist" nomargin="true"/>
+ <item type="extractor" for="playlist" nomargin="true"/>
+ </item>
+ <item col="0" row="5" type="label" for="comments"/>
+ <item col="1" row="5" colspan="3" type="value" for="comments" expand="true"/>
+ </item>
+ </item>
+ <item title="PanelLending" type="tab" value="lending">
+ <item rows="3" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" for="borrower" row="0" type="value" />
+ <item col="2" for="mailButton" row="0" type="special" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" for="lendDate" row="1" type="value" />
+ <item col="2" for="itemBackButton" row="1" type="special" />
+ </item>
+ <item align="left" for="borrowings" type="label" />
+ <item expand="true" type="line">
+ <item type="box" width="64" />
+ <item expand="true" for="borrowings" type="value" />
+ <item type="box" width="64" />
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item expand="true" for="web" type="value" />
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="title" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="100" expand="false" style="page"/>
+ <item type="value" for="artist" flat="true" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="100" expand="false" style="box">
+ <item type="value" for="format" style="box" nomargin="true"/>
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item style="page" type="box">
+ <item for="cover" type="value" width="200" height="200" />
+ </item>
+ <item expand="true" type="box">
+ <item cols="2" rows="5" expand="true" type="table">
+ <item col="0" row="0" for="running" type="label" />
+ <item col="1" row="0" colspan="1" expand="true" for="running" type="value" />
+ <item col="0" row="1" for="release" type="label" />
+ <item col="1" row="1" colspan="1" expand="true" for="release" type="value" />
+ <item col="0" row="2" for="label" type="label" />
+ <item col="1" row="2" colspan="1" expand="true" for="label" type="value" flat="true"/>
+ <item col="0" row="3" for="location" type="label" />
+ <item col="1" row="3" colspan="1" expand="true" for="location" type="value" flat="true"/>
+ <item col="0" row="4" for="origin" type="label" />
+ <item col="1" row="4" colspan="1" expand="true" for="origin" type="value"/>
+ </item>
+ </item>
+ </item>
+ <item type="table" rows="1" cols="2">
+ <item col="0" row="0" type="label" for="genre"/>
+ <item col="1" row="0" type="value" for="genre" flat="true" expand="true"/>
+ <item col="0" row="1" for="composer" type="label" />
+ <item col="1" row="1" colspan="1" expand="true" for="composer" type="value"/>
+ </item>
+ <item type="value" for="comments" height="5em"/>
+ <item type="expander" title="Tracks">
+ <item type="line" expand="true">
+ <item type="box" width="20" style="page"/>
+ <item type="value" for="tracks" expand="true" header="false"/>
+ <item type="box" width="20" style="page"/>
+ </item>
+ </item>
+ <item title="PanelLending" type="expander">
+ <item cols="2" rows="4" type="table">
+ <item col="0" for="borrower" row="0" type="label" />
+ <item col="1" expand="true" for="borrower" row="0" type="value" />
+ <item col="0" for="lendDate" row="1" type="label" />
+ <item col="1" expand="true" for="lendDate" row="1" type="value" />
+ <item col="0" colspan="2" expand="true" height="12" row="2" type="line" />
+ <item col="0" colspan="2" expand="true" row="2" type="line">
+ <item style="page" type="box" width="50" />
+ <item expand="true" for="borrowings" type="value" />
+ <item style="page" type="box" width="50" />
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCperiodicals.gcm b/lib/gcstar/GCModels/GCperiodicals.gcm
new file mode 100644
index 0000000..4a6541f
--- /dev/null
+++ b/lib/gcstar/GCModels/GCperiodicals.gcm
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCperiodicals">
+
+ <lang>GCperiodicals</lang>
+
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+ <fields>
+ <cover>gcsfield6</cover>
+ <id>gcsautoid</id>
+ <play></play>
+ <title>gcsfield1</title>
+ <url></url>
+ <search>
+ <field>gcsfield1</field>
+ </search>
+ <results>
+ <field>gcsfield1</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>subtle.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>11</paddingRight>
+ <paddingTop>12</paddingTop>
+ <paddingBottom>0</paddingBottom>
+ </overlay>
+ </options>
+
+ <fields lending="false" tags="false">
+ <field label="Title" group="main" init="NewItem" type="short text" value="gcsfield1" />
+ <field label="Periodical" group="main" init="" type="history text" value="gcsfield2" />
+ <field label="Number" group="main" init="" type="short text" value="gcsfield3" />
+ <field label="Date" group="main" init="" type="date" value="gcsfield4" />
+ <field label="Subject" flat="true" group="main" history="true" init="" type="single list" value="gcsfield5" />
+ <field default="view" label="Cover" group="main" init="" type="image" value="gcsfield6" />
+ <field label="Articles" history="false" group="main" init="" label1="Article" label2="Page" label3="Résumé" type="triple list" value="gcsfield7" />
+ <field label="" group="" imported="false" init="" type="number" value="gcsautoid" />
+ </fields>
+ <filters>
+ </filters>
+ <groups>
+ <group id="main" label="General" />
+ </groups>
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="gcsfield1" type="value" />
+ </item>
+ <item expand="true" type="box">
+ <item type="line">
+ <item for="gcsfield6" height="150" type="value" width="150" />
+ <item cols="2" type="frame">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield3" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield3" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield7" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield7" row="3" type="value" />
+ </item>
+ </item>
+ <item col="0" collapsed="%gcsfield5%" colspan="3" row="0" title="Subject" type="expander">
+ <item for="gcsfield5" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item col="0" colspan="3" expand="true" for="gcsfield1" row="0" style="header" type="value" />
+ </item>
+ <item type="line">
+ <item style="page" type="box" width="150">
+ <item for="gcsfield6" type="value" width="140" />
+ </item>
+ <item expand="true" type="box">
+ <item cols="2" expand="true" type="table">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield3" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield3" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield7" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield7" row="3" type="value" />
+ </item>
+ </item>
+ </item>
+ <item cols="2" expand="true" rows="1" type="table">
+ <item col="0" for="gcsfield5" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield5" row="0" type="value" />
+ </item>
+ </panel>
+ </panels>
+ <random></random>
+</collection>
diff --git a/lib/gcstar/GCModels/GCsmartcards.gcm b/lib/gcstar/GCModels/GCsmartcards.gcm
new file mode 100644
index 0000000..8af8c9c
--- /dev/null
+++ b/lib/gcstar/GCModels/GCsmartcards.gcm
@@ -0,0 +1,379 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCsmartcards">
+
+ <lang>GCsmartcards</lang>
+
+ <options>
+
+ <defaults>
+ <image>no_smartcards.png</image>
+ <groupby>country</groupby>
+ </defaults>
+
+ <fields>
+ <cover>cover</cover>
+ <id>gcsautoid</id>
+ <title>name</title>
+ </fields>
+
+ <overlay>
+ <!--<image>smartcards.png</image>-->
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>12</paddingRight>
+ <paddingTop>0</paddingTop>
+ <paddingBottom>12</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+
+ </options>
+
+ <groups>
+ <group id="Main" label="Main" />
+ <group id="PanelLending" label="PanelLending" />
+
+ </groups>
+
+ <filters>
+
+ <group label="Main">
+ <filter comparison="range" field="year1" labelselect="Intervalle" numeric="true" quick="true" />
+ <filter comparison="eq" field="exchange" numeric="false" quick="true" />
+ </group>
+
+ </filters>
+
+ <random></random>
+
+ <fields lending="true" tags="true">
+
+
+# Definition des Champs Communs
+
+ <field value="playlist" format="audio" group="" init="..\lib\gcstar\GCHelp\GCHelpSmartcards.pdf" label="Help" type="file" />
+ <field value="name" group="" init="%type1% (%year1%)" label="Name" type="formatted" />
+
+# Definition des Champs "Main"
+
+ <field value="gcsautoid" displayed="" group="" imported="false" init="" label="" type="number" />
+ <field value="rating1" group="Main" label="Rating1" max="10" init="0" type="number" displayas="graphical"/>
+
+ <field value="cover" default="view" group="Main" init="" label="Cover" type="image" imported="true"/>
+ <field value="backpic" type="image" label="ContextImgBack" init="" group="Main" linkedto="cover" imported="true"/>
+ <field value="chip" default="view" group="Main" init="" label="Chip" type="image" />
+ <field value="boxed" default="view" group="Main" init="" label="Box" type="image" />
+ <field value="chip1" flat="true" group="Main" history="true" init="" label="Chip1" type="history text" />
+
+ <field value="type1" flat="true" group="Main" history="true" init="" label="Type1" type="history text" />
+ <field value="type2" flat="true" group="Main" history="true" init="" label="Type2" type="history text" />
+ <field value="dimension" flat="true" group="Main" history="true" init="" label="Dimension" type="history text" />
+ <field value="location" flat="true" group="Main" history="true" init="" label="Location" type="history text" />
+ <field value="pressed" flat="true" group="Main" history="true" init="" label="Pressed" type="history text" />
+ <field value="title1" flat="true" group="Main" history="true" init="" label="Title1" type="short text" />
+ <field value="edition" flat="true" group="Main" history="true" init="" label="Edition" type="history text" />
+ <field value="serial" flat="true" group="Main" history="true" init="" label="Serial" type="short text" />
+ <field value="theme" flat="true" group="Main" history="true" init="" label="Theme" type="history text" />
+ <field value="serie" flat="true" group="Main" history="true" init="" label="Serie" type="history text" />
+
+ <field value="year1" group="Main" init="" label="Year1" type="date" />
+ <field value="year2" group="Main" init="" label="Year2" type="date" />
+
+ <field value="comments1" group="Main" init="" label="Comments1" type="long text" />
+ <field value="exchange" group="Main" init="0" label="Exchange" type="yesno" />
+ <field value="wanted" group="Main" init="0" label="Wanted" type="yesno" />
+ <field value="condition" group="Main" init="0" label="Condition" type="yesno" />
+
+ <field value="variety" group="Main" init="0" label="Variety" type="yesno" />
+ <field value="charge" group="Main" init="0" label="Charge" type="yesno" />
+
+ <field value="color" flat="true" group="Main" history="true" init="" label="Color" type="short text" />
+
+ <field value="weight" group="Main" init="" label="Weight" type="history text" />
+
+ <field value="country" group="Main" init="" label="Country" type="history text" />
+
+ <field value="unit" group="Main" label="Unit" history="true" type="history text" init="" />
+
+ <field value="added" group="Main" init="current" label="PanelAdded" type="date" />
+ <field value="acquisition" group="Main" init="" label="Acquisition" type="date" />
+
+ <field value="catalog3" group="Main" init="" label="Catalog3" type="short text" />
+
+ <field value="reference1" group="Main" init="" label="Reference1" type="short text" />
+ <field value="reference2" group="Main" init="" label="Reference2" type="short text" />
+ <field value="reference3" group="Main" init="" label="Reference3" type="short text" />
+
+ <field value="quotationnew10" group="Main" init="" label="Quotationnew10" type="short text" />
+ <field value="quotationnew20" group="Main" init="" label="Quotationnew20" type="short text" />
+ <field value="quotationnew30" group="Main" init="" label="Quotationnew30" type="short text" />
+
+ <field value="quotationold10" group="Main" init="" label="Quotationold10" type="short text" />
+ <field value="quotationold20" group="Main" init="" label="Quotationold20" type="short text" />
+ <field value="quotationold30" group="Main" init="" label="Quotationold30" type="short text" />
+
+
+ </fields>
+
+# Lecture / Ecriture
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item cols="5" rows="1" type="table" expand="true" >
+ <item col="0" row="1" expand="true" for="name" type="value" />
+ <item col="1" row="1" for="added" type="label" />
+ <item col="2" row="1" for="added" type="value" />
+
+ </item>
+ </item>
+ <item expand="true" type="notebook">
+
+# Onglet "Main"
+
+ <item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="3" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ <item row="0" col="2" expand="true" for="condition" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="TheSmartCard" align="center" />
+ <item row="8" col="0" expand="false" for="cover" height="160" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item row="1" col="0" for="country" type="label" />
+ <item row="1" col="1" for="country" expand="true" type="value" />
+ <item row="2" col="0" for="type1" type="label" />
+ <item row="2" col="1" for="type1" expand="true" type="value" />
+ <item row="3" col="0" for="unit" type="label" />
+ <item row="3" col="1" for="unit" expand="true" type="value" />
+ <item row="4" col="0" for="title1" type="label" />
+ <item row="4" col="1" for="title1" expand="true" type="value" />
+ <item row="5" col="0" for="serie" type="label" />
+ <item row="5" col="1" for="serie" expand="true" type="value" />
+ <item row="6" col="0" for="theme" type="label" />
+ <item row="6" col="1" for="theme" expand="true" type="value" />
+ <item row="7" col="0" for="edition" type="label" />
+ <item row="7" col="1" for="edition" expand="true" type="value" />
+ <item row="8" col="0" for="serial" type="label" />
+ <item row="8" col="1" for="serial" expand="true" type="value" />
+ <item row="9" col="0" for="year1" type="label" />
+ <item row="9" col="1" for="year1" expand="true" type="value" />
+ <item row="10" col="0" for="year2" type="label" />
+ <item row="10" col="1" for="year2" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="11" type="table" expand="true">
+ <item row="0" for="chip" expand="false" height="100" type="value" width="120" />
+ <item row="1" expand="true" type="label" label="Chip" align="center" />
+ <item row="2" for="boxed" expand="false" height="100" type="value" width="120" />
+ <item row="3" expand="true" type="label" label="Box" align="center" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="4" rows="4" type="table" expand="true">
+ <item row="0" col="0" for="pressed" type="label" />
+ <item row="0" col="1" for="pressed" expand="true" type="value" />
+ <item row="1" col="0" for="location" type="label" />
+ <item row="1" col="1" for="location" expand="true" type="value" />
+ <item row="0" col="2" for="dimension" type="label" />
+ <item row="0" col="3" for="dimension" expand="true" type="value" />
+ <item row="1" col="2" for="weight" type="label" />
+ <item row="1" col="3" for="weight" expand="true" type="value" />
+ <item row="2" col="0" for="type2" type="label" />
+ <item row="2" col="1" for="type2" expand="true" type="value" />
+ <item row="2" col="2" for="color" type="label" />
+ <item row="2" col="3" for="color" expand="true" type="value" />
+ <item row="3" col="0" for="acquisition" type="label" />
+ <item row="3" col="1" for="acquisition" expand="true" type="value" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="charge" type="value" />
+ <item row="0" col="1" expand="true" for="variety" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+
+ <item type="line">
+ <item cols="6" rows="4" type="table" expand="true">
+
+ <item row="0" col="0" align="center" label="Catalog0" type="label" />
+ <item row="0" col="1" align="center" label="Reference0" type="label" />
+ <item row="0" col="2" align="center" label="Quotationnew00" type="label" />
+ <item row="0" col="3" align="center" label="Quotationold00" type="label" />
+
+ <item row="1" col="0" align="center" label="Catalog1" type="label" />
+ <item row="1" col="1" for="reference1" type="value" />
+ <item row="1" col="2" for="quotationnew10" type="value" />
+ <item row="1" col="3" for="quotationold10" type="value" />
+
+ <item row="2" col="0" align="center" label="Catalog2" type="label" />
+ <item row="2" col="1" for="reference2" type="value" />
+ <item row="2" col="2" for="quotationnew20" type="value" />
+ <item row="2" col="3" for="quotationold20" type="value" />
+
+ <item row="3" col="0" align="center" for="catalog3" type="value" />
+ <item row="3" col="1" for="reference3" type="value" />
+ <item row="3" col="2" for="quotationnew30" type="value" />
+ <item row="3" col="3" for="quotationold30" type="value" />
+ </item>
+ </item>
+
+ </item>
+
+# Onglet "PanelTags"
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+######################################################## "Lecture Seule" ###################################################################
+
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+
+# Onglet "Main"
+
+<item expand="true" title="Main" type="tab" value="bla">
+ <item type="line" align="center" >
+ <item cols="3" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="exchange" type="value" />
+ <item row="0" col="1" expand="true" for="wanted" type="value" />
+ <item row="0" col="2" expand="true" for="condition" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="1" rows="11" type="table" expand="true">
+ <item col="0" for="rating1" row="2" type="label" align="center" />
+ <item col="0" for="rating1" expand="false" row="3" type="value" />
+ <item row="9" col="0" expand="true" type="label" label="TheSmartCard" align="center" />
+ <item row="8" col="0" expand="false" for="cover" height="160" type="value" width="240" />
+ </item>
+ <item cols="2" rows="11" type="table" expand="true">
+ <item row="1" col="0" for="country" type="label" />
+ <item row="1" col="1" for="country" expand="true" type="value" />
+ <item row="2" col="0" for="type1" type="label" />
+ <item row="2" col="1" for="type1" expand="true" type="value" />
+ <item row="3" col="0" for="unit" type="label" />
+ <item row="3" col="1" for="unit" expand="true" type="value" />
+ <item row="4" col="0" for="title1" type="label" />
+ <item row="4" col="1" for="title1" expand="true" type="value" />
+ <item row="5" col="0" for="serie" type="label" />
+ <item row="5" col="1" for="serie" expand="true" type="value" />
+ <item row="6" col="0" for="theme" type="label" />
+ <item row="6" col="1" for="theme" expand="true" type="value" />
+ <item row="7" col="0" for="edition" type="label" />
+ <item row="7" col="1" for="edition" expand="true" type="value" />
+ <item row="8" col="0" for="serial" type="label" />
+ <item row="8" col="1" for="serial" expand="true" type="value" />
+ <item row="9" col="0" for="year1" type="label" />
+ <item row="9" col="1" for="year1" expand="true" type="value" />
+ <item row="10" col="0" for="year2" type="label" />
+ <item row="10" col="1" for="year2" expand="true" type="value" />
+ </item>
+ <item cols="1" rows="11" type="table" expand="true">
+ <item row="0" for="chip" expand="false" height="100" type="value" width="120" />
+ <item row="1" expand="true" type="label" label="Chip" align="center" />
+ <item row="2" for="boxed" expand="false" height="100" type="value" width="120" />
+ <item row="3" expand="true" type="label" label="Box" align="center" />
+ </item>
+ </item>
+ <item type="line">
+ <item cols="4" rows="4" type="table" expand="true">
+ <item row="0" col="0" for="pressed" type="label" />
+ <item row="0" col="1" for="pressed" expand="true" type="value" />
+ <item row="1" col="0" for="location" type="label" />
+ <item row="1" col="1" for="location" expand="true" type="value" />
+ <item row="0" col="2" for="dimension" type="label" />
+ <item row="0" col="3" for="dimension" expand="true" type="value" />
+ <item row="1" col="2" for="weight" type="label" />
+ <item row="1" col="3" for="weight" expand="true" type="value" />
+ <item row="2" col="0" for="type2" type="label" />
+ <item row="2" col="1" for="type2" expand="true" type="value" />
+ <item row="2" col="2" for="color" type="label" />
+ <item row="2" col="3" for="color" expand="true" type="value" />
+ <item row="3" col="0" for="acquisition" type="label" />
+ <item row="3" col="1" for="acquisition" expand="true" type="value" />
+ </item>
+ </item>
+
+ <item type="box" expand="false">
+ <item cols="2" rows="1" type="table" expand="true" align="center" >
+ <item row="0" col="0" expand="true" for="charge" type="value" />
+ <item row="0" col="1" expand="true" for="variety" type="value" />
+ </item>
+ <item for="comments1" type="label" />
+ <item for="comments1" expand="true" type="value" />
+ </item>
+
+ <item type="line">
+ <item cols="6" rows="4" type="table" expand="true">
+
+ <item row="0" col="0" align="center" label="Catalog0" type="label" />
+ <item row="0" col="1" align="center" label="Reference0" type="label" />
+ <item row="0" col="2" align="center" label="Quotationnew00" type="label" />
+ <item row="0" col="3" align="center" label="Quotationold00" type="label" />
+
+ <item row="1" col="0" align="center" label="Catalog1" type="label" />
+ <item row="1" col="1" for="reference1" type="value" />
+ <item row="1" col="2" for="quotationnew10" type="value" />
+ <item row="1" col="3" for="quotationold10" type="value" />
+
+ <item row="2" col="0" align="center" label="Catalog2" type="label" />
+ <item row="2" col="1" for="reference2" type="value" />
+ <item row="2" col="2" for="quotationnew20" type="value" />
+ <item row="2" col="3" for="quotationold20" type="value" />
+
+ <item row="3" col="0" align="center" for="catalog3" type="value" />
+ <item row="3" col="1" for="reference3" type="value" />
+ <item row="3" col="2" for="quotationnew30" type="value" />
+ <item row="3" col="3" for="quotationold30" type="value" />
+ </item>
+ </item>
+
+ </item>
+
+# Onglet "PanelTags"
+
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" collapse="true"/>
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCModels/GCsoftware.gcm b/lib/gcstar/GCModels/GCsoftware.gcm
new file mode 100644
index 0000000..05b7268
--- /dev/null
+++ b/lib/gcstar/GCModels/GCsoftware.gcm
@@ -0,0 +1,438 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCsoftware">
+ <lang>GCsoftware</lang>
+
+ <options>
+
+ <defaults>
+ <image>no.png</image>
+ <listImageWidth>160</listImageWidth>
+ <listImageHeight>160</listImageHeight>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>boxpic</cover>
+ <url>web</url>
+ <play>executable</play>
+ <search>
+ <field>ean</field>
+ <field>name</field>
+ </search>
+ <results>
+ <field>name</field>
+ <field>platform</field>
+ <field>category</field>
+ <field>released</field>
+ </results>
+ </fields>
+
+ <overlay>
+ <image>dvd.png</image>
+ <paddingLeft>12</paddingLeft>
+ <paddingRight>16</paddingRight>
+ <paddingTop>16</paddingTop>
+ <paddingBottom>2</paddingBottom>
+ </overlay>
+
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+ <values id="licenses">
+ <value displayed=""></value>
+ <value displayed="Commercial">Commercial</value>
+ <value displayed="Shareware">Shareware</value>
+ <value displayed="Freeware">Freeware</value>
+ <value displayed="FreewareNoncommercial">Freeware (non-commercial use)</value>
+ <value displayed="Adware">Adware</value>
+ <value displayed="GNU GPL">GNU GPL</value>
+ <value displayed="MPL">MPL</value>
+ <value displayed="BSD">BSD</value>
+ <value displayed="OtherOpenSource">Other Open Source</value>
+ <value displayed="PublicDomain">Public Domain</value>
+ <value displayed="OtherLicense">Other</value>
+ </values>
+ <values id="">
+ <value displayed=""></value>
+ </values>
+ </options>
+
+
+ <groups>
+ <group id="info" label="General"/>
+ <group id="details" label="Details"/>
+ </groups>
+
+ <random>
+ </random>
+
+ <fields lending="true" tags="true">
+ <field value="id"
+ type="number"
+ label="Id"
+ init=""
+ group="info"
+ imported="false"/>
+ <field value="ean"
+ type="number"
+ label="Ean"
+ tip="Ean"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="name"
+ type="short text"
+ label="Name"
+ init="NewItem"
+ group="info"
+ imported="true"/>
+ <field value="boxpic"
+ type="image"
+ label="Box"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="backpic"
+ type="image"
+ label="ContextImgBack"
+ init=""
+ group="info"
+ linkedto="boxpic"
+ imported="true"/>
+ <field value="platform"
+ type="history text"
+ label="Platform"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="editor"
+ type="history text"
+ label="Editor"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="developer"
+ type="history text"
+ label="Developer"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="released"
+ type="date"
+ label="Released"
+ init=""
+ group="info"
+ imported="true"
+ sorttype="date"/>
+ <field value="license"
+ type="options"
+ label="License"
+ init=""
+ values="licenses"
+ separator="2"
+ group="info"
+ imported="true"/>
+ <field value="homepage"
+ type="file"
+ format="url"
+ label="Homepage"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="description"
+ type="long text"
+ label="Description"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="web"
+ type="button"
+ format="url"
+ label="Url"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="numberOfCopies"
+ type="number"
+ label="NumberOfCopies"
+ init="1"
+ min="0"
+ max="99999"
+ group="info"
+ imported="true"/>
+ <field value="price"
+ type="number"
+ label="Price"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="category"
+ type="single list"
+ label="Category"
+ init=""
+ group="info"
+ imported="true"/>
+ <field value="rating"
+ type="number"
+ displayas="graphical"
+ label="PanelRating"
+ init="0"
+ max="10"
+ group="details"
+ imported="false"/>
+ <field value="ratingpress"
+ type="number"
+ displayas="graphical"
+ label="PanelPressRating"
+ init="0"
+ min="0"
+ max="10"
+ group="info"
+ imported="true"/>
+ <field value="case"
+ type="yesno"
+ label="Case"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="manual"
+ type="yesno"
+ label="Manual"
+ init="1"
+ group="details"
+ imported="false"/>
+ <field value="added"
+ type="date"
+ label="PanelAdded"
+ init="current"
+ group="details"
+ imported="false"/>
+ <field value="location"
+ type="history text"
+ label="PanelLocation"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="executable"
+ type="file"
+ format="program"
+ label="Executable"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="screenshot1"
+ type="image"
+ label="Screenshot1"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="screenshot2"
+ type="image"
+ label="Screenshot2"
+ init=""
+ default="view"
+ group="details"
+ imported="true"/>
+ <field value="comments"
+ type="long text"
+ label="Comments"
+ init=""
+ group="details"
+ imported="false"/>
+ <field value="regInfo"
+ type="triple list"
+ label="RegInfo"
+ label1="RegistrationName"
+ label2="RegistrationNumber"
+ label3="RegistrationComments"
+ init=""
+ group="details"
+ history="false"
+ imported="true"/>
+ </fields>
+
+
+ <filters>
+ <group label="General">
+ <filter field="name" comparison="contain"/>
+ <filter field="platform" comparison="eq" quick="true"/>
+ <filter field="category" comparison="contain" quick="true"/>
+ </group>
+ <group label="Details">
+ <filter field="rating" comparison="ge" numeric="true" labelselect="FilterRatingSelect" quick="true"/>
+ </group>
+ </filters>
+
+
+ <panels>
+ <panel name="form" label="PanelForm" editable="true">
+ <item type="line">
+ <item type="value" for="ean" width="10" tip="" nomargin="true" />
+ <item type="value" for="name" expand="true" nomargin="true" />
+ </item>
+ <item type="notebook" expand="true">
+ <item type="tab" value="info" title="General">
+ <item type="line">
+ <item type="box">
+ <item type="value" for="boxpic" width="200" height="200"/>
+ </item>
+ <item type="table" title="Information" rows="9" cols="2">
+ <item type="label" for="platform" row="0" col="0"/>
+ <item type="value" for="platform" row="0" col="1" expand="true"/>
+ <item type="label" for="editor" row="1" col="0"/>
+ <item type="value" for="editor" row="1" col="1" />
+ <item type="label" for="developer" row="2" col="0"/>
+ <item type="value" for="developer" row="2" col="1" />
+ <item type="label" for="license" row="3" col="0"/>
+ <item type="value" for="license" row="3" col="1" expand="true"/>
+ <item type="label" for="released" row="4" col="0"/>
+ <item type="value" for="released" row="4" col="1" expand="true"/>
+ <item type="label" for="numberOfCopies" row="5" col="0"/>
+ <item type="value" for="numberOfCopies" row="5" col="1" />
+ <item type="label" for="price" row="6" col="0"/>
+ <item type="value" for="price" row="6" col="1" />
+ <item type="label" for="homepage" row="7" col="0"/>
+ <item type="line" row="7" col="1">
+ <item type="value" for="homepage" expand="true" nomargin="true"/>
+ <item type="launcher" for="homepage" nomargin="true"/>
+ </item>
+ <item type="expander" title="Category" collapsed="%category%" row="8" col="0" colspan="2">
+ <item type="value" for="category"/>
+ </item>
+ </item>
+ </item>
+ <item type="box" expand="true">
+ <item type="label" for="description"/>
+ <item type="value" for="description" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="details" title="Details">
+ <item type="table" rows="5" cols="4">
+ <item type="line" row="0" col="0" colspan="2">
+ <item type="value" for="case" />
+ <item type="value" for="manual" />
+ </item>
+ <item type="label" for="added" row="1" col="0"/>
+ <item type="value" for="added" row="1" col="1" expand="true" />
+ <item type="label" for="location" row="1" col="2"/>
+ <item type="value" for="location" row="1" col="3" expand="true" />
+ <item type="label" for="rating" row="2" col="0"/>
+ <item type="value" for="rating" row="2" col="1"/>
+ <item type="label" for="ratingpress" row="2" col="2"/>
+ <item type="value" for="ratingpress" row="2" col="3"/>
+ <item type="label" for="executable" row="3" col="0"/>
+ <item type="line" row="3" col="1" colspan="3">
+ <item type="value" for="executable" expand="true"/>
+ <item type="launcher" for="executable" nomargin="true"/>
+ </item>
+
+ </item>
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" label="Screenshots" row="0" col="0" colspan="2"/>
+ <item type="value" for="screenshot1" row="1" col="0" width="200" height="150"/>
+ <item type="value" for="screenshot2" row="1" col="1" width="200" height="150"/>
+ <item type="label" for="comments" row="2" col="0" colspan="2"/>
+ <item type="value" for="comments" row="3" col="0" colspan="2" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="registration" title="RegistrationInfo">
+ <item type="box" nomargin="true">
+ <item type="label" for="regInfo"/>
+ <item type="value" for="regInfo" expand="true"/>
+ </item>
+ </item>
+ <item type="tab" value="lending" title="PanelLending">
+ <item type="table" rows="3" cols="3">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1"/>
+ <item type="special" for="mailButton" row="0" col="2"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1"/>
+ <item type="special" for="itemBackButton" row="1" col="2"/>
+ </item>
+ <item type="label" for="borrowings" align="left"/>
+ <item type="line" expand="true">
+ <item type="box" width="64"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="64"/>
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line" homogeneous="true">
+ <item type="value" for="web" expand="true"/>
+ <item type="special" for="deleteButton" expand="true"/>
+ </item>
+ </panel>
+
+ <panel name="readonly" label="PanelReadOnly" editable="false">
+ <item type="table" rows="2" cols="3">
+ <item type="value" for="name" style="header" row="0" col="0" colspan="3" expand="true"/>
+ <item type="box" row="1" col="0" width="150" expand="false" style="page"/>
+ <item type="value" for="platform" style="subheader" row="1" col="1" expand="true"/>
+ <item type="box" row="1" col="2" width="150" expand="false" style="box">
+ <item type="formatted" name="fullrating" value="%rating%/10" style="box" nomargin="true"/>
+ <item type="value" for="editor" style="box" nomargin="true"/>
+ <item type="value" for="homepage" style="box" nomargin="true"/>
+ </item>
+ </item>
+ <item type="line">
+ <item type="box" width="150" style="page">
+ <item type="value" for="boxpic" width="140"/>
+ </item>
+ <item type="box" expand="true">
+ <item type="table" rows="7" cols="2" expand="true">
+ <item type="label" for="category" row="0" col="0"/>
+ <item type="value" for="category" flat="true" row="0" col="1" expand="true"/>
+ <item type="label" for="developer" row="1" col="0"/>
+ <item type="value" for="developer" row="1" col="1" expand="true"/>
+ <item type="label" for="released" row="2" col="0"/>
+ <item type="value" for="released" row="2" col="1" expand="true"/>
+ <item type="label" for="license" row="3" col="0"/>
+ <item type="value" for="license" row="3" col="1" expand="true"/>
+ <item type="label" for="numberOfCopies" row="4" col="0"/>
+ <item type="value" for="numberOfCopies" row="4" col="1" expand="true"/>
+ <item type="label" for="price" row="5" col="0"/>
+ <item type="value" for="price" row="5" col="1" expand="true"/>
+ <item type="label" for="location" row="6" col="0"/>
+ <item type="value" for="location" row="6" col="1" expand="true"/>
+ </item>
+ </item>
+ </item>
+ <item type="value" for="description" height="6em"/>
+ <item type="expander" title="PanelLending">
+ <item type="table" rows="4" cols="2" expand="true">
+ <item type="label" for="borrower" row="0" col="0"/>
+ <item type="value" for="borrower" row="0" col="1" expand="true"/>
+ <item type="label" for="lendDate" row="1" col="0"/>
+ <item type="value" for="lendDate" row="1" col="1" expand="true"/>
+ <item type="line" row="2" col="0" colspan="2" height="12" expand="true"/>
+ <item type="line" row="3" col="0" colspan="2" expand="true">
+ <item type="box" width="50" style="page"/>
+ <item type="value" for="borrowings" expand="true"/>
+ <item type="box" width="50" style="page"/>
+ </item>
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ <item type="table" rows="1" cols="2" expand="true">
+ <item type="value" for="screenshot1" row="0" col="0" width="200" height="150" expand="true"/>
+ <item type="value" for="screenshot2" row="0" col="1" width="200" height="150" expand="true"/>
+ </item>
+ </panel>
+ </panels>
+
+</collection>
diff --git a/lib/gcstar/GCModels/GCstamps.gcm b/lib/gcstar/GCModels/GCstamps.gcm
new file mode 100644
index 0000000..5c5c4fe
--- /dev/null
+++ b/lib/gcstar/GCModels/GCstamps.gcm
@@ -0,0 +1,702 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd" name="GCstamps">
+
+ <lang>GCstamps</lang>
+
+ <options>
+ <defaults>
+ <image>no_stamp.png</image>
+ <groupby>year</groupby>
+ </defaults>
+ <fields cover="gcsfield38" id="gcsautoid" play="" title="gcsfield1">
+ <results></results>
+ </fields>
+ <overlay>
+ <image>canevas-timbre.png</image>
+ <paddingLeft>56</paddingLeft>
+ <paddingRight>77</paddingRight>
+ <paddingTop>55</paddingTop>
+ <paddingBottom>76</paddingBottom>
+ </overlay>
+ <values id="gcsfield12" />
+ <values id="types">
+ <value displayed="">0</value>
+ <value displayed="AirMail">1</value>
+ <value displayed="MilitaryStamp">2</value>
+ <value displayed="Official">3</value>
+ <value displayed="PostageDue">4</value>
+ <value displayed="Regular">5</value>
+ <value displayed="Revenue">6</value>
+ <value displayed="SpecialDelivery">7</value>
+ <value displayed="StrikeStamp">8</value>
+ <value displayed="TelegraphStamp">9</value>
+ <value displayed="WarStamp">10</value>
+ <value displayed="WarTaxStamp">11</value>
+ </values>
+ <values id="formats">
+ <value displayed="">0</value>
+ <value displayed="Booklet">1</value>
+ <value displayed="BookletPane">2</value>
+ <value displayed="Card">3</value>
+ <value displayed="Coil">4</value>
+ <value displayed="Envelop">5</value>
+ <value displayed="FirstDayCover">6</value>
+ <value displayed="Sheet">7</value>
+ <value displayed="Single">8</value>
+ </values>
+ <values id="printingvariety">
+ <value displayed="">0</value>
+ <value displayed="Heliogravure">1</value>
+ <value displayed="Lithography">2</value>
+ <value displayed="Offset">3</value>
+ <value displayed="Photogravure">4</value>
+ <value displayed="RecessPrinting">5</value>
+ <value displayed="Typography">6</value>
+ </values>
+ <values id="gums">
+ <value displayed="">0</value>
+ <value displayed="OriginalGum">1</value>
+ <value displayed="Ungummed">2</value>
+ <value displayed="Regummed">3</value>
+ </values>
+ <values id="papers">
+ <value displayed="">0</value>
+ <value displayed="Chalky">1</value>
+ <value displayed="ChinaPaper">2</value>
+ <value displayed="Coarsed">3</value>
+ <value displayed="Glossy">4</value>
+ <value displayed="Granite">5</value>
+ <value displayed="Laid">6</value>
+ <value displayed="Manila">7</value>
+ <value displayed="Native">8</value>
+ <value displayed="Pelure">9</value>
+ <value displayed="Quadrille">10</value>
+ <value displayed="Ribbed">11</value>
+ <value displayed="Rice">12</value>
+ <value displayed="Silk">13</value>
+ <value displayed="Smoothed">14</value>
+ <value displayed="Thick">15</value>
+ <value displayed="Thin">16</value>
+ <value displayed="Wove">17</value>
+ </values>
+ <values id="perforations">
+ <value displayed="">0</value>
+ <value displayed="CoarsedPerforation">1</value>
+ <value displayed="CombPerforation">2</value>
+ <value displayed="CompoundPerforation">3</value>
+ <value displayed="DamagedPerforation">4</value>
+ <value displayed="DoublePerforation">5</value>
+ <value displayed="HarrowPerforation">6</value>
+ <value displayed="LinePerforation">7</value>
+ <value displayed="NoPerforation">8</value>
+ </values>
+ <values id="cancellations">
+ <value displayed="">0</value>
+ <value displayed="CancellationToOrder">1</value>
+ <value displayed="FancyCancellation">2</value>
+ <value displayed="FirstDayCancellation">3</value>
+ <value displayed="NumeralCancellation">4</value>
+ <value displayed="PenMarked">5</value>
+ <value displayed="RailroadCancellation">6</value>
+ <value displayed="SpecialCancellation">7</value>
+ </values>
+ <values id="grades">
+ <value displayed="">0</value>
+ <value displayed="Superb">1</value>
+ <value displayed="ExtraFine">2</value>
+ <value displayed="VeryFine">3</value>
+ <value displayed="FineVeryFine">4</value>
+ <value displayed="Fine">5</value>
+ <value displayed="Average">6</value>
+ <value displayed="Poor">7</value>
+ </values>
+ <values id="status">
+ <value displayed="">0</value>
+ <value displayed="Owned">1</value>
+ <value displayed="Ordered">2</value>
+ <value displayed="Sold">3</value>
+ <value displayed="ToSell">4</value>
+ <value displayed="Wanted">5</value>
+ </values>
+ <values id="cancellation_condition">
+ <value displayed="">0</value>
+ <value displayed="LightCancellation">1</value>
+ <value displayed="HeavyCancellation">2</value>
+ <value displayed="ModerateCancellation">3</value>
+ </values>
+ <values id="perforation_condition">
+ <value displayed="">0</value>
+ <value displayed="Perfect">1</value>
+ <value displayed="VeryNice">2</value>
+ <value displayed="Nice">3</value>
+ <value displayed="Average">4</value>
+ <value displayed="Incomplete">5</value>
+ </values>
+ <values id="gum_condition">
+ <value displayed="">0</value>
+ <value displayed="MintNeverHinged">1</value>
+ <value displayed="MintLightHinged">2</value>
+ <value displayed="HingedRemnant">3</value>
+ <value displayed="HeavilyHinged">4</value>
+ <value displayed="LargePartOriginalGum">5</value>
+ <value displayed="SmallPartOriginalGum">6</value>
+ <value displayed="NoGum">7</value>
+ </values>
+ </options>
+
+
+ <fields lending="false" tags="false">
+ <field displayed="Name"
+ group="General"
+ init="NewItem"
+ label="Name"
+ type="short text"
+ value="gcsfield1" />
+ <field displayed="Country"
+ group="General"
+ init=""
+ label="Country"
+ type="history text"
+ value="gcsfield2" />
+ <field displayas="text"
+ displayed="Year"
+ group="General"
+ init=""
+ label="Year"
+ max=""
+ min=""
+ step=""
+ type="number"
+ value="gcsfield42" />
+ <field displayed="Catalog"
+ group="General"
+ init=""
+ label="Catalog"
+ type="options"
+ value="gcsfield4"
+ values="Anfils, Austria Netto Katalog, Brusden-White, Catalogue of USSR postage stamps, CEI, Cérès, Compréhensive Colour Catalogue of Australian Stamps, Dallay, Domfil, Facit catalog, Fischer catalog, ISC catalog, Isfalia, Lipsia, Ma, Michel catalog, Minkus, Norgeskatalogen, Philex, Pofis catalogue, Pulko, Sakura, Sassone, Scott catalogue, Stanley Gibbons, Unificato, Yang, Yvert et Tellier, Zumstein" />
+ <field displayed="Number"
+ group="General"
+ init=""
+ label="Number"
+ type="short text"
+ value="gcsfield5" />
+ <field displayed="Topic"
+ group="General"
+ init=""
+ label="Topic"
+ type="short text"
+ value="gcsfield15" />
+ <field displayed="Serie"
+ group="General"
+ init=""
+ label="Serie"
+ type="short text"
+ value="gcsfield17" />
+ <field displayed="Designer"
+ group="General" init=""
+ label="Designer"
+ type="short text"
+ value="gcsfield20" />
+ <field displayed="Engraver"
+ group="General"
+ init=""
+ label="Engraver"
+ type="short text"
+ value="gcsfield21" />
+ <field displayed="Type"
+ group="General" init=""
+ label="Type"
+ type="options"
+ value="gcsfield6"
+ values="types" />
+ <field displayed="Format"
+ group="General"
+ init=""
+ label="Format"
+ type="options"
+ value="gcsfield7"
+ values="formats" />
+
+ <field displayed="Description"
+ group="General"
+ init=""
+ label="Description"
+ type="long text"
+ value="gcsfield8" />
+ <field displayed="Color"
+ group="Detail"
+ init=""
+ label="Color"
+ type="short text"
+ value="gcsfield11" />
+ <field displayed="Gum"
+ group="Detail"
+ init=""
+ label="Gum"
+ type="options"
+ value="gcsfield10"
+ values="gums" />
+ <field displayed="Paper"
+ group="Detail"
+ init=""
+ label="Paper"
+ type="options"
+ value="gcsfield12"
+ values="papers" />
+ <field displayed="Perforation"
+ group="Detail"
+ init=""
+ label="Perforation"
+ type="options"
+ value="gcsfield28"
+ values="perforations" />
+ <field displayed="PerforationSize"
+ group="Detail"
+ init=""
+ label="PerforationSize"
+ type="history text"
+ value="gcsfield29" />
+ <field displayed="CancellationType"
+ group="Detail"
+ init=""
+ label="CancellationType"
+ type="options"
+ value="gcsfield43"
+ values="cancellations" />
+ <field displayed="Issue"
+ group="Detail"
+ init=""
+ label="Issue"
+ type="short text"
+ value="gcsfield80" />
+
+ <field displayed="IssueDate"
+ group="Detail"
+ init=""
+ label="IssueDate"
+ type="date"
+ value="gcsfield81" />
+
+ <field displayed="PrintingVariety"
+ group="Detail"
+ init=""
+ label="PrintingVariety"
+ type="options"
+ value="gcsfield83"
+ values="printingvariety" />
+ <field displayed="EndOfIssue"
+ group="Detail"
+ init=""
+ label="EndOfIssue"
+ type="date"
+ value="gcsfield82" />
+ <field displayed="Comments"
+ group="Detail"
+ init=""
+ label="Comments"
+ type="long text"
+ value="gcsfield41" />
+ <field displayed="Grade"
+ group="Condition"
+ init=""
+ label="Grade"
+ type="options"
+ value="gcsfield23"
+ values="grades" />
+ <field displayed="Status"
+ group="Value"
+ init=""
+ label="Status"
+ type="options"
+ value="gcsfield16"
+ values="status" />
+ <field displayed="Adjusted"
+ group="Condition"
+ init=""
+ label="Adjusted"
+ type="yesno"
+ value="gcsfield22" />
+ <field displayed="Cancellation"
+ group="Condition"
+ init=""
+ label="Cancellation"
+ type="yesno"
+ value="gcsfield13" />
+ <field displayed="CancellationCondition"
+ group="Condition"
+ init=""
+ label="CancellationCondition"
+ type="options"
+ value="gcsfield27"
+ values="cancellation_condition" />
+ <field displayed="GumCondition"
+ group="Condition"
+ init=""
+ label="GumCondition"
+ type="options"
+ value="gcsfield25"
+ values="gum_condition" />
+ <field displayed="PerforationCondition"
+ group="Condition"
+ init=""
+ label="PerforationCondition"
+ type="options"
+ value="gcsfield14"
+ values="perforation_condition" />
+ <field displayed="ConditionNotes"
+ group="Condition"
+ init=""
+ label="ConditionNotes"
+ type="long text"
+ value="gcsfield49" />
+ <field displayed="Error"
+ group="Condition"
+ init=""
+ label="Error"
+ type="yesno"
+ value="gcsfield44" />
+ <field displayed="Error notes"
+ group="Condition"
+ init=""
+ label="ErrorNotes"
+ type="long text"
+ value="gcsfield45" />
+ <field displayed="FaceValue"
+ group="Value"
+ init="0 euros"
+ label="FaceValue"
+ type="short text"
+ value="gcsfield35" />
+ <field displayed="MintValue"
+ group="Value"
+ init="0 euros"
+ label="MintValue"
+ type="short text"
+ value="gcsfield36" />
+ <field displayed="UsedValue"
+ group="Value"
+ init="0 euros"
+ label="UsedValue"
+ type="short text"
+ value="gcsfield46" />
+ <field displayed="PurchasedDate"
+ group="Value"
+ init=""
+ label="PurchasedDate"
+ type="date"
+ value="gcsfield33" />
+ <field displayas="text"
+ displayed="Quantity"
+ group="Value"
+ init=""
+ label="Quantity"
+ max=""
+ min=""
+ step=""
+ type="number"
+ value="gcsfield34" />
+ <field displayed="History"
+ group="Notes"
+ init=""
+ label="History"
+ type="long text"
+ value="gcsfield31" />
+ <field displayed="Comments"
+ group="Notes"
+ init=""
+ label="Comments"
+ type="long text"
+ value="gcsfield32" />
+ <field default="view"
+ displayed="Picture1"
+ group="Views"
+ init=""
+ label="Picture1"
+ type="image"
+ value="gcsfield38" />
+ <field default="view"
+ displayed="Picture2"
+ group="Views"
+ init=""
+ label="Picture2"
+ type="image"
+ value="gcsfield39" />
+ <field default="view"
+ displayed="Picture3"
+ group="Views"
+ init=""
+ label="Picture3"
+ type="image"
+ value="gcsfield47" />
+ <field default="view"
+ displayed=""
+ group="General"
+ init=""
+ label=""
+ type="image"
+ value="gcsfield48" />
+ <field displayed=""
+ group=""
+ imported="false"
+ init=""
+ label=""
+ type="number"
+ value="gcsautoid" />
+ </fields>
+ <filters>
+ <group label="General">
+ <filter comparison="contain" field="gcsfield1" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield2" numeric="false" quick="false" />
+ <filter comparison="eq" field="gcsfield42" labelselect="=" numeric="true" quick="false" />
+ <filter comparison="contain" field="gcsfield15" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield20" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield21" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield6" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfield7" numeric="false" quick="false" />
+ <filter comparison="contain" field="gcsfiled83" numeric="false" quick="false" />
+ </group>
+ <group label="Condition">
+ <filter comparison="contain" field="gcsfield13" numeric="false" quick="false" />
+ </group>
+ </filters>
+ <groups>
+ <group id="General" label="General" />
+ <group id="Detail" label="Detail" />
+ <group id="Condition" label="Condition" />
+ <group id="Value" label="Value" />
+ <group id="Notes" label="Notes" />
+ <group id="Views" label="Views" />
+ </groups>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="gcsfield1" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="General" type="tab" value="bla">
+ <item type="line">
+ <item for="gcsfield38" height="150" type="value" width="150" />
+ <item cols="2" type="frame">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield42" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield42" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield5" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" for="gcsfield5" row="3" type="value" />
+ </item>
+ </item>
+ <item cols="2" rows="6" type="table">
+ <item col="0" for="gcsfield15" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield15" row="0" type="value" />
+ <item col="2" for="gcsfield17" row="0" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield17" row="0" type="value" />
+ <item col="0" for="gcsfield20" row="1" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield20" row="1" type="value" />
+ <item col="0" for="gcsfield21" row="2" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield21" row="2" type="value" />
+ <item col="0" for="gcsfield6" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield6" row="3" type="value" />
+ <item col="0" for="gcsfield7" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield7" row="4" type="value" />
+ <item col="0" for="gcsfield8" row="5" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield8" row="5" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Detail" type="tab" value="bla">
+ <item cols="4" expand="true" rows="7" type="table">
+ <item col="0" for="gcsfield11" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield11" row="0" type="value" />
+ <item col="2" for="gcsfield83" row="0" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield83" row="0" type="value" />
+ <item col="0" for="gcsfield10" row="1" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield10" row="1" type="value" />
+ <item col="2" for="gcsfield81" row="1" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield81" row="1" type="value" />
+ <item col="0" for="gcsfield12" row="2" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield12" row="2" type="value" />
+ <item col="2" for="gcsfield82" row="2" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield82" row="2" type="value" />
+ <item col="0" for="gcsfield28" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield28" row="3" type="value" />
+ <item col="2" for="gcsfield80" row="3" type="label" />
+ <item col="3" colspan="1" expand="default" for="gcsfield80" row="3" type="value" />
+ <item col="0" for="gcsfield29" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield29" row="4" type="value" />
+ <item col="0" for="gcsfield43" row="5" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield43" row="5" type="value" />
+ <item col="0" for="gcsfield41" row="6" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield41" row="6" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Condition" type="tab" value="bla">
+ <item cols="4" expand="true" rows="9" type="table">
+ <item col="0" for="gcsfield23" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield23" row="0" type="value" />
+ <item col="0" colspan="2" expand="default" for="gcsfield22" row="1" type="value" />
+ <item col="0" colspan="2" expand="default" for="gcsfield13" row="2" type="value" />
+ <item col="0" for="gcsfield27" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield27" row="3" type="value" />
+ <item col="0" for="gcsfield25" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield25" row="4" type="value" />
+ <item col="0" for="gcsfield14" row="5" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield14" row="5" type="value" />
+ <item col="0" for="gcsfield49" row="6" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield49" row="6" type="value" />
+ <item col="0" colspan="2" expand="default" for="gcsfield44" row="7" type="value" />
+ <item col="0" for="gcsfield45" row="8" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield45" row="8" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Value" type="tab" value="bla">
+ <item cols="4" expand="true" rows="6" type="table">
+ <item col="0" for="gcsfield16" row="0" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield16" row="0" type="value" />
+ <item col="0" for="gcsfield35" row="1" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield35" row="1" type="value" />
+ <item col="0" for="gcsfield36" row="2" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield36" row="2" type="value" />
+ <item col="0" for="gcsfield46" row="3" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield46" row="3" type="value" />
+ <item col="0" for="gcsfield33" row="4" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield33" row="4" type="value" />
+ <item col="0" for="gcsfield34" row="5" type="label" />
+ <item col="1" colspan="1" expand="default" for="gcsfield34" row="5" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Notes" type="tab" value="bla">
+ <item cols="4" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield31" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield31" row="0" type="value" />
+ <item col="0" for="gcsfield32" row="1" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield32" row="1" type="value" />
+ </item>
+ </item>
+ <item expand="true" title="Views" type="tab" value="bla">
+ <item cols="4" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield39" row="0" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield39" row="0" type="value" />
+ <item col="0" for="gcsfield47" row="1" type="label" />
+ <item col="1" colspan="3" expand="true" for="gcsfield47" row="1" type="value" />
+ </item>
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item col="0" colspan="3" expand="true" for="gcsfield1" row="0" style="header" type="value" />
+ </item>
+ <item type="line">
+ <item style="page" type="box" width="150">
+ <item for="gcsfield38" type="value" width="140" />
+ </item>
+ <item expand="true" type="box">
+ <item cols="2" expand="true" type="table">
+ <item col="0" for="gcsfield2" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield2" row="0" type="value" />
+ <item col="0" for="gcsfield42" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield42" row="1" type="value" />
+ <item col="0" for="gcsfield4" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield4" row="2" type="value" />
+ <item col="0" for="gcsfield5" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield5" row="3" type="value" />
+ </item>
+ </item>
+ </item>
+ <item cols="2" expand="true" rows="6" type="table">
+ <item col="0" for="gcsfield15" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield15" row="0" type="value" />
+ <item col="0" for="gcsfield20" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield20" row="1" type="value" />
+ <item col="0" for="gcsfield21" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield21" row="2" type="value" />
+ <item col="0" for="gcsfield6" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield6" row="3" type="value" />
+ <item col="0" for="gcsfield7" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield7" row="4" type="value" />
+ <item col="0" for="gcsfield8" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield8" row="5" type="value" />
+ </item>
+ <item title="Detail" type="expander">
+ <item cols="2" expand="true" rows="7" type="table">
+ <item col="0" for="gcsfield11" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield11" row="0" type="value" />
+ <item col="0" for="gcsfield10" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield10" row="1" type="value" />
+ <item col="0" for="gcsfield12" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield12" row="2" type="value" />
+ <item col="0" for="gcsfield28" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield28" row="3" type="value" />
+ <item col="0" for="gcsfield29" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield29" row="4" type="value" />
+ <item col="0" for="gcsfield43" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield43" row="5" type="value" />
+ <item col="0" for="gcsfield41" row="6" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield41" row="6" type="value" />
+ </item>
+ </item>
+ <item title="Condition" type="expander">
+ <item cols="2" expand="true" rows="9" type="table">
+ <item col="0" for="gcsfield23" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield23" row="0" type="value" />
+ <item col="0" for="gcsfield22" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield22" row="1" type="value" />
+ <item col="0" for="gcsfield13" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield13" row="2" type="value" />
+ <item col="0" for="gcsfield27" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield27" row="3" type="value" />
+ <item col="0" for="gcsfield25" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield25" row="4" type="value" />
+ <item col="0" for="gcsfield14" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield14" row="5" type="value" />
+ <item col="0" for="gcsfield49" row="6" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield49" row="6" type="value" />
+ <item col="0" for="gcsfield44" row="7" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield44" row="7" type="value" />
+ <item col="0" for="gcsfield45" row="8" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield45" row="8" type="value" />
+ </item>
+ </item>
+ <item title="Value" type="expander">
+ <item cols="2" expand="true" rows="6" type="table">
+ <item col="0" for="gcsfield16" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield16" row="0" type="value" />
+ <item col="0" for="gcsfield35" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield35" row="1" type="value" />
+ <item col="0" for="gcsfield36" row="2" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield36" row="2" type="value" />
+ <item col="0" for="gcsfield46" row="3" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield46" row="3" type="value" />
+ <item col="0" for="gcsfield33" row="4" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield33" row="4" type="value" />
+ <item col="0" for="gcsfield34" row="5" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield34" row="5" type="value" />
+ </item>
+ </item>
+ <item title="Notes" type="expander">
+ <item cols="2" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield31" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield31" row="0" type="value" />
+ <item col="0" for="gcsfield32" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield32" row="1" type="value" />
+ </item>
+ </item>
+ <item title="Views" type="expander">
+ <item cols="2" expand="true" rows="2" type="table">
+ <item col="0" for="gcsfield39" row="0" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield39" row="0" type="value" />
+ <item col="0" for="gcsfield47" row="1" type="label" />
+ <item col="1" colspan="1" expand="true" flat="false" for="gcsfield47" row="1" type="value" />
+ </item>
+ </item>
+ </panel>
+ </panels>
+ <random></random>
+</collection>
diff --git a/lib/gcstar/GCModels/GCwines.gcm b/lib/gcstar/GCModels/GCwines.gcm
new file mode 100644
index 0000000..30f433f
--- /dev/null
+++ b/lib/gcstar/GCModels/GCwines.gcm
@@ -0,0 +1,356 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2007 Yves Martin -->
+<collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:noNamespaceSchemaLocation="http://www.gcstar.org/schemas/gcm-revision4.xsd"
+name="GCwines">
+ <lang>GCwines</lang>
+
+ <options>
+ <defaults>
+ <image>no.png</image>
+ </defaults>
+
+ <fields>
+ <id>id</id>
+ <title>name</title>
+ <cover>bottlelabel</cover>
+ <url>website</url>
+ <results></results>
+ <summary>
+ <field>vineyard</field>
+ <field>vintage</field>
+ <field>type</field>
+ <field>tags</field>
+ </summary>
+ </fields>
+
+ <values id="tasted">
+ <value displayed="TastedNo">0</value>
+ <value displayed="TastedYes">1</value>
+ </values>
+ <values id="favouriteYesno">
+ <value displayed="">0</value>
+ <value displayed="PanelFavourite">1</value>
+ </values>
+
+ </options>
+
+ <groups>
+ <group id="Main" label="General" />
+ <group id="Details" label="Details" />
+ <group id="Tasting" label="Tasting" />
+ </groups>
+
+ <random>
+ <filter field="quantity" comparison="gt" numeric="true" value="0"/>
+ </random>
+
+ <fields lending="false" tags="true">
+ <field value="id"
+ type="number"
+ imported="false"
+ init=""
+ group=""
+ label=""/>
+ <field value="name"
+ type="formatted"
+ init="%designation% %vineyard% %vintage%"
+ group="Main"
+ label="Name"/>
+ <field value="designation"
+ type="history text"
+ init="NewItem"
+ group="Main"
+ label="Designation"/>
+ <field value="vineyard"
+ type="history text"
+ init=""
+ group="Main"
+ label="Vineyard"/>
+ <field value="vintage"
+ type="number"
+ init=""
+ group="Main"
+ label="Vintage"/>
+ <field value="type"
+ type="history text"
+ init=""
+ group="Main"
+ label="Type"/>
+ <field value="grapes"
+ type="single list"
+ history="true"
+ group="Main"
+ label="Grapes"/>
+ <field value="soil"
+ type="history text"
+ group="Main"
+ label="Soil"/>
+ <field value="producer"
+ type="history text"
+ group="Main"
+ label="Producer"/>
+ <field value="country"
+ type="history text"
+ group="Main"
+ label="Country"/>
+ <field value="volume"
+ type="number"
+ init="750"
+ group="Main"
+ label="Volume"/>
+ <field value="alcohol"
+ type="number"
+ group="Main"
+ label="Alcohol"/>
+ <field value="medal"
+ type="short text"
+ group="Main"
+ label="Distinction"/>
+
+ <field value="location"
+ type="history text"
+ init=""
+ group="Details"
+ label="Location"/>
+ <field value="shelfindex"
+ type="short text"
+ displayed="Position"
+ group="Details"
+ label="ShelfIndex"/>
+ <field value="quantity"
+ type="number"
+ init="0"
+ group="Details"
+ label="Quantity"/>
+ <field value="purchasedate"
+ type="date"
+ group="Details"
+ label="PurchaseDate"/>
+ <field value="purchaseprice"
+ type="number"
+ group="Details"
+ label="PurchasePrice"/>
+ <field value="gift"
+ type="short text"
+ group="Details"
+ label="Gift"/>
+ <field value="bottlelabel"
+ group="Details"
+ label="BottleLabel"
+ type="image"
+ default="view"/>
+ <field value="website"
+ group="Details"
+ label="Website"
+ type="url" />
+ <field value="tasted"
+ type="yesno"
+ group="Tasting"
+ label="Tasted"/>
+ <field value="rating"
+ group="Tasting"
+ label="PanelRating"
+ max="10"
+ init="0"
+ type="number"
+ displayas="graphical"/>
+ <field value="comments"
+ type="long text"
+ group="Tasting"
+ label="Comments"/>
+ <field value="serving"
+ type="long text"
+ group="Tasting"
+ label="Serving"/>
+ <field value="tasting"
+ type="long text"
+ group="Tasting"
+ label="TastingField"/>
+ </fields>
+
+ <filters>
+ <group label="Main">
+ <filter field="vintage" comparison="range" labelselect="FilterRange" numeric="true" quick="true" />
+ <filter field="type" comparison="contain" numeric="false" quick="true" />
+ <filter field="grapes" comparison="contain" numeric="false" quick="true" />
+ </group>
+ <group label="Details">
+ <filter field="purchasedate" comparison="ge" labelselect="&gt;=" numeric="false" quick="false" />
+ <filter field="quantity" comparison="ge" labelselect="&gt;=" numeric="true" quick="true" />
+ <filter field="gift" comparison="contain" numeric="true" quick="false" />
+ <filter field="bottlelabel" comparison="contain" numeric="true" quick="false" />
+ <filter field="website" comparison="contain" numeric="true" quick="false" />
+ </group>
+ <group label="Tasting">
+ <filter field="comments" comparison="contain" numeric="true" quick="false" />
+ <filter field="tasted" comparison="eq" values="both" labeloff="FilterTastedNo" labelon="FilterTastedYes" quick="true" />
+ <filter field="rating" comparison="ge" labelselect="FilterRatingSelect" numeric="true" quick="true" />
+ </group>
+ </filters>
+
+ <panels>
+ <panel editable="true" label="PanelForm" name="form">
+ <item type="line">
+ <item expand="true" for="name" type="value" />
+ </item>
+ <item expand="true" type="notebook">
+ <item expand="true" title="General" type="tab" value="main">
+ <item type="table" cols="4" expand="true" rows="9">
+ <item col="0" row="0" for="designation" type="label" />
+ <item col="1" row="0" colspan="3" for="designation" type="value" />
+ <item col="0" for="vineyard" row="1" type="label" />
+ <item col="1" for="vineyard" row="1" type="value" colspan="3" />
+ <item col="0" row="2" for="vintage" type="label"/>
+ <item col="1" row="2" for="vintage" type="value" width="4"/>
+ <item col="2" for="type" row="2" type="label" />
+ <item col="3" for="type" row="2" type="value" />
+ <item col="0" for="volume" row="3" type="label" />
+ <item col="1" for="volume" row="3" type="value" />
+ <item col="2" for="alcohol" row="3" type="label" />
+ <item col="3" for="alcohol" row="3" type="value" />
+ <item expand="true" type="expander" title="Grapes" collapsed="%grapes%" row="4" col="0" colspan="4">
+ <item type="value" for="grapes"/>
+ </item>
+ <item col="0" for="soil" row="5" type="label" />
+ <item col="1" for="soil" row="5" type="value" colspan="3" />
+ <item col="0" for="country" row="6" type="label" />
+ <item col="1" for="country" row="6" type="value" colspan="3" />
+ <item col="0" for="producer" row="7" type="label" />
+ <item col="1" for="producer" row="7" type="value" colspan="3" />
+ <item col="0" for="medal" row="8" type="label" />
+ <item col="1" for="medal" row="8" type="value" colspan="3" />
+ </item>
+ </item>
+ <item expand="true" title="Details" type="tab" value="details">
+ <item type="box">
+ <item type="table" cols="4" expand="true" rows="4">
+ <item col="0" for="location" row="0" type="label" />
+ <item col="1" for="location" row="0" type="value" />
+ <item col="2" for="shelfindex" row="0" type="label" />
+ <item col="3" for="shelfindex" row="0" type="value" />
+ <item col="0" for="quantity" row="1" type="label" />
+ <item col="1" for="quantity" row="1" type="value" />
+ <item col="0" for="purchasedate" row="2" type="label" />
+ <item col="1" for="purchasedate" row="2" type="value" />
+ <item col="2" for="purchaseprice" row="2" type="label" />
+ <item col="3" for="purchaseprice" row="2" type="value" />
+ <item col="0" for="gift" row="3" type="label" />
+ <item col="1" for="gift" row="3" type="value" />
+ </item>
+ <item type="box">
+ <item for="bottlelabel" type="label" expand="horizontal" align="center" />
+ <item for="bottlelabel" height="200" type="value" expand="horizontal" align="center" />
+ </item>
+ <item type="line" expand="true">
+ <item for="website" type="label" />
+ <item for="website" type="value" />
+ </item>
+ </item>
+ </item>
+ <item type="tab" expand="true" title="Tasting" value="tasting">
+ <item type="table" cols="3" expand="true" rows="4">
+ <item col="0" for="tasted" row="0" type="value" />
+ <item col="1" for="rating" row="0" type="label" />
+ <item col="2" for="rating" row="0" type="value" />
+ <item col="0" for="comments" row="1" type="label" />
+ <item col="1" colspan="2" expand="true" for="comments" row="1" type="value" />
+ <item col="0" for="serving" row="2" type="label" />
+ <item col="1" colspan="2" expand="true" for="serving" row="2" type="value" />
+ <item col="0" for="tasting" row="3" type="label" />
+ <item col="1" colspan="2" expand="true" for="tasting" row="3" type="value" />
+ </item>
+ </item>
+ <item type="tab" value="tagpanel" title="PanelTags">
+ <item type="line">
+ <item type="value" for="favourite" />
+ </item>
+ <item expand="true" for="tags" type="value" />
+ </item>
+ </item>
+ <item type="line">
+ <item expand="true" for="deleteButton" type="special" />
+ </item>
+ </panel>
+
+ <panel editable="false" label="PanelReadOnly" name="readonly">
+ <item type="line">
+ <item expand="true" for="name" type="value" style="header" />
+ </item>
+ <item type="table" cols="4" expand="true" rows="9" >
+ <item col="0" row="0" for="designation" type="label" />
+ <item col="1" row="0" colspan="3" for="designation" type="value" />
+ <item col="0" for="vineyard" row="1" type="label" />
+ <item col="1" for="vineyard" row="1" type="value" colspan="3" />
+ <item col="0" row="2" for="vintage" type="label"/>
+ <item col="1" row="2" for="vintage" type="value"/>
+ <item col="2" for="type" row="2" type="label" />
+ <item col="3" for="type" row="2" type="value" />
+ <item col="0" for="volume" row="3" type="label" />
+ <item col="1" for="volume" row="3" type="value" />
+ <item col="2" for="alcohol" row="3" type="label" />
+ <item col="3" for="alcohol" row="3" type="value" />
+ <item col="0" for="grapes" type="value" expand="true" row="4" colspan="4" />
+ <item col="0" for="soil" row="5" type="label" />
+ <item col="1" for="soil" row="5" type="value" colspan="3" />
+ <item col="0" for="country" row="6" type="label" />
+ <item col="1" for="country" row="6" type="value" colspan="3" />
+ <item col="0" for="producer" row="7" type="label" />
+ <item col="1" for="producer" row="7" type="value" colspan="3" />
+ <item col="0" for="medal" row="8" type="label" />
+ <item col="1" for="medal" row="8" type="value" colspan="3" />
+ </item>
+ <item expand="true" title="Details" type="expander" value="quantity">
+ <item type="box">
+ <item type="expander" title="Storage" expand="true" collapsed="%location% - %shelfindex% (%quantity%)">
+ <item type="table" cols="4" expand="true" rows="2">
+ <item col="0" for="location" row="0" type="label" />
+ <item col="1" for="location" row="0" type="value" />
+ <item col="2" for="shelfindex" row="0" type="label" />
+ <item col="3" for="shelfindex" row="0" type="value" />
+ <item col="0" for="quantity" row="1" type="label" />
+ <item col="1" for="quantity" row="1" type="value" />
+ </item>
+ </item>
+ <item type="expander" title="Acquisition" expand="true" collapsed="%purchasedate% (%purchaseprice%)">
+ <item type="table" cols="4" expand="true" rows="1">
+ <item col="0" for="purchasedate" row="0" type="label" />
+ <item col="1" for="purchasedate" row="0" type="value" />
+ <item col="2" for="purchaseprice" row="0" type="label" />
+ <item col="3" for="purchaseprice" row="0" type="value" />
+ </item>
+ </item>
+ <item type="line" expand="true">
+ <item for="gift" type="label" />
+ <item for="gift" type="value" />
+ </item>
+ <item type="box">
+ <item for="bottlelabel" type="label" expand="horizontal" align="center" />
+ <item for="bottlelabel" height="200" type="value" expand="horizontal" align="center" />
+ </item>
+ <item type="line" expand="true">
+ <item for="website" type="label" />
+ <item for="website" type="value" />
+ </item>
+ </item>
+ </item>
+ <item expand="true" title="Tasting" type="expander" value="tasting">
+ <item type="table" cols="3" expand="true" rows="4">
+ <item col="0" for="tasted" row="0" type="value" />
+ <item col="1" for="rating" row="0" type="label" />
+ <item col="2" for="rating" row="0" type="value" />
+ <item col="0" for="comments" row="1" type="label" />
+ <item col="1" colspan="2" expand="true" for="comments" row="1" type="value" />
+ <item col="0" for="serving" row="2" type="label" />
+ <item col="1" colspan="2" expand="true" for="serving" row="2" type="value" />
+ <item col="0" for="tasting" row="3" type="label" />
+ <item col="1" colspan="2" expand="true" for="tasting" row="3" type="value" />
+ </item>
+ </item>
+ <item type="expander" title="PanelTags">
+ <item expand="true" for="tags" type="value" />
+ <item type="value" for="favourite" values="favouriteYesno" collapse="true"/>
+ </item>
+ </panel>
+ </panels>
+</collection>
diff --git a/lib/gcstar/GCOptions.pm b/lib/gcstar/GCOptions.pm
new file mode 100644
index 0000000..053b635
--- /dev/null
+++ b/lib/gcstar/GCOptions.pm
@@ -0,0 +1,1670 @@
+package GCOptions;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+our $DEFAULT_IMG_DIR='./.%FILE_BASE%_pictures/';
+
+{
+ package GCOptionLoader;
+
+ my $DEFAULT_LANG='EN';
+ #my $DEFAULT_IMG_DIR=$ENV{GCS_DATA_HOME}.'/images/';
+
+ use XML::Simple;
+ use IO::File;
+ use POSIX (':errno_h');
+ use GCLang;
+
+ sub new
+ {
+ # fallbackOptions has been added in 1.7.0. Previous versions stored some collection
+ # specific settings at global level. This has been moved to collection level, but to
+ # let users keep their previous settings, it will try to find it at global level if not found
+ # at collection level.
+
+ my ($proto, $file, $main, $fallbackOptions) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {created => 0, fallbackOptions => $fallbackOptions};
+
+ #GCLang::loadLangs;
+
+ bless ($self, $class);
+ $self->load($file, $main) if $file;
+ return $self;
+ }
+
+ sub newFromXmlString
+ {
+ my ($proto, $string) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {created => 0};
+ bless ($self, $class);
+ if ($string)
+ {
+ my $xs = XML::Simple->new;
+ $self->{options} = $xs->XMLin($string,
+ SuppressEmpty => 1);
+ }
+ return $self;
+ }
+
+ sub toXmlString
+ {
+ my $self = shift;
+
+ my $result = '<collectionInlinePreferences>
+';
+ while (my ($key,$value) = each(%{$self->{options}}))
+ {
+ $result .= " <$key>".GCUtils::encodeEntities($value)."</$key>\n";
+ }
+ $result .= '</collectionInlinePreferences>';
+ return $result;
+ }
+
+ sub error
+ {
+ my ($self, $type, $errmsg) = @_;
+ if ($self->{parent})
+ {
+ $self->{parent}->optionsError($type, $errmsg);
+ }
+ else
+ {
+ print "Error performing $type for ".$self->{file}.": $errmsg\n";
+ }
+ }
+
+ sub setParent
+ {
+ my ($self, $parent) = @_;
+ $self->{parent} = $parent;
+ }
+
+
+ sub load
+ {
+ my ( $self, $file, $main ) = @_;
+
+ my %defaults;
+ if ( $main )
+ {
+ my $lang = $ENV{LANG};
+ if ($lang)
+ {
+ $lang =~ s/(..)_?.*/\U$1\E/;
+ }
+ else
+ {
+ $lang = $DEFAULT_LANG;
+ }; # if
+
+ %defaults = (
+ images => $GCOptions::DEFAULT_IMG_DIR,
+ autosave => 1,
+ noautoload => 0,
+ programs => "system",
+ browser => "firefox",
+ player => "mplayer",
+ audio => "xmms",
+ imageEditor => "gimp",
+ file => "",
+ split => 300,
+ width => 920,
+ height => 640,
+ confirm => 1,
+ lang => $lang,
+ status => 1,
+ splash => 1,
+ tearoffMenus => 0,
+ toolbar => 3,
+ toolbarPosition => 0,
+ transform => 1,
+ articles => "le,la,les,l,un,une,des,a,the,der,die,das,ein,eine,el,los,una",
+ askImport => 0,
+ searchStop => 1,
+ alwaysOriginal => 0,
+ proxy => "",
+ cookieJar => "",
+ borrowers => "",
+ emails => "",
+ view => 0,
+ columns => 3,
+ resizeImgList => 1,
+ animateImgList => 1,
+ listBgPicture => 1,
+ useOverlays => 1,
+ mailer => "Sendmail",
+ from => "",
+ subject => "GCstar email",
+ smtp => "",
+ template => "Hello %1,<br/><br/>You have borrowed my %2 since %3. I\'d like to get it back shortly.",
+ history => "none|none|none|none|none",
+ historysize => "5",
+ useRelativePaths => 1,
+ useTitleForPics => 1,
+ expandersMode => 'cut',
+ dateFormat => '%d/%m/%Y',
+ spellCheck => 1,
+ cdDevice => '/dev/cd',
+ useStars => 1,
+ bigPics => 0,
+ listPaneSplit => 10000, # Big value to make sure it's hidden by default
+ displayMenuBar => 1
+ );
+ }; # if
+
+ $self->{file} = $file;
+ $self->{options} = \%defaults; # Use default values for now.
+ my $handle = IO::File->new($file, "<:utf8");
+ if (defined( $handle))
+ {
+ # File opened succesfully, read it.
+ my $options = \%defaults;
+ while (my $line = $handle->getline())
+ {
+ # Remove last character if white space
+ # This includes carriage return and fix an issue when using DOS-encoded file on Unix system
+ $line =~ s/\s$//;
+ if ($line =~ m{^(.*?)=(.*)$})
+ {
+ $options->{$1} = $2;
+ }
+ else
+ {
+ # TODO: Report an error in config file.
+ } # if
+ } # while
+ # Close file, check errors.
+ my $rc = $handle->close();
+ if ($rc)
+ {
+ # File was read successfully, update options.
+ $self->{options} = $options;
+ }
+ else
+ {
+ # File was not read, do not change default values and report error.
+ $self->error( 'read', $! );
+ } #if
+ }
+ else
+ {
+ # File is not opened. Check the reason.
+ if ($! == ENOENT)
+ {
+ # File does not exist -- not a problem, just continue with defaults.
+ $self->{options} = \%defaults;
+ }
+ else
+ {
+ # It is a real error, report it.
+ # ???: Why report goes to stdout?
+ # TODO: Open a error window.
+ $self->error('read', $!);
+ } # if
+ } # if
+
+ if (!GCLang::loadLangs($self->lang) && $main)
+ {
+ $self->lang($DEFAULT_LANG);
+ GCLang::loadLangs($self->lang);
+ }
+ }
+
+ sub getFullLang
+ {
+ my $self = shift;
+ (my $lang = $self->lang) =~ s/(.*)/\L$1\E_$1/;
+ $lang =~ s/_EN/_US/; # Fix for english
+ $lang =~ s/_CS/_CZ/; # Fix for Czech
+ $lang =~ s/_cn_ZH//; # Fix for Simplified Chinese
+ $lang =~ s/_ZH/_TW/; # Fix for Traditional Chinese
+ $lang .= '.UTF-8';
+ $lang = 'sr@Latn' if $lang =~ /^sr/; # Fix for serbian
+ return $lang;
+ }
+
+ sub save
+ {
+ my $self = shift;
+ return if !$self->{file};
+ my $handle = IO::File->new($self->{file}, ">:utf8");
+ if (defined($handle))
+ {
+ while ( my ( $key, $value ) = each( %{ $self->{options} } ) )
+ {
+ if ($key)
+ {
+ $handle->print( "$key=$value\n" );
+ } # if
+ } # while
+ $handle->close() or $self->error('save', $!);
+ }
+ else
+ {
+ $self->error( 'save', $! );
+ }; # if
+ }
+
+ sub exists
+ {
+ my ($self, $name) = @_;
+
+ return exists $self->{options}->{$name};
+ }
+
+ sub AUTOLOAD
+ {
+ my $self = shift;
+ my $name = our $AUTOLOAD;
+ return if $name =~ /::DESTROY$/;
+ my @comp = split('::', $name);
+ $name = $comp[-1];
+ if (@_)
+ {
+ $self->{options}->{$name} = shift;
+ }
+ else
+ {
+ if (!exists $self->{options}->{$name} && $self->{fallbackOptions})
+ {
+ $self->{options}->{$name} = $self->{fallbackOptions}->$name;
+ }
+ return $self->{options}->{$name};
+ }
+ }
+
+ sub checkPreviousGCfilms
+ {
+ my ($self, $parent) = @_;
+
+ $self->{modelsFactory} = $parent->{modelsFactory};
+ my $gcfilmsconf = $ENV{XDG_CONFIG_HOME}.'/gcfilms/gcfilms.conf';
+
+ if ( -e $gcfilmsconf)
+ {
+ my $dialog = Gtk2::MessageDialog->new($parent,
+ [qw/modal destroy-with-parent/],
+ 'question',
+ 'ok-cancel',
+ $parent->{lang}->{GCfilmsImportQuestion});
+
+ my $withOptionsCb = new Gtk2::CheckButton($parent->{lang}->{GCfilmsImportOptions});
+ my $withDataCb = new Gtk2::CheckButton($parent->{lang}->{GCfilmsImportData});
+ $dialog->vbox->pack_start($withOptionsCb, 0, 0, 0);
+ $dialog->vbox->pack_start($withDataCb, 0, 0, 0);
+ $dialog->vbox->show_all;
+ #$parent->{splash}->hide if $parent->{splash};
+ my $response = $dialog->run;
+ my $withOptions = $withOptionsCb->get_active;
+ my $withData = $withDataCb->get_active;
+ $dialog->destroy;
+ return if $response ne 'ok';
+ my $gcfilmsOptions = GCOptionLoader->new($gcfilmsconf, 0);
+ $self->importGCfilmsOptions($gcfilmsOptions) if $withOptions;
+ $self->importGCfilmsData($gcfilmsOptions) if $withData;
+ }
+ }
+
+ sub importGCfilmsOptions
+ {
+ my ($self, $options) = @_;
+
+ my @commonOptions = (
+ 'listImgSize',
+ 'historysize',
+ 'browser',
+ 'listBgColor',
+ 'listFgColor',
+ 'searchStop',
+ 'groupItems',
+ 'view',
+ 'split',
+ 'autosave',
+ 'articles',
+ 'lang',
+ 'template',
+ 'askImport',
+ 'subject',
+ 'toolbar',
+ 'listImgSkin',
+ 'columns',
+ 'proxy',
+ 'width',
+ 'mailer',
+ 'smtp',
+ 'status',
+ 'borrowers',
+ 'confirm',
+ 'itemWindowHeight',
+ 'from',
+ 'useRelativePaths',
+ 'toolbarPosition',
+ 'transform',
+ 'itemWindowWidth',
+ 'player',
+ 'height',
+ 'listBgPicture',
+ 'emails',
+ 'splash'
+ );
+
+ my @specificOptions = (
+ 'sortOrder',
+ 'details',
+ 'sortField',
+ 'plugin',
+ 'multisite',
+ );
+
+ foreach (@commonOptions)
+ {
+ (my $gcfilmsOption = $_) =~ s/item/movie/;
+ my $value = $options->$gcfilmsOption;
+ $value =~ s|<br>|<br/>|gm;
+ $self->$_($value);
+ }
+ my $newOptions = $self->{modelsFactory}->getModel('GCfilms')->{preferences};
+ foreach (@specificOptions)
+ {
+ $newOptions->$_($options->$_);
+ }
+
+ # Special processing for order -> layout
+ my $layout = 'form';
+ my $order = $options->order;
+ $layout = 'compact' if ($order == 1) || ($order == 2);
+ $layout = 'readonly' if ($order == 3) || ($order == 4);
+ $newOptions->layout($layout);
+
+ $newOptions->save;
+ }
+
+ sub importGCfilmsData
+ {
+ my ($self, $options) = @_;
+ $self->{parent}->importWithDetect($options->file, 1);
+ $self->{options}->{file} = $ENV{GCS_DATA_HOME}.'/films.gcs';
+ $self->{parent}->{items}->save($self->{parent});
+ #$self->{parent}->setFileName($self->{options}->{file});
+ $self->{parent}->refreshTitle;
+ }
+}
+
+{
+ package GCOptionsDialog;
+
+ use Glib::Object::Subclass
+ Gtk2::Dialog::
+ ;
+
+ @GCOptionsDialog::ISA = ('GCModalDialog');
+
+ use GCPlugins;
+
+ use GCLang;
+ use GCStyle;
+ use GCMail;
+
+ sub on_destroy
+ {
+ my ($widget, $self) = @_;
+ return 1;
+ }
+
+ sub initValues
+ {
+ my $self = shift;
+
+ $self->{viewChanged} = 0;
+ $self->{viewOptionsChanged} = 0;
+ $self->{expert}->set_active($self->{options}->expert);
+
+ if ($self->{options}->programs eq 'system')
+ {
+ $self->{systemPrograms}->set_active(1);
+ }
+ else
+ {
+ $self->{userPrograms}->set_active(1);
+ }
+ $self->{defineProgramsButton}->lock($self->{systemPrograms}->get_active);
+ $self->{browser} = $self->{options}->browser;
+ $self->{player} = $self->{options}->player;
+ $self->{audio} = $self->{options}->audio;
+ $self->{imageEditor} = $self->{options}->imageEditor;
+
+ $self->{cdDevice}->setValue($self->{options}->cdDevice);
+ $self->{images}->setValue($self->{options}->images);
+ $self->{confirm}->set_active($self->{options}->confirm);
+ $self->{autosave}->set_active($self->{options}->autosave);
+ $self->{autoload}->set_active(! $self->{options}->noautoload);
+ $self->{splash}->set_active($self->{options}->splash);
+ $self->{tearoffMenus}->set_active($self->{options}->tearoffMenus);
+ $self->{options}->spellCheck(1) if ! $self->{options}->exists('spellCheck');
+ $self->{spellCheck}->set_active($self->{options}->spellCheck)
+ if $self->{spellCheck};
+ $self->{useRelativePaths}->set_active($self->{options}->useRelativePaths);
+ $self->{useStars}->set_active($self->{options}->useStars);
+ $self->{proxycb}->set_active($self->{options}->proxy);
+ $self->{proxyurl}->set_text($self->{options}->proxy);
+ $self->{cookieJarcb}->set_active($self->{options}->cookieJar);
+ $self->{cookieJarPath}->setValue($self->{options}->cookieJar);
+ $self->{transform}->set_active($self->{options}->transform);
+ $self->{articles}->set_text($self->{options}->articles);
+
+ if ($self->{options}->useTitleForPics)
+ {
+ $self->{picturesNameTitle}->set_active(1);
+ }
+ else
+ {
+ $self->{picturesNameAuto}->set_active(1);
+ }
+
+ $self->{options}->columns(3) if ! $self->{options}->exists('columns');
+ $self->{columns} = $self->{options}->columns;
+
+ $self->{options}->resizeImgList(0) if ! $self->{options}->exists('resizeImgList');
+ $self->{resizeImgList} = $self->{options}->resizeImgList;
+
+ $self->{options}->animateImgList(1) if ! $self->{options}->exists('animateImgList');
+ $self->{animateImgList} = $self->{options}->animateImgList;
+
+ $self->{options}->toolbar(3) if ! $self->{options}->exists('toolbar');
+ $self->{toolbarOption}->setValue($self->{options}->toolbar);
+
+ $self->{options}->toolbarPosition(0) if ! $self->{options}->exists('toolbarPosition');
+ $self->{toolbarPositionOption}->setValue($self->{options}->toolbarPosition);
+
+ $self->{options}->expandersMode('cut') if ! $self->{options}->exists('expandersMode');
+ $self->{expandersMode}->setValue($self->{options}->expandersMode);
+
+ $self->{dateFormat}->setValue($self->{options}->dateFormat)
+ if $self->{dateFormat};
+
+ $self->{options}->view(0) if ! $self->{options}->exists('view');
+ $self->{viewOption}->setValue($self->{options}->view);
+
+ $self->{model}->{preferences}->plugin('ask')
+ if ! $self->{model}->{preferences}->exists('plugin');
+ $self->{pluginOption}->setValue($self->{model}->{preferences}->plugin);
+
+ $self->{askImport}->set_active($self->{options}->askImport);
+ $self->{searchStop}->set_active($self->{options}->searchStop);
+ $self->{bigPics}->set_active($self->{options}->bigPics);
+
+ $self->{langOption}->setValue($self->{options}->lang);
+ $self->{styleOption}->setValue($self->{options}->style);
+
+ $self->{layoutOption}->setValue($self->{model}->{preferences}->layout);
+ $self->{panelStyleOption}->setValue($self->{options}->panelStyle);
+
+ $self->{options}->mailer('Sendmail') if ! $self->{options}->exists('mailer');
+ $self->{mailerOption}->setValue($self->{options}->mailer);
+
+ $self->{from}->set_text($self->{options}->from);
+
+ # Picture size for image mode
+ $self->{options}->listImgSize(2) if ! $self->{options}->exists('listImgSize');
+ $self->{listImgSize} = $self->{options}->listImgSize;
+ $self->{options}->listImgSkin($GCStyle::defaultList) if ! $self->{options}->exists('listImgSkin');
+ $self->{listImgSkin} = $self->{options}->listImgSkin;
+ $self->{options}->listBgColor('65535,65535,65535') if ! $self->{options}->exists('listBgColor');
+ $self->{options}->listFgColor('0,0,0') if ! $self->{options}->exists('listFgColor');
+ $self->{mlbg} = $self->{options}->listBgColor;
+ $self->{mlfg} = $self->{options}->listFgColor;
+ $self->{useOverlays} = $self->{options}->useOverlays;
+ $self->{listBgPicture} = $self->{options}->listBgPicture;
+
+ $self->{proxyurl}->set_editable(0) if ! $self->{proxycb}->get_active;
+ $self->{proxyurl}->set_editable(1) if $self->{proxycb}->get_active;
+ $self->{cookieJarPath}->lock(1) if ! $self->{cookieJarcb}->get_active;
+ $self->{cookieJarPath}->lock(0) if $self->{cookieJarcb}->get_active;
+
+ $self->{historysize}->set_value($self->{options}->historysize);
+
+ # Picture size for detailed mode
+ $self->{options}->detailImgSize($self->{options}->listImgSize)
+ if ! $self->{options}->exists('detailImgSize');
+
+ $self->{model}->{preferences}->details($self->{model}->{commonFields}->{title})
+ if ! $self->{model}->{preferences}->exists('details');
+ $self->{details} = $self->{model}->{preferences}->details;
+
+ $self->{detailImgSize} = $self->{options}->detailImgSize;
+ $self->{groupBy} = $self->{model}->{preferences}->groupBy;
+ $self->{secondarySort} = $self->{model}->{preferences}->secondarySort;
+ $self->{groupedFirst} = $self->{model}->{preferences}->groupedFirst;
+ $self->{addCount} = $self->{model}->{preferences}->addCount;
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ $self->{options}->expert(($self->{expert}->get_active) ? 1 : 0);
+
+ $self->{options}->programs(($self->{systemPrograms}->get_active) ? 'system' : 'user');
+ $self->{options}->browser($self->{browser});
+ $self->{options}->player($self->{player});
+ $self->{options}->audio($self->{audio});
+ $self->{options}->imageEditor($self->{imageEditor});
+
+ $self->{options}->cdDevice($self->{cdDevice}->getValue);
+ $self->{options}->images($self->{images}->getValue);
+ $self->{options}->confirm(($self->{confirm}->get_active) ? 1 : 0);
+ $self->{options}->autosave(($self->{autosave}->get_active) ? 1 : 0);
+ $self->{options}->noautoload(($self->{autoload}->get_active) ? 0 : 1);
+ $self->{options}->splash(($self->{splash}->get_active) ? 1 : 0);
+ $self->{options}->tearoffMenus(($self->{tearoffMenus}->get_active) ? 1 : 0);
+ $self->{options}->spellCheck(($self->{spellCheck}->get_active) ? 1 : 0)
+ if $self->{spellCheck};
+ $self->{options}->useStars(($self->{useStars}->get_active) ? 1 : 0);
+ $self->{options}->useRelativePaths(($self->{useRelativePaths}->get_active) ? 1 : 0);
+ $self->{options}->useTitleForPics(($self->{picturesNameTitle}->get_active) ? 1 : 0);
+ $self->{options}->transform(($self->{transform}->get_active) ? 1 : 0);
+ $self->{options}->articles($self->{articles}->get_text);
+
+ if ($self->{proxycb}->get_active)
+ {
+ $self->{options}->proxy($self->{proxyurl}->get_text);
+ }
+ else
+ {
+ $self->{options}->proxy('');
+ }
+
+ if ($self->{cookieJarcb}->get_active)
+ {
+ $self->{options}->cookieJar($self->{cookieJarPath}->getValue);
+ }
+ else
+ {
+ $self->{options}->cookieJar('');
+ }
+
+ $self->{options}->lang($self->{langOption}->getValue);
+ $self->{options}->style($self->{styleOption}->getValue);
+ $self->{model}->{preferences}->layout($self->{layoutOption}->getValue);
+ $self->{options}->panelStyle($self->{panelStyleOption}->getValue);
+ $self->{options}->toolbar($self->{toolbarOption}->getValue);
+ $self->{options}->toolbarPosition($self->{toolbarPositionOption}->getValue);
+ $self->{options}->expandersMode($self->{expandersMode}->getValue);
+ $self->{options}->dateFormat($self->{dateFormat}->getValue)
+ if $self->{dateFormat};
+ my $currentView = $self->{options}->view;
+ $self->{options}->view($self->{viewOption}->getValue);
+
+ if (($currentView != $self->{options}->view)
+ || ($self->{viewOptionsChanged}))
+ {
+ $self->{parent}->setItemsList(0, 1);
+ $self->{viewChanged} = 1;
+ }
+
+ $self->{model}->{preferences}->plugin($self->{pluginOption}->getValue);
+
+ $self->{options}->askImport(($self->{askImport}->get_active) ? 1 : 0);
+ $self->{options}->searchStop(($self->{searchStop}->get_active) ? 1 : 0);
+ $self->{options}->bigPics(($self->{bigPics}->get_active) ? 1 : 0);
+ #$self->{options}->alwaysOriginal(($self->{alwaysOriginal}->get_active) ? 1 : 0);
+
+ $self->{options}->mailer($self->{mailerOption}->getValue);
+ $self->{options}->smtp($self->{smtp}->get_text);
+ $self->{options}->from($self->{from}->get_text);
+
+ $self->{parent}->checkImagesDirectory(1);
+ $self->{options}->historysize($self->{historysize}->get_value);
+ $self->{parent}->{menubar}->{menuHistoryItem}->remove_submenu();
+ $self->{parent}->{menubar}->{menuHistory} = Gtk2::Menu->new();
+ $self->{parent}->{menubar}->addHistoryMenu();
+
+ #$self->{model}->{preferences}->details($self->{details});
+
+ $self->{options}->save;
+ }
+
+ sub checkValues
+ {
+ my $self = shift;
+
+ return $self->{parent}->{lang}->{OptionsPicturesWorkingDirError}
+ if $self->{images}->getValue =~ /.%WORKING_DIR%/;
+ return undef;
+ }
+
+ sub activateInternetOptions
+ {
+ my ($self, $value) = @_;
+
+ $self->{dataGroupLabel}->set_sensitive($value);
+ $self->{pluginLabel}->set_sensitive($value);
+ $self->{pluginOption}->set_sensitive($value);
+ $self->{pluginList}->set_sensitive($value);
+ $self->{askImport}->set_sensitive($value);
+ $self->{searchStop}->set_sensitive($value);
+ $self->{bigPics}->set_sensitive($value);
+ }
+
+ sub show_all
+ {
+ my $self = shift;
+ $self->SUPER::show_all;
+ $self->{hboxImages}->hide;
+ $self->{hboxDetails}->hide;
+ $self->{hboxSMTP}->hide if $self->{mailerOption}->getValue ne 'SMTP';
+ if ($self->{expert}->get_active)
+ {
+ $self->{hboxImages}->show_all if ($self->{options}->view == 1);
+ $self->{hboxDetails}->show_all if ($self->{options}->view == 2);
+ }
+ else
+ {
+ # Toolbar and status bar
+ $self->{labelToolbar}->hide_all;
+ $self->{toolbarOption}->hide_all;
+ $self->{labelToolbarPosition}->hide_all;
+ $self->{toolbarPositionOption}->hide_all;
+ $self->{labelExpandersMode}->hide_all;
+ $self->{expandersMode}->hide_all;
+ if ($self->{dateFormat})
+ {
+ $self->{labelDateFormat}->hide_all;
+ $self->{dateFormat}->hide_all;
+ }
+ $self->{useStars}->hide_all;
+ # CD Device
+ $self->{cdDeviceLabel}->hide_all;
+ $self->{cdDevice}->hide_all;
+ # Pictures
+ $self->{picturesNameFormat}->hide_all;
+ $self->{picturesNameAuto}->hide_all;
+ $self->{picturesNameTitle}->hide_all;
+ $self->{useRelativePaths}->hide_all;
+ # Internet searches
+ $self->{searchStop}->hide_all;
+ # Internet access
+ $self->{proxycb}->hide_all;
+ $self->{proxyurl}->hide_all;
+ $self->{cookieJarcb}->hide_all;
+ $self->{cookieJarPath}->hide_all;
+ $self->{mailerLabel}->hide_all;
+ $self->{mailerOption}->hide_all;
+ $self->{hboxSMTP}->hide_all;
+ $self->{hboxMua}->hide_all;
+ # Features
+ $self->{tearoffMenus}->hide_all;
+ $self->{autoload}->hide_all;
+ $self->{OptionsRestoreAccelerators}->hide_all;
+ # History
+ $self->{fileHistoryLabel}->hide_all;
+ $self->{labelHistorysize}->hide_all;
+ $self->{historysize}->hide_all;
+ $self->{buttonClearHistory}->hide_all;
+ }
+ $self->{allShown} = 1;
+ $self->{layoutOption}->signal_emit('changed');
+ }
+
+ sub show
+ {
+ my $self = shift;
+ my $tabToShow= shift;
+
+ $self->initValues;
+ $self->show_all if !$self->{allShown};
+ $self->{optionstabs}->set_current_page ($tabToShow) if $tabToShow;
+ $self->activateInternetOptions(! $self->{model}->isPersonal);
+
+ $self->{hboxSMTP}->hide if $self->{options}->mailer ne 'SMTP';
+ $self->{pluginList}->hide
+ if (($self->{model}->{preferences}->plugin ne 'multi')
+ && ($self->{model}->{preferences}->plugin ne 'multiperfield')
+ && ($self->{model}->{preferences}->plugin ne 'multiask'));
+
+ while (1)
+ {
+ my $code = $self->run;
+ last if $code ne 'ok';
+ my $errorMessage = $self->checkValues;
+ if (!$errorMessage)
+ {
+ $self->saveValues;
+ last;
+ }
+ else
+ {
+ my $dialog = Gtk2::MessageDialog->new_with_markup($self->{parent},
+ [qw/modal destroy-with-parent/],
+ 'error',
+ 'ok',
+ $errorMessage);
+ $dialog->run;
+ $dialog->destroy;
+ next;
+ }
+ }
+ $self->hide;
+ }
+
+ sub changeDetails
+ {
+ my $self = shift;
+ my $parent = $self->{parent};
+ my @tmpOptionsArray = split m/\|/, $self->{details};
+
+ my $fieldsDialog = new GCDetailedOptionsDialog($self,
+ \@tmpOptionsArray);
+
+
+ $fieldsDialog->show;
+ $fieldsDialog->destroy;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ my @plugins = map {{value => $_,
+ displayed => $_}}
+ @{$model->getPluginsNames};
+ unshift @plugins, (
+ {value => 'ask', displayed => $self->{parent}->{lang}->{OptionsAskPlugins}},
+ {value => 'multiask', displayed => $self->{parent}->{lang}->{OptionsPluginsMultiAsk}},
+ {value => 'multi', displayed => $self->{parent}->{lang}->{OptionsPluginsMulti}},
+ {value => 'multiperfield', displayed => $self->{parent}->{lang}->{OptionsPluginsMultiPerField}},
+ );
+ $self->{pluginOption}->setValues(\@plugins);
+
+ my @panels = map {{value => $_,
+ displayed => $model->getDisplayedText($model->{panels}->{$_}->{label})}}
+ @{$model->{panelsNames}};
+ $self->{layoutOption}->setValues(\@panels);
+ }
+
+ sub initMailerOption
+ {
+ my $self = shift;
+ use locale;
+ my @mailers = ({value => 'Sendmail', displayed => 'Sendmail'},
+ {value => 'SMTP', displayed => 'SMTP'});
+ my $mailPrograms = GCMail::getMailers;
+ foreach (sort keys %{$mailPrograms})
+ {
+ push @mailers, {value => $_, displayed => $_};
+ }
+ $self->{mailerOption}->setValues(\@mailers, 2);
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $options) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{OptionsTitle},
+ );
+ bless ($self, $class);
+
+ $self->{allShown} = 0;
+ $self->set_has_separator(0);
+
+ $options = $parent->{options} if !$options;
+ $self->{options} = $options;
+
+ $self->{parent} = $parent;
+
+ $self->{lang} = $parent->{lang};
+ $self->{tooltips} = $parent->{tooltips};
+
+ ################
+ # Main options
+ ################
+ my $tableMain = new Gtk2::Table(3,2,0);
+ $tableMain->set_row_spacings($GCUtils::halfMargin);
+ $tableMain->set_col_spacings($GCUtils::margin);
+ $tableMain->set_border_width($GCUtils::margin);
+
+ my $labelLang = new GCLabel($parent->{lang}->{OptionsLang});
+ $self->{langOption} = new GCMenuList;
+ my @langValues;
+ push @langValues, {value => $_, displayed => $GCLang::langs{$_}->{LangName}}
+ foreach (keys %GCLang::langs);
+ @langValues = sort {$a->{displayed} cmp $b->{displayed}} @langValues;
+ $self->{langOption}->setValues(\@langValues);
+
+ $tableMain->attach($labelLang, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $tableMain->attach($self->{langOption}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+
+ my $labelStyle = new GCLabel($parent->{lang}->{OptionsStyle});
+ $self->{styleOption} = new GCMenuList;
+ my @styleValues;
+ push @styleValues, {value => $_, displayed => $_} foreach (sort keys %GCStyle::styles);
+ $self->{styleOption}->setValues(\@styleValues);
+ $tableMain->attach($labelStyle, 0, 1, 2, 3, 'fill', 'fill', 0, 0);
+ $tableMain->attach($self->{styleOption}, 1, 2, 2, 3, 'fill', 'fill', 0, 0);
+
+ $self->{tearoffMenus} = new Gtk2::CheckButton($parent->{lang}->{OptionsTearoffMenus});
+ $self->{tearoffMenus}->set_active($options->tearoffMenus);
+ $self->{tearoffMenus}->set_active(1) if (! $options->exists('tearoffMenus'));
+ $tableMain->attach($self->{tearoffMenus}, 0, 2, 3, 4, 'fill', 'fill', 0, 0);
+
+ my $labelWarning = new Gtk2::Label;
+ $labelWarning->set_markup('<b>'.$parent->{lang}->{OptionsWarning}.'</b>');
+ $labelWarning->set_use_underline(1);
+ $labelWarning->set_line_wrap(1);
+ $labelWarning->set_justify('center');
+
+ my $vboxMain = new Gtk2::VBox(0,0);
+ $vboxMain->set_border_width(20);
+ $vboxMain->pack_start($tableMain,1,1,0);
+ #$vboxMain->pack_start(Gtk2::HSeparator->new,1,1,10);
+ $vboxMain->pack_start($labelWarning,1,1,0);
+
+ ##################
+ # Display options
+ ##################
+ my $tableDisplay = new Gtk2::Table(10, 6, 0);
+ $tableDisplay->set_row_spacings($GCUtils::halfMargin);
+ $tableDisplay->set_col_spacings($GCUtils::margin);
+ $tableDisplay->set_border_width($GCUtils::margin);
+
+ my $labelDisplayInformationGroup = new GCHeaderLabel($parent->{lang}->{OptionsDisplayInformationGroup});
+ $tableDisplay->attach($labelDisplayInformationGroup, 0, 6, 0, 1, 'fill', 'fill', 0, 0);
+
+ my $labelView = new GCLabel($parent->{lang}->{OptionsView});
+ my %views = %{$parent->{lang}->{OptionsViews}};
+ $self->{viewOption} = new GCMenuList;
+ my @viewsOptions = map {{value => $_, displayed => $views{$_}}}
+ (sort keys %views);
+ $self->{viewOption}->setValues(\@viewsOptions);
+
+
+
+ $tableDisplay->attach($labelView, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{viewOption}, 3, 4, 1, 2, 'fill', 'fill', 0, 0);
+
+ $self->{hboxImages} = new Gtk2::HBox(0,0);
+ $self->{imagesButton} = new Gtk2::Button($parent->{lang}->{ImagesOptionsButton});
+ $self->{imagesButton}->signal_connect('clicked', sub {
+ $self->{imagesOptionsDialog} = new GCImagesOptionsDialog($self)
+ if ! $self->{imagesOptionsDialog};
+ $self->{imagesOptionsDialog}->show;
+ });
+ $self->{hboxImages}->pack_start($self->{imagesButton}, 0, 0, 0);
+
+ $self->{hboxDetails} = new Gtk2::HBox(0,0);
+ $self->{buttonDetails} = new Gtk2::Button($parent->{lang}->{ImagesOptionsButton});
+ $self->{buttonDetails}->signal_connect('clicked' => sub {
+ $self->changeDetails;
+ });
+ $self->{hboxDetails}->pack_start($self->{buttonDetails}, 0, 0, 0);
+
+ $self->{viewOption}->signal_connect('changed' => sub {
+ my $i = $self->{viewOption}->getValue;
+ $self->{hboxImages}->hide;
+ $self->{hboxDetails}->hide;
+ if ($self->{expert}->get_active)
+ {
+ $self->{hboxImages}->show_all if ($i == 1);
+ $self->{hboxDetails}->show_all if ($i == 2);
+ }
+ });
+ $tableDisplay->attach($self->{hboxImages}, 4, 6, 1, 2, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{hboxDetails}, 4, 6, 1, 2, 'fill', 'fill', 0, 0);
+
+ my $labelLayout = new GCLabel($parent->{lang}->{OptionsLayout});
+ $self->{layoutOption} = new GCMenuList;
+ $self->{layoutOption}->signal_connect('changed' => sub {
+ my $panelName = $self->{layoutOption}->getValue;
+ my $readonly = ($self->{model}->{panels}->{$panelName}->{editable} eq 'false');
+ if ($readonly)
+ {
+ $self->{labelPanelStyle}->show;
+ $self->{panelStyleOption}->show;
+ }
+ else
+ {
+ $self->{labelPanelStyle}->hide;
+ $self->{panelStyleOption}->hide;
+ }
+ });
+ $tableDisplay->attach($labelLayout, 2, 3, 2, 3, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{layoutOption}, 3, 4, 2, 3, 'fill', 'fill', 0, 0);
+
+ $self->{labelPanelStyle} = new GCLabel($parent->{lang}->{OptionsStyle});
+ $self->{panelStyleOption} = new GCMenuList;
+ my @panelStyles = map {{value => $_, displayed => $_}}
+ (sort @GCStyle::readOnlyStyles);
+ $self->{panelStyleOption}->setValues(\@panelStyles);
+
+ $tableDisplay->attach($self->{labelPanelStyle}, 4, 5, 2, 3, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{panelStyleOption}, 5, 6, 2, 3, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{labelToolbar} = new GCLabel($parent->{lang}->{OptionsToolbar});
+ $self->{toolbarOption} = new GCMenuList;
+ my %toolbars = %{$parent->{lang}->{OptionsToolbars}};
+ my @toolbarValues = map {{value => $_, displayed => $toolbars{$_}}}
+ (sort keys %toolbars);
+ $self->{toolbarOption}->setValues(\@toolbarValues);
+
+ $tableDisplay->attach($self->{labelToolbar}, 2, 3, 3, 4, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{toolbarOption}, 3, 4, 3, 4, 'fill', 'fill', 0, 0);
+
+ $self->{labelToolbarPosition} = new GCLabel($parent->{lang}->{OptionsToolbarPosition});
+ $self->{toolbarPositionOption} = new GCMenuList;
+ my %toolbarPositions = %{$parent->{lang}->{OptionsToolbarPositions}};
+ my @positionValues = map {{value => $_, displayed => $toolbarPositions{$_}}}
+ (sort keys %toolbarPositions);
+ $self->{toolbarPositionOption}->setValues(\@positionValues);
+
+ $tableDisplay->attach($self->{labelToolbarPosition}, 4, 5, 3, 4, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{toolbarPositionOption}, 5, 6, 3, 4, ['fill', 'expand'], 'fill', 0, 0);
+
+ $self->{labelExpandersMode} = new GCLabel($parent->{lang}->{OptionsExpandersMode});
+ $self->{expandersMode} = new GCMenuList;
+ my %expandersModes = %{$parent->{lang}->{OptionsExpandersModes}};
+ my @ExpandersModeValues = map {{value => $_, displayed => $expandersModes{$_}}}
+ (sort keys %expandersModes);
+ $self->{expandersMode}->setValues(\@ExpandersModeValues);
+
+ $tableDisplay->attach($self->{labelExpandersMode}, 2, 3, 4, 5, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{expandersMode}, 3, 4, 4, 5, 'fill', 'fill', 0, 0);
+
+ $self->{useStars} = new Gtk2::CheckButton($parent->{lang}->{OptionsUseStars});
+ $tableDisplay->attach($self->{useStars}, 4, 6, 4, 5, ['expand', 'fill'], 'fill', 0, 0);
+
+ if ($GCUtils::hasTimeConversion)
+ {
+ $self->{labelDateFormat} = new GCLabel($parent->{lang}->{OptionsDateFormat});
+ $self->{dateFormat} = new GCShortText;
+ $self->{dateFormat}->set_width_chars(10);
+ $self->{tooltips}->set_tip($self->{dateFormat},
+ $parent->{lang}->{OptionsDateFormatTooltip});
+ $tableDisplay->attach($self->{labelDateFormat}, 2, 3, 5, 6, 'fill', 'fill', 0, 0);
+ $tableDisplay->attach($self->{dateFormat}, 3, 6, 5, 6, 'fill', 'fill', 0, 0);
+ }
+
+ my $labelDisplayArticlesGroup = new GCHeaderLabel($parent->{lang}->{OptionsDisplayArticlesGroup});
+ $tableDisplay->attach($labelDisplayArticlesGroup, 0, 6, 7, 8, 'fill', 'fill', 0, 0);
+
+ $self->{transform} = new Gtk2::CheckButton($parent->{lang}->{OptionsTransform});
+ $tableDisplay->attach($self->{transform}, 2, 6, 8, 9, 'fill', 'fill', 0, 0);
+ my $labelArticles = new GCLabel($parent->{lang}->{OptionsArticles});
+ $tableDisplay->attach($labelArticles, 2, 4, 9, 10, 'fill', 'fill', 0, 0);
+ $self->{articles} = new Gtk2::Entry;
+ $self->{articles}->set_width_chars(10);
+ $tableDisplay->attach($self->{articles}, 4, 6, 9, 10, ['expand', 'fill'], 'fill', 0, 0);
+ $options->articles('le,la,les,l,un,une,des,a,the') if (! $options->exists('articles'));
+
+ my $vboxDisplay = new Gtk2::VBox(0,0);
+ $vboxDisplay->set_border_width(0);
+ $vboxDisplay->pack_start($tableDisplay, 0, 0, 0);
+
+ #################
+ # Paths options
+ #################
+ my $vboxPath = new Gtk2::VBox(0,0);
+
+ my $tablePath = new Gtk2::Table(14, 4, 0);
+ my $pathRow = -1;
+ $tablePath->set_row_spacings($GCUtils::halfMargin);
+ $tablePath->set_col_spacings($GCUtils::margin);
+ $tablePath->set_border_width($GCUtils::margin);
+
+ my $labelProgramsGroup = new GCHeaderLabel($parent->{lang}->{OptionsPathProgramsGroup});
+ $pathRow++;
+ $tablePath->attach($labelProgramsGroup, 0, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+
+ $self->{systemPrograms} = new Gtk2::RadioButton(undef, $parent->{lang}->{OptionsProgramsSystem});
+ $pathRow++;
+ $tablePath->attach($self->{systemPrograms}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{programTypeGroup} = $self->{systemPrograms}->get_group;
+ $self->{userPrograms} = new Gtk2::RadioButton($self->{programTypeGroup}, $parent->{lang}->{OptionsProgramsUser});
+ $self->{defineProgramsButton} = new GCButton($parent->{lang}->{OptionsProgramsSet});
+ $self->{defineProgramsButton}->signal_connect('clicked' => sub {
+ $self->{programsDialog} = new GCProgramsOptionsDialog($self)
+ if ! $self->{programsDialog};
+ $self->{programsDialog}->show;
+ });
+ my $hboxDefinePrograms = new Gtk2::HBox(0,0);
+ $hboxDefinePrograms->pack_start($self->{userPrograms}, 0, 0, 0);
+ $hboxDefinePrograms->pack_start($self->{defineProgramsButton}, 0, 0, 2*$GCUtils::margin);
+ $pathRow++;
+ $tablePath->attach($hboxDefinePrograms, 2, 4, $pathRow, $pathRow + 1, 'fill', [], 0, 0);
+ $self->{userPrograms}->signal_connect('toggled' => sub {
+ $self->{defineProgramsButton}->lock(! $self->{userPrograms}->get_active);
+ });
+
+ $self->{cdDeviceLabel} = new GCLabel($parent->{lang}->{OptionsCdDevice});
+ $self->{cdDevice} = new GCFile($self,
+ $self->{parent}->{lang}->{FileChooserOpenDirectory},
+ 'select-folder');
+ $pathRow++;
+ $tablePath->attach($self->{cdDeviceLabel}, 2, 3, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $tablePath->attach($self->{cdDevice}, 3, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+
+ $self->{labelImagesGroup} = new GCHeaderLabel($parent->{lang}->{OptionsPathImagesGroup});
+ $pathRow += 2;
+ $tablePath->attach($self->{labelImagesGroup}, 0, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{labelImages} = new GCLabel($parent->{lang}->{OptionsImages});
+ $pathRow++;
+ $tablePath->attach($self->{labelImages}, 2, 3, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{images} = new GCFile($self,
+ $self->{parent}->{lang}->{FileChooserOpenDirectory},
+ 'select-folder',
+ 0,
+ $GCOptions::DEFAULT_IMG_DIR);
+ $self->{images}->setWidth(40);
+ $tablePath->attach($self->{images}, 3, 4, $pathRow, $pathRow + 1, ['expand', 'fill'], 'fill', 0, 0);
+
+ $self->{labelPicturesWorkingDir} = new GCLabel($parent->{lang}->{OptionsPicturesWorkingDir});
+ $pathRow++;
+ $tablePath->attach($self->{labelPicturesWorkingDir}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+ $self->{labelPicturesFileBase} = new GCLabel($parent->{lang}->{OptionsPicturesFileBase});
+ $pathRow++;
+ $tablePath->attach($self->{labelPicturesFileBase}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+
+ $self->{picturesNameFormat} = new GCLabel($parent->{lang}->{OptionsPicturesFormat});
+ $pathRow += 2;
+ $tablePath->attach($self->{picturesNameFormat}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+ $self->{picturesNameAuto} = new Gtk2::RadioButton(undef, $parent->{lang}->{OptionsPicturesFormatInternal});
+ $pathRow++;
+ $tablePath->attach($self->{picturesNameAuto}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+ $self->{picturesNameGroup} = $self->{picturesNameAuto}->get_group;
+ $self->{picturesNameTitle} = new Gtk2::RadioButton($self->{picturesNameGroup}, $parent->{lang}->{OptionsPicturesFormatTitle});
+ $pathRow++;
+ $tablePath->attach($self->{picturesNameTitle}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 2*$GCUtils::margin, 0);
+
+ $self->{useRelativePaths} = new Gtk2::CheckButton($parent->{lang}->{OptionsUseRelativePaths});
+ $self->{useRelativePaths}->set_active($options->useRelativePaths);
+ $self->{useRelativePaths}->set_active(0) if (! $options->exists('useRelativePaths'));
+ $pathRow++;
+ $tablePath->attach($self->{useRelativePaths}, 2, 4, $pathRow, $pathRow + 1, 'fill', 'fill', 0, 0);
+
+ $vboxPath->pack_start($tablePath, 0, 0, 0);
+
+ ###################
+ # Internet options
+ ###################
+ my $tableInternet = new Gtk2::Table(12, 5, 0);
+ $tableInternet->set_row_spacings($GCUtils::halfMargin);
+ $tableInternet->set_col_spacings($GCUtils::margin);
+ $tableInternet->set_border_width($GCUtils::margin);
+
+ $self->{dataGroupLabel} = new GCHeaderLabel($parent->{lang}->{OptionsInternetDataGroup});
+ $tableInternet->attach($self->{dataGroupLabel}, 0, 5, 0, 1, 'fill', 'fill', 0, 0);
+
+ $self->{pluginLabel} = new GCLabel($parent->{lang}->{OptionsPlugins});
+ $self->{pluginOption} = new GCMenuList;
+ $self->{pluginList} = new Gtk2::Button($parent->{lang}->{OptionsPluginsList});
+ $self->{pluginList}->signal_connect('clicked' => sub {
+ $parent->getDialog('MultiSite')->show if (($self->{pluginOption}->getValue eq 'multi')
+ || ($self->{pluginOption}->getValue eq 'multiask'));
+ $parent->getDialog('MultiSitePerField')->show if (($self->{pluginOption}->getValue eq 'multiperfield'));
+ });
+ $self->{pluginOption}->signal_connect('changed' => sub {
+ if (($self->{pluginOption}->getValue eq 'multi')
+ || ($self->{pluginOption}->getValue eq 'multiask')
+ || ($self->{pluginOption}->getValue eq 'multiperfield'))
+ {
+ $self->{pluginList}->show;
+ }
+ else
+ {
+ $self->{pluginList}->hide;
+ }
+ });
+ $self->{askImport} = new Gtk2::CheckButton($parent->{lang}->{OptionsAskImport});
+ $tableInternet->attach($self->{pluginLabel}, 2, 3, 1, 2, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{pluginOption}, 3, 4, 1, 2, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{pluginList}, 4, 5, 1, 2, 'fill', 'fill', 20, 0);
+ $tableInternet->attach($self->{askImport}, 2, 5, 2, 3, 'fill', 'fill', 0, 0);
+ $self->{bigPics} = new Gtk2::CheckButton($parent->{lang}->{OptionsBigPics});
+ $tableInternet->attach($self->{bigPics}, 2, 5, 3, 4, 'fill', 'fill', 0, 0);
+ $self->{searchStop} = new Gtk2::CheckButton($parent->{lang}->{OptionsSearchStop});
+ $tableInternet->attach($self->{searchStop}, 2, 5, 4, 5, 'fill', 'fill', 0, 0) if ($^O !~ /win32/i);
+
+ my $settingsGroupLabel = new GCHeaderLabel($parent->{lang}->{OptionsInternetSettingsGroup});
+ $tableInternet->attach($settingsGroupLabel, 0, 5, 6, 7, 'fill', 'fill', 0, 0);
+
+ $self->{proxycb} = new Gtk2::CheckButton($parent->{lang}->{OptionsProxy});
+ $self->{proxycb}->set_active($options->proxy);
+ $self->{proxyurl} = new Gtk2::Entry;
+ $self->{proxyurl}->set_text($options->proxy);
+ $self->{proxycb}->signal_connect('clicked' => sub {
+ if ($self->{proxycb}->get_active)
+ {
+ $self->{proxyurl}->set_editable(1);
+ }
+ else
+ {
+ $self->{proxyurl}->set_editable(0);
+ }
+ });
+ $tableInternet->attach($self->{proxycb}, 2, 3, 7, 8, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{proxyurl}, 3, 4, 7, 8, 'fill', 'shrink', 0, 0);
+
+ $self->{cookieJarcb} = new Gtk2::CheckButton($parent->{lang}->{OptionsCookieJar});
+ $self->{cookieJarcb}->set_active($options->cookieJar);
+ $self->{cookieJarcb}->signal_connect('clicked' => sub {
+ if ($self->{cookieJarcb}->get_active)
+ {
+ $self->{cookieJarPath}->lock(0);
+ }
+ else
+ {
+ $self->{cookieJarPath}->lock(1);
+ }
+ });
+ $tableInternet->attach($self->{cookieJarcb}, 2, 3, 8, 9, 'fill', 'fill', 0, 0);
+ $self->{cookieJarPath} = new GCFile($self,
+ $self->{parent}->{lang}->{OptionsCookieJar},
+ 'open',
+ 0 );
+ $tableInternet->attach($self->{cookieJarPath}, 3, 4, 8, 9, 'fill', 'fill', 0, 0);
+
+ my $labelFrom = new GCLabel($self->{parent}->{lang}->{OptionsFrom});
+ $self->{from} = new Gtk2::Entry;
+ $tableInternet->attach($labelFrom, 2, 3, 9, 10, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{from}, 3, 4, 9, 10, 'fill', 'fill', 0, 0);
+
+ $self->{mailerLabel} = new GCLabel($parent->{lang}->{OptionsMailer});
+ $self->{mailerOption} = new GCMenuList;
+ $self->initMailerOption;
+ $tableInternet->attach($self->{mailerLabel}, 2, 3, 10, 11, 'fill', 'fill', 0, 0);
+ $tableInternet->attach($self->{mailerOption}, 3, 4, 10, 11, 'fill', 'fill', 0, 0);
+
+ $self->{hboxSMTP} = new Gtk2::HBox(0,0);
+ my $SMTPLabel = new GCLabel($parent->{lang}->{OptionsSMTP});
+ $self->{smtp} = new Gtk2::Entry;
+ $self->{smtp}->set_text($options->smtp);
+ $self->{smtp}->set_width_chars(20);
+ $self->{hboxSMTP}->pack_start($SMTPLabel,0,0,0);
+ $self->{hboxSMTP}->pack_start($self->{smtp},0,0,5);
+ $tableInternet->attach($self->{hboxSMTP}, 4, 5, 10, 11, 'fill', 'fill', 0, 0);
+
+ $self->{mailerOption}->signal_connect('changed' => sub {
+ if ('SMTP' eq $self->{mailerOption}->getValue)
+ {
+ $self->{hboxSMTP}->show;
+ }
+ else
+ {
+ $self->{hboxSMTP}->hide;
+ }
+ });
+
+ my $mailersButton = new GCButton($parent->{lang}->{OptionsConfigureMailers});
+ $self->{hboxMua} = new Gtk2::HBox(0,0);
+ $self->{hboxMua}->pack_start($mailersButton,0,0,0);
+ $tableInternet->attach($self->{hboxMua}, 2, 4, 11, 12, 'fill', 'fill', 0, 0);
+ $mailersButton->signal_connect('clicked' => sub {
+ my $dialog = $self->{parent}->getDialog('MailPrograms');
+ $self->initMailerOption if $dialog->show;
+ });
+
+ my $vboxInternet = new Gtk2::VBox(0,0);
+ $vboxInternet->set_border_width(0);
+ $vboxInternet->pack_start($tableInternet,0,0,0);
+
+ ###################
+ # Features options
+ ###################
+ my $vboxConvenience = new Gtk2::VBox(0,0);
+ my $tableFeature = new Gtk2::Table(11, 5, 0);
+ $tableFeature->set_row_spacings($GCUtils::halfMargin);
+ $tableFeature->set_col_spacings($GCUtils::margin);
+ $tableFeature->set_border_width($GCUtils::margin);
+
+ $self->{confirm} = new Gtk2::CheckButton($parent->{lang}->{OptionsRemoveConfirm});
+ $self->{confirm}->set_active($options->confirm);
+ $self->{autosave} = new Gtk2::CheckButton($parent->{lang}->{OptionsAutoSave});
+ $self->{autosave}->set_active($options->autosave);
+ $self->{autoload} = new Gtk2::CheckButton($parent->{lang}->{OptionsAutoLoad});
+ $self->{autoload}->set_active(! $options->noautoload);
+ $self->{splash} = new Gtk2::CheckButton($parent->{lang}->{OptionsSplash});
+ $self->{splash}->set_active($options->splash);
+ $self->{splash}->set_active(1) if (! $options->exists('splash'));
+ $self->{spellCheck} = 0;
+ my $restoreAccelOffset = 0;
+ if ($GCBaseWidgets::hasSpellChecker)
+ {
+ $self->{spellCheck} = new Gtk2::CheckButton($parent->{lang}->{OptionsSpellCheck});
+ $self->{spellCheck}->set_active($options->spellCheck);
+ $restoreAccelOffset = 1;
+ }
+ $self->{OptionsRestoreAccelerators} = new Gtk2::Button($parent->{lang}->{OptionsRestoreAccelerators});
+ $self->{OptionsRestoreAccelerators}->signal_connect('clicked' => sub {
+ $self->{parent}->{menubar}->restoreDefaultAccels;
+ });
+
+
+ my $conveniencesLabel = new GCHeaderLabel($parent->{lang}->{OptionsFeaturesConveniencesGroup});
+ $tableFeature->attach($conveniencesLabel, 0, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{splash}, 2, 4, 1, 2, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{confirm}, 2, 4, 2, 3, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{autosave}, 2, 4, 3, 4, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{autoload}, 2, 4, 4, 5, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{spellCheck}, 2, 4, 5, 6, 'fill', 'fill', 0, 0)
+ if $self->{spellCheck};
+ $tableFeature->attach($self->{OptionsRestoreAccelerators}, 2, 3,
+ 5 + $restoreAccelOffset, 6 + $restoreAccelOffset,
+ 'fill', 'fill', 0, 0);
+
+ my $fileHistoryLabelText = $parent->{lang}->{MenuHistory};
+ $fileHistoryLabelText =~ s/_//g;
+ $self->{fileHistoryLabel} = new GCHeaderLabel($fileHistoryLabelText);
+ $tableFeature->attach($self->{fileHistoryLabel}, 0, 4, 9, 10, 'fill', 'fill', 0, 0);
+
+ $self->{labelHistorysize} = new GCLabel($parent->{lang}->{OptionsHistory});
+ my $adjHistory = Gtk2::Adjustment->new(0, 1, 20, 1, 1, 0) ;
+ $self->{historysize} = Gtk2::SpinButton->new($adjHistory, 0, 0);
+ $self->{buttonClearHistory} = new Gtk2::Button($parent->{lang}->{OptionsClearHistory});
+ $self->{buttonClearHistory}->signal_connect('clicked' => sub {
+ $self->{options}->history('');
+ });
+ $tableFeature->attach($self->{labelHistorysize}, 2, 3, 10, 11, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{historysize}, 3, 4, 10, 11, 'fill', 'fill', 0, 0);
+ $tableFeature->attach($self->{buttonClearHistory}, 2, 3, 11, 12, 'fill', 'fill', 0, 0);
+
+ $vboxConvenience->pack_start($tableFeature,0,0,0);
+
+ ###################
+ # Tab Gesture Stuff
+ ###################
+
+ my $tabs = Gtk2::Notebook->new();
+ $tabs->set_name('GCOptionsTabs');
+ $tabs->set_tab_pos('left');
+ $tabs->set_show_border(0);
+
+ my ($mainButton, $displayButton, $pathButton, $internetButton, $conveniencesButton);
+
+ $mainButton = GCImageBox->new_from_stock('gtk-home',
+ $parent->{lang}->{OptionsMain});
+ $displayButton = GCImageBox->new_from_stock('gtk-select-color',
+ $parent->{lang}->{OptionsDisplay});
+ $pathButton = GCImageBox->new_from_stock('gtk-directory',
+ $parent->{lang}->{OptionsPaths});
+ $internetButton = GCImageBox->new_from_stock('gtk-network',
+ $parent->{lang}->{OptionsInternet});
+ $conveniencesButton = GCImageBox->new_from_stock('gtk-properties',
+ $parent->{lang}->{OptionsConveniences});
+
+ $tabs->append_page_menu($vboxMain, $mainButton, Gtk2::Label->new($parent->{lang}->{OptionsMain}));
+ $tabs->append_page_menu($vboxDisplay, $displayButton, Gtk2::Label->new($parent->{lang}->{OptionsDisplay}));
+ $tabs->append_page_menu($vboxPath, $pathButton, Gtk2::Label->new($parent->{lang}->{OptionsPaths}));
+ $tabs->append_page_menu($vboxInternet, $internetButton, Gtk2::Label->new($parent->{lang}->{OptionsInternet}));
+ $tabs->append_page_menu($vboxConvenience, $conveniencesButton, Gtk2::Label->new($parent->{lang}->{OptionsConveniences}));
+
+ $tabs->set_tab_label_packing ($vboxMain, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxDisplay, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxPath, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxInternet, 1, 0, 'start');
+ $tabs->set_tab_label_packing ($vboxConvenience, 1, 0, 'start');
+
+ $self->vbox->pack_start($tabs, 1, 1, 0);
+ $self->{optionstabs}=$tabs;
+ $self->{expert} = new Gtk2::CheckButton($parent->{lang}->{OptionsExpertMode});
+ $self->{expert}->signal_connect('toggled' => sub {
+ $self->show_all;
+ });
+ $self->{expert}->set_border_width($GCUtils::margin);
+ $self->vbox->pack_start($self->{expert}, 0, 1, 0);
+
+ $self->{lang} = $parent->{lang};
+
+ return $self;
+ }
+
+}
+
+{
+ # Class used to let user select images options
+ package GCImagesOptionsDialog;
+ use base "GCModalDialog";
+ use GCItemsLists::GCListOptions;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{panel}->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->{panel}->saveValues;
+ $self->{parent}->{viewOptionsChanged} = 1;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ImagesOptionsTitle},
+ );
+
+ $self->{panel} = new GCImagesOptionsPanel($parent->{model}->{preferences}, $parent->{parent});
+ $self->{parent} = $parent;
+
+ $self->vbox->pack_start($self->{panel},1,1,0);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ # Class used to let user select detailed options
+ package GCDetailedOptionsDialog;
+ use base "GCModalDialog";
+ use GCItemsLists::GCListOptions;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->{panel}->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->{panel}->saveValues;
+ $self->{parent}->{viewOptionsChanged} = 1;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{DetailedOptionsTitle},
+ );
+
+ $self->{panel} = new GCDetailedOptionsPanel($parent->{model}->{preferences}, $parent->{parent});
+ $self->{parent} = $parent;
+
+ $self->vbox->pack_start($self->{panel},1,1,0);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+
+{
+ # Class used to let user select program to run
+ package GCProgramsOptionsDialog;
+ use base "GCModalDialog";
+
+ sub initValues
+ {
+ my $self = shift;
+
+ foreach (@{$self->{programs}})
+ {
+ $self->{paths}->{$_}->setValue($self->{parent}->{$_});
+ }
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+
+ foreach (@{$self->{programs}})
+ {
+ $self->{parent}->{$_} = $self->{paths}->{$_}->getValue;
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{OptionsProgramsSet},
+ );
+
+ $self->{programs} = ['browser', 'player', 'audio', 'imageEditor'];
+
+ my $tablePath = new Gtk2::Table(scalar @{$self->{programs}} + 1, 4);
+ $tablePath->set_row_spacings($GCUtils::halfMargin);
+ $tablePath->set_col_spacings($GCUtils::margin);
+ $tablePath->set_border_width($GCUtils::margin);
+
+ $self->{labelPrograms} = new GCHeaderLabel($parent->{lang}->{OptionsPrograms});
+ $tablePath->attach($self->{labelPrograms}, 0, 4, 0, 1, 'fill', 'fill', 0, $GCUtils::halfMargin);
+
+ my $line = 1;
+ foreach my $program(@{$self->{programs}})
+ {
+ my $label = new GCLabel($parent->{lang}->{'Options'.ucfirst($program)});
+ $tablePath->attach($label, 2, 3, $line, $line + 1, 'fill', 'fill', 0, 0);
+ $self->{paths}->{$program} = new GCFile($parent, $parent->{lang}->{OptionsProgramTitle});
+ $self->{paths}->{$program}->setWidth(40);
+ $tablePath->attach($self->{paths}->{$program}, 3, 4, $line, $line + 1, ['expand', 'fill'], 'fill', 0, 0);
+ $line++;
+ }
+
+ $tablePath->show_all;
+
+ $self->vbox->pack_start($tablePath,1,1,0);
+
+ bless ($self, $class);
+ return $self;
+ }
+}
+
+{
+ # Class used to let user select information to be displayed
+ package GCDisplayOptionsDialog;
+ use base "Gtk2::Dialog";
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->initValues;
+
+ $self->show_all;
+ my $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->saveValues;
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = $class->SUPER::new($parent->{lang}->{DisplayOptionsTitle},
+ $parent,
+ [qw/modal destroy-with-parent/],
+ @GCDialogs::okCancelButtons
+ );
+
+ bless($self, $class);
+
+ $self->{show} = {};
+ $self->{options} = $parent->{model}->{preferences};
+ $self->{parent} = $parent;
+
+ $self->{lang} = $parent->{lang};
+ $self->set_default_size(-1,480);
+ return $self;
+ }
+
+ sub createContent
+ {
+ my ($self, $model) = @_;
+
+ $self->{options} = $model->{preferences};
+ if ($self->{tabs})
+ {
+ $self->vbox->remove($self->{hboxActions});
+ $self->{hboxActions}->destroy;
+ $self->vbox->remove($self->{tabs});
+ $self->{tabs}->destroy;
+ }
+
+ $self->{fieldsInfo} = $model->getDisplayedInfo;
+ $self->{fields} = $model->getFieldsCopy;
+
+ #Add special items
+ if (! $model->isPersonal)
+ {
+ unshift @{$self->{fields}}, 'searchButton';
+ unshift @{$self->{fieldsInfo}->[0]->{items}},
+ {id => 'searchButton',
+ label => $model->getDisplayedText('PanelSearchButton')};
+ }
+ $self->createComponents;
+ $self->initValues;
+ }
+
+ sub initValues
+ {
+ my $self = shift;
+ $self->{show} = {};
+
+ foreach (@{$self->{fields}})
+ {
+ my $isShown = 1;
+ $isShown = 0 if ($self->{options}->hidden =~ m/\|$_\|/);
+ $self->{show}->{$_} = $isShown;
+ # Only set active if field exists. Works around problems caused trying
+ # to open corrupted collections
+ $self->{$_}->set_active($isShown)
+ if exists $self->{$_};
+ }
+ }
+
+ sub saveValues
+ {
+ my $self = shift;
+ $self->{show} = {};
+
+ my $hidden = '|';
+ foreach (@{$self->{fields}})
+ {
+ my $isShown = 0;
+ $isShown = 1 if $self->{$_}->get_active;
+ $self->{show}->{$_} = $isShown;
+ $hidden .= $_.'|' if !$isShown;
+ }
+ $self->{options}->hidden($hidden);
+ $self->{options}->save;
+ }
+
+ sub selectAll
+ {
+ my $self = shift;
+
+ foreach (@{$self->{fields}})
+ {
+ $self->{$_}->set_active(1);
+ }
+ }
+
+ sub initBox
+ {
+ my ($self, $box, $values) = @_;
+ $box->set_border_width(2);
+ foreach (@$values)
+ {
+ $self->{$_->{id}} = new Gtk2::CheckButton($_->{label});
+ $box->pack_start($self->{$_->{id}}, 0,0,5);
+ }
+ }
+
+ sub createComponents
+ {
+ my $self = shift;
+
+ $self->{tabs} = Gtk2::Notebook->new();
+ $self->{tabs}->set_border_width(12);
+ foreach (@{$self->{fieldsInfo}})
+ {
+ my $frame = new Gtk2::Frame();
+ $frame->set_shadow_type('none');
+ $frame->set_border_width($GCUtils::margin);
+ $frame->set_label_align(1.0, 0.0);
+ my $vbox = new Gtk2::VBox(0,0);
+ $self->initBox($vbox, $_->{items});
+ my $scroll = new Gtk2::ScrolledWindow;
+ $scroll->set_policy ('automatic', 'automatic');
+ $frame->add($scroll);
+ $scroll->add_with_viewport($vbox);
+ $scroll->set_shadow_type('none');
+ $scroll->child->set_shadow_type('none');
+ $self->{tabs}->append_page($frame, $_->{title});
+ }
+
+ $self->{hboxActions} = new Gtk2::HBox(0,0);
+ my $allButton = new Gtk2::Button($self->{lang}->{DisplayOptionsAll});
+ $allButton->signal_connect( clicked => sub {
+ $self->selectAll;
+ });
+ $self->{hboxActions}->pack_end($allButton,1,0,20);
+
+ $self->vbox->pack_start($self->{tabs}, 1, 1, 2);
+ $self->vbox->pack_start($self->{hboxActions}, 0, 0, 10);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPanel.pm b/lib/gcstar/GCPanel.pm
new file mode 100644
index 0000000..756ee65
--- /dev/null
+++ b/lib/gcstar/GCPanel.pm
@@ -0,0 +1,1540 @@
+package GCPanel;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+use GCBorrowings;
+use GCGraphicComponents::GCBaseWidgets;
+
+use strict;
+
+{
+ package GCItemPanel;
+ @GCItemPanel::ISA = ('Gtk2::Frame');
+
+ sub new
+ {
+ my ($proto, $parent, $options, $layout) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless ($self, $class);
+
+ $self->{disableBorrowerChange} = 0;
+ $self->{autoUpdate} = 1;
+ $self->{previouslyHidden} = 0;
+
+ $self->{expanders} = [];
+ $self->{dateFields} = [];
+ $self->{longTextFields} = [];
+ $self->{formatted} = [];
+ #Stores for each fields the widgets which depends on it
+ # (used for formatted and launcher)
+ $self->{dependencies} = {};
+
+ $self->{parent} = $parent;
+ $self->{lang} = $parent->{lang};
+ $self->{options} = $options;
+ $self->{layout} = $layout;
+ $self->set_shadow_type('none');
+
+ #$self->{defaultImage} = $parent->getDefaultImage;
+ $self->{tooltips} = $parent->{tooltips};
+
+ $self->{infoBox} = new Gtk2::VBox(1,0);
+ $self->{viewAllBox} = new Gtk2::EventBox;
+ $self->{viewAllVBox} = new Gtk2::VBox(0,0);
+ $self->{viewAll} = new Gtk2::HBox(0,0);
+ $self->{viewAllButton} = new Gtk2::Button->new_from_stock('gtk-refresh');
+ $self->{viewAll}->pack_start($self->{viewAllButton},1,0,50);
+ $self->{viewAllVBox}->pack_start($self->{viewAll},0,0,0);
+ $self->{viewAllBox}->add($self->{viewAllVBox});
+ $self->{viewAllButton}->signal_connect('clicked' => sub {
+ $self->{parent}->viewAllItems;
+ });
+
+ $self->{margin} = $GCUtils::margin;
+ $self->{halfMargin} = $GCUtils::halfMargin;
+ $self->{quarterMargin} = $GCUtils::quarterMargin;
+
+ return $self;
+ }
+
+ sub loadStyles
+ {
+ my ($self, $style) = @_;
+ }
+
+
+ sub setExpandersMode
+ {
+ my ($self, $mode) = @_;
+ $_->setMode($mode)
+ foreach (@{$self->{expanders}});
+ }
+
+ sub setDateFormat
+ {
+ my ($self, $format) = @_;
+ foreach (@{$self->{dateFields}})
+ {
+ $_->setFormat($format);
+ $_->resetChanged;
+ }
+ }
+
+ sub setSpellChecking
+ {
+ my ($self, $activate, $lang) = @_;
+ foreach (@{$self->{longTextFields}})
+ {
+ $_->setSpellChecking($activate, $lang);
+ }
+ }
+
+ sub createContent
+ {
+ my ($self, $model) = @_;
+ return if $self->{model}
+ && ($self->{model}->getName eq $model->getName);
+
+ if ($self->{model})
+ {
+ my @children = $self->{mainBox}->get_children;
+ $self->{mainBox}->remove($_) foreach (@children);
+ foreach (@{$self->{toDestroy}})
+ {
+ $_->destroy if $_;
+ }
+ }
+
+ $self->{model} = $model;
+ $self->{fieldsInfo} = $self->{model}->{fieldsInfo};
+ $self->{toDestroy} = [];
+ foreach (@{$model->{fieldsNames}})
+ {
+ $self->{$_} = $self->createItem($self->{model}->{fieldsInfo}->{$_});
+ push @{$self->{toDestroy}}, $self->{$_};
+ $self->{$_.'Label'} = $self->createLabel($self->{model}->{fieldsInfo}->{$_}, $self->{withSeparator});
+ push @{$self->{toDestroy}}, $self->{$_.'Label'};
+ }
+ $self->createSpecial;
+
+ $self->{displayedValues} = {};
+ $self->createLayout($self->{layout}, $self->{layoutBox});
+
+ $self->show_all;
+ }
+
+ sub initShow
+ {
+ my ($self, $show, $hasToShow) = @_;
+
+ $self->{show} = $show;
+
+ if ($hasToShow)
+ {
+ $self->show_all;
+ $self->{infoBox}->hide;
+ return 1;
+ }
+ else
+ {
+ $self->hide(0);
+ $self->{previouslyHidden} = 1;
+ return 0;
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+ $self->{mainBox}->show;
+ $self->{infoBox}->hide;
+ $self->setShowOption($self->{show}, 1) if $self->{previouslyHidden};
+ $self->{previouslyHidden} = 0;
+ }
+
+ sub setShowOption
+ {
+ my ($self, $show, $hasToShow) = @_;
+ return if ! $self->initShow($show, $hasToShow);
+ my %parentsToHide;
+ foreach (keys %{$show})
+ {
+ $self->{$_.'Label'}->hide if (! $show->{$_}) && ($self->{$_.'Label'});
+ my $widget = $self->{$_};
+ if ($widget)
+ {
+ if ($show->{$_})
+ {
+ # Useful for GCLinkedComponent
+ $widget->show if !$widget->isa('Gtk2::Widget');
+ #$parentsToHide{$widget->{realParent}} = 0;
+ my $parent = $widget->{realParent};
+ while ($parent)
+ {
+ $parentsToHide{$parent} = 0;
+ $parent = $parent->{realParent};
+ }
+ foreach my $dependency(@{$self->{dependencies}->{$_}})
+ {
+ $parentsToHide{$dependency->{realParent}} = 0;
+ }
+ }
+ else
+ {
+ $widget->hide;
+ $parentsToHide{$widget->{realParent}} = $widget->{realParent} if ! exists $parentsToHide{$widget->{realParent}};
+ foreach my $dependency(@{$self->{dependencies}->{$_}})
+ {
+ $dependency->hide;
+ }
+ }
+ }
+ }
+
+ foreach (keys %parentsToHide)
+ {
+ if ($parentsToHide{$_})
+ {
+ $parentsToHide{$_}->hide;
+ $parentsToHide{$_}->{realParent}->hide
+ if ($parentsToHide{$_}->{realParent})
+ && ($parentsToHide{$_}->{realParent}->isa('GCExpander'));
+ }
+ }
+
+ $self->setShowOptionForSpecials($show, $hasToShow);
+ }
+
+ sub setShowOptionForSpecials
+ {
+ my ($self, $show, $hasToShow) = @_;
+ }
+
+ sub hide
+ {
+ my ($self, $filtering) = @_;
+ $self->{infoBox}->show_all;
+ if ($filtering)
+ {
+ $self->{warning}->set_markup('<b>'.$self->{lang}->{AllItemsFiltered}.'</b>');
+ }
+ else
+ {
+ $self->{warning}->set_markup($self->{lang}->{Warning}) if !$filtering;
+ $self->{viewAllBox}->hide;
+ }
+ $self->{mainBox}->hide;
+ }
+
+ sub showMe
+ {
+ my $self = shift;
+ my $parent = $self->parent;
+ while ($parent)
+ {
+ last if ($parent->isa('Gtk2::Window'));
+ $parent = $parent->parent;
+ }
+ $parent->present if $parent;
+ }
+
+ sub isReadOnly
+ {
+ return 1;
+ }
+
+ sub getAsHash
+ {
+ my $self = shift;
+ my $hash = {};
+ $hash->{$_} = $self->$_ foreach(@{$self->{parent}->{model}->{fieldsNames}});
+ return $hash;
+ }
+
+ sub getValue
+ {
+ my ($self, $field) = @_;
+
+ return $self->$field;
+ }
+
+ sub disableBorrowerChange
+ {
+ my $self = shift;
+ $self->{disableBorrowerChange} = 1;
+ }
+
+ sub disableAutoUpdate
+ {
+ my $self = shift;
+ $self->{autoUpdate} = 0;
+ }
+
+ sub dataChanged
+ {
+ my ($self, $info, $withoutPanel) = @_;
+
+ if (!$withoutPanel)
+ {
+ foreach (@{$self->{expanders}})
+ {
+ $self->setExpanderLabel($_, 1);
+ }
+ }
+ foreach (@{$self->{formatted}})
+ {
+ $self->setFormattedLabel($_, 1, $info, $withoutPanel);
+ }
+ }
+
+ sub createLabel
+ {
+ my ($self, $info, $withSeparator) = @_;
+
+ my $label = $self->{model}->getDisplayedText($info->{label});
+ $label .= $self->{parent}->{lang}->{Separator} if $withSeparator;
+ my $widget = new Gtk2::Label($label);
+ $widget->set_alignment(0, 0.5);
+ return $widget;
+ }
+
+ sub createExpander
+ {
+ my ($self, $label) = @_;
+
+ return new GCExpander($label);
+ }
+
+ sub formatLabel
+ {
+ my ($self, $format, $info) = @_;
+
+ my $label = $format;
+
+ # Remove from format conditional part using this format:
+ # =field.....=
+ $label =~ s/\=(\w*)([^\=]*)\=/($self->{show}->{$1}) ? $2 : ''/eg;
+
+ # Allow formatting using %fields[format]%
+ if ($info)
+ {
+ $label =~ s/%(.*?)(\[(.*?)\])*%/$3 ? sprintf($3,$info->{$1}) : $info->{$1}/eg;
+ }
+ else
+ {
+ $label =~ s/%(.*?)(\[(.*?)\])*%/$3 ? sprintf($3,$self->{$1}->getValue(1)) : $self->{$1}->getValue(1)/eg;
+ }
+ if ($label =~ /^=(.*)$/)
+ {
+ $label = eval $1;
+ }
+
+ $label =~ s/@(.*?)@/$self->{model}->getDisplayedText($1)/eg;
+
+ # Strings between ^ cannot be on the end or on the beginning.
+ # Typically used for separators
+ $label =~ s/^\^([^\^]*)\^//;
+ $label =~ s/\^([^\^]*)\^$//;
+ $label =~ s/\^//g;
+
+ return $label;
+ }
+
+ sub setExpanderLabel
+ {
+ my ($self, $expander, $init) = @_;
+
+ if ($expander->{collapsedTemplate}
+ && ($expander->get_expanded xor $init))
+ {
+ my $label = $self->formatLabel($expander->{collapsedTemplate});
+ $expander->setValue($expander->{originalLabel}.($label ? $self->{parent}->{lang}->{Separator} : ""),
+ $self->formatLabel($expander->{collapsedTemplate}));
+ }
+ else
+ {
+ $expander->setValue($expander->{originalLabel});
+ }
+ }
+
+ sub setAsFormatted
+ {
+ my ($self, $widget, $name, $format) = @_;
+ $widget->{format} = $format;
+ $widget->{name} = $name;
+ push @{$self->{formatted}}, $widget;
+ while ($format =~ /%(.*?)%/g)
+ {
+ push @{$self->{dependencies}->{$1}}, $widget;
+ }
+ }
+
+ sub setFormattedLabel
+ {
+ my ($self, $label, $init, $info, $withoutPanel) = @_;
+
+ my $name = $label->{name};
+ if ($withoutPanel)
+ {
+ $info->{$name} = $self->formatLabel($label->{format}, $info);
+ }
+ else
+ {
+ $self->$name($self->formatLabel($label->{format}));
+ # We store here the value so it could be used by caller if needed
+ # The user is GCData::updateSelectedItemInfoFromPanel
+ $info->{$name} = $self->$name if defined $info;
+ }
+ }
+
+ sub prepareDate
+ {
+ my ($self, $value) = @_;
+
+ return GCUtils::timeToStr($value, $self->{parent}->{options}->dateFormat)
+ }
+
+ sub addToContainer
+ {
+ my ($self, $container, $widget, $info) = @_;
+ $info->{expand} = 'default' if !exists $info->{expand};
+ if ($container->isa('Gtk2::Notebook'))
+ {
+ $container->append_page($widget,
+ $self->{model}->getDisplayedText($info->{title}));
+ }
+ elsif ($container->isa('Gtk2::Table'))
+ {
+ my $left = $info->{col};
+ my $right = $left + ($info->{colspan} ? $info->{colspan} : 1);
+ my $top = $info->{row};
+ my $bottom = $top + ($info->{rowspan} ? $info->{rowspan} : 1);
+ my $fill = [];
+ push @$fill, 'fill' if $info->{expand} ne 'false';
+ push @$fill, 'expand' if $info->{expand} eq 'true';
+ if ($info->{expand} eq 'shrink')
+ {
+ $fill = ['expand', 'fill'];
+ my $hbox = new Gtk2::HBox(0,0);
+ $hbox->pack_start($widget,0,0,0);
+ $widget = $hbox;
+ }
+ if ($info->{expand} eq 'horizontal')
+ {
+ $container->attach($widget,
+ $left, $right, $top, $bottom,
+ ['expand', 'fill'], [],
+ 0, 0);
+ }
+ else
+ {
+ $container->attach($widget,
+ $left, $right, $top, $bottom,
+ $fill, $fill,
+ 0, 0);
+ }
+ }
+ else
+ {
+ my $expand = ($info->{expand} eq 'true') ? 1 : 0;
+ if ($container->isa('Gtk2::VBox'))
+ {
+ my $margin = $self->{halfMargin};
+ $margin = 0 if (exists $info->{nomargin}) && ($info->{nomargin} eq 'true');
+ if ((exists $info->{place}) && ($info->{place} eq 'end'))
+ {
+ $container->pack_end($widget, $expand, $expand, $margin);
+ }
+ else
+ {
+ $container->pack_start($widget, $expand, $expand, $margin);
+ }
+ }
+ else
+ {
+ my $margin = $self->{halfMargin};
+ $margin = 0 if (exists $info->{nomargin}) && ($info->{nomargin} eq 'true');
+ if (($container->get_children) && (!$container->get_homogeneous) && ($margin > 0))
+ {
+ my $marginBox = new Gtk2::HBox(0,0);
+ $container->pack_start($marginBox, 0, 0, $margin);
+ }
+ $container->pack_start($widget, $expand, $expand, 0)
+ if ref($widget) ne 'HASH';
+ }
+ }
+ }
+
+ sub setWidgetStyle
+ {
+ my ($self, $widget, $name, $style) = @_;
+ }
+
+ sub getWidget
+ {
+ my ($self, $field, $info) = @_;
+ return $self->{$field};
+ }
+
+ sub createLayout
+ {
+ my ($self, $xml, $container, $parent, $noTab) = @_;
+ #
+ foreach (@{$xml->{item}})
+ {
+ my $widget;
+ my $box;
+ my $isContainer = 0;
+
+ # TODO We should return an error here
+ $_->{type} = 'default' if ! exists $_->{type};
+
+ if ($_->{type} eq 'formatted')
+ {
+ my $info = {};
+ $info->{type} = 'short text';
+ $info->{value} = $_->{name};
+ $widget = $self->createItem($info);
+ $self->{$_->{name}} = $widget;
+ $self->setAsFormatted($widget, $_->{name}, $_->{value});
+ $_->{for} = $widget->{name};
+ }
+ elsif ($_->{type} eq 'value')
+ {
+ $widget = $self->getWidget($_->{for}, $_);
+ if ($widget)
+ {
+ $widget->setWidth($_->{width}) if $_->{width};
+ $widget->setHeight($_->{height}) if $_->{height};
+ $widget->expand if (exists $_->{expand}) && ($_->{expand} eq 'true');
+ if ($_->{values} || $self->{model}->{fieldsInfo}->{$_->{for}}->{values})
+ {
+ $self->{displayedValues}->{$_->{for}} =
+ $_->{values}
+ || $self->{model}->{fieldsInfo}->{$_->{for}}->{values};
+ }
+ # If the item is related to another, it has to be hidden with it
+ if (exists $self->{model}->{fieldsInfo}->{$_->{for}}->{relatedto})
+ {
+ my $relatedTo = $self->{model}->{fieldsInfo}->{$_->{for}}->{relatedto};
+ push @{$self->{dependencies}->{$relatedTo}}, $widget;
+ }
+ }
+ }
+ elsif ($_->{type} eq 'label')
+ {
+ if ($_->{for})
+ {
+ $widget = $self->{$_->{for}.'Label'};
+ }
+ else
+ {
+ $widget = $self->createLabel($_, $self->{withSeparator});
+ }
+ if ((exists $_->{align}) && ($_->{align} eq 'center'))
+ {
+ $widget->set_alignment(0.5, 0.5);
+ if ($self->{withSeparator})
+ {
+ my $label = $widget->get_label;
+ my $sep = $self->{parent}->{lang}->{Separator};
+ $label =~ s/$sep$//;
+ $widget->set_label($label);
+ }
+ }
+ $widget->set_alignment(0, 0) if (exists $_->{align}) && ($_->{align} eq 'top');
+ }
+ elsif ($_->{type} eq 'special')
+ {
+ $widget = $self->{$_->{for}};
+ $widget->{param} = $_->{param};
+ }
+ elsif ($_->{type} eq 'launcher')
+ {
+ my $valueWidget = $self->{$_->{for}};
+ my $format = $self->{model}->{fieldsInfo}->{$_->{for}}->{format};
+
+ # If the launcher is for a video or music file, label the button 'play'
+ if (($format eq 'video') || ($format eq 'audio'))
+ {
+ $widget = Gtk2::Button->new_from_stock('gtk-media-play');
+ }
+ elsif ($format eq 'program')
+ {
+ # For program launchers, label the button 'launch'
+ $widget = Gtk2::Button->new($self->{parent}->{lang}->{PanelLaunch});
+ }
+ else
+ {
+ # Label the button 'open'
+ $widget = Gtk2::Button->new_from_stock('gtk-open');
+ }
+
+ $widget->signal_connect('clicked' => sub {
+ $self->{parent}->launch($valueWidget->getValue, $format);
+ });
+ push @{$self->{dependencies}->{$_->{for}}}, $widget;
+ }
+ elsif ($_->{type} eq 'extractor')
+ {
+ $widget = Gtk2::Button->new($self->{parent}->{lang}->{ExtractButton});
+ my $valueWidget = $self->{$_->{for}};
+ $widget->signal_connect('clicked' => sub {
+ $self->{parent}->extractInfo($valueWidget->getValue, $self);
+ });
+ push @{$self->{dependencies}->{$_->{for}}}, $widget;
+ }
+ elsif ($_->{type} eq 'line')
+ {
+ my $homogeneous = (exists $_->{homogeneous} && ($_->{homogeneous} eq 'true'))
+ ? 1 : 0;
+ $widget = new Gtk2::HBox($homogeneous, $self->{margin});
+ #$widget->set_border_width($self->{halfMargin});
+ $widget->set_size_request(-1, $_->{height}) if $_->{height};
+ $box = $widget;
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'box')
+ {
+ $widget = new Gtk2::VBox(0,0);
+ #$widget->set_border_width($self->{halfMargin});
+ $box = $widget;
+ if ($_->{width})
+ {
+# $widget = new Gtk2::EventBox;
+# $widget->add($box);
+ $widget->set_size_request($_->{width}, -1);
+ }
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'notebook')
+ {
+ if ($noTab)
+ {
+ $widget = new Gtk2::VBox(0,0);
+ }
+ else
+ {
+ $widget = new Gtk2::Notebook;
+ }
+ #$widget->set_border_width($self->{margin});
+ $box = $widget;
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'tab')
+ {
+ $widget = new Gtk2::VBox(0,0);
+ if ($noTab)
+ {
+ my $label = new Gtk2::Label;
+ $label->set_markup('<b>'.$self->{model}->getDisplayedText($_->{title}).'</b>');
+ $label->set_alignment(0,0);
+ $widget->pack_start($label, 0, 0, 0);
+ $widget->set_border_width(0);
+ $box = new Gtk2::VBox(0,0);
+ $box->set_border_width($self->{margin});
+ $widget->pack_start($box, 1, 1, 0);
+ }
+ else
+ {
+ $widget->set_border_width($self->{margin});
+ $box = $widget;
+ }
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'table')
+ {
+ $widget = new Gtk2::Table($_->{rows},$_->{cols});
+ #$widget->set_border_width($self->{margin});
+ $widget->set_col_spacings($self->{colSpacing});
+ $widget->set_row_spacings($self->{rowSpacing});
+ $box = $widget;
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'frame')
+ {
+ $widget = new GCGroup($self->{model}->getDisplayedText($_->{title}));
+ $widget->set_border_width(0);
+ $widget->setPadding(0);
+ $box = new Gtk2::Table($_->{rows},$_->{cols});
+ $box->set_border_width($self->{halfMargin});
+ $box->set_col_spacings($self->{margin});
+ $box->set_row_spacings($self->{halfMargin});
+ $widget->addWidget($box);
+ $isContainer = 1;
+ }
+ elsif ($_->{type} eq 'expander')
+ {
+ #$widget = new GCExpander($self->{model}->getDisplayedText($_->{title}));
+ $widget = $self->createExpander($self->{model}->getDisplayedText($_->{title}));
+ $widget->setMode($self->{parent}->{options}->expandersMode);
+ $widget->{originalLabel} = $self->{model}->getDisplayedText($_->{title});
+ $widget->{collapsedTemplate} = $_->{collapsed};
+ $self->setExpanderLabel($widget, 1);
+ $widget->signal_connect('activate' => sub {
+ $self->setExpanderLabel($widget, 0);
+ });
+ $widget->set_expanded(1) if (defined $_->{expanded}) && ($_->{expanded} eq 'true');
+ push @{$self->{expanders}}, $widget;
+ $box = new Gtk2::VBox(0,0);
+ $box->set_border_width($self->{halfMargin});
+ $widget->add($box);
+ $isContainer = 1;
+ $_->{style} = 'expander' if !exists $_->{style};
+ }
+
+ if (exists $_->{border})
+ {
+ $widget->set_border_width($_->{border});
+ }
+
+ if (exists $_->{collapse})
+ {
+ $widget->{collapse} = $_->{collapse};
+ }
+
+ if ($isContainer)
+ {
+ $self->createLayout($_, $box, $widget, $noTab);
+ }
+ push @{$self->{toDestroy}}, $widget;
+ $widget->{realParent} = $parent if $parent;
+ $self->setWidgetStyle($widget, $_->{for}, $_->{style}) if $_->{style};
+ $self->addToContainer($container, $widget, $_) if $widget;
+ }
+ }
+}
+
+{
+ package GCReadOnlyPanel;
+
+ use Glib::Object::Subclass
+ Gtk2::Frame::
+ ;
+
+ @GCReadOnlyPanel::ISA = ('GCItemPanel');
+
+ use File::Basename;
+
+ sub new
+ {
+ my ($proto, $parent, $options, $layout) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $options, $layout);
+
+ bless ($self, $class);
+
+ $self->{withSeparator} = 0;
+ $self->{colSpacing} = $self->{quarterMargin};
+ $self->{rowSpacing} = $self->{quarterMargin};
+ $self->loadStyles($options->panelStyle);
+
+ $self->{inBox} = new Gtk2::VBox(0, 0);
+ $self->{inBox}->set_border_width($self->{margin});
+
+ $self->set_name('GCItemFrame');
+
+ $self->{inBox} = new Gtk2::VBox(0, 0);
+ my $hboxMargins = new Gtk2::HBox(0,0);
+ $hboxMargins->pack_start($self->{inBox}, 1, 1, 50);
+ $self->{mainBox} = new Gtk2::EventBox;
+ $self->{mainBox}->modify_bg('normal', $self->{styles}->{page}->{bgColor});
+ $self->{mainBox}->add($hboxMargins);
+
+ my $realMain = new Gtk2::VBox(0,0);
+
+# GCUtils::setWidgetPixmap($self->{mainBox},$ENV{GCS_SHARE_DIR}.'/logos/splash.png');
+
+# $self->{backgroundPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/logos/splash.png');
+# $self->{mainBox}->signal_connect('expose-event' => sub {
+# $self->paintBg;
+# });
+
+ $realMain->pack_start($self->{mainBox},1,1,0);
+
+ $self->{layoutBox} = $self->{inBox};
+
+ $self->add($realMain);
+ $self->show_all;
+
+
+ $self->{warning} = new Gtk2::Label;
+
+ $self->{infoBox}->pack_start($self->{warning},1,1,0);
+ $self->{infoBox}->pack_start($self->{viewAllBox},1,1,0);
+ $realMain->pack_start($self->{infoBox},1,1,0);
+
+ return $self;
+ }
+
+ sub loadStyles
+ {
+ my ($self, $style) = @_;
+
+ $self->{styles} = {};
+ my $styleFile = $ENV{GCS_SHARE_DIR}.'/panels/'.$style;
+
+ open STYLE, $styleFile;
+ while (<STYLE>)
+ {
+ chomp;
+ next if !$_;
+ m/^(.*?)\s*=\s*(.*)$/;
+ my $item = $1;
+ (my $value = $2) =~ s/^"(.*?)"$/$1/;
+ $item =~ /(.*?)(Bg|Color|Style|Justify|Arrow|Prelight)/;
+ my $comp = $1;
+ my $style = lc $2;
+ $self->{styles}->{$comp}->{$style} = $value;
+ }
+ close STYLE;
+ foreach (keys %{$self->{styles}})
+ {
+ $self->{styles}->{$_}->{bgColor} = Gtk2::Gdk::Color->parse($self->{styles}->{$_}->{bg});
+ $self->{styles}->{$_}->{style} = $self->{styles}->{$_}->{style}
+ . " foreground='".$self->{styles}->{$_}->{color}."'";
+ }
+ #$self->{styles}->{invisible}->{}
+ }
+
+ sub deactivate
+ {
+ my $self = shift;
+ }
+
+ sub getValues
+ {
+ my ($self, $field) = @_;
+ if ($field eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ my $borrowers = $self->{model}->getValues($self->{model}->{commonFields}->{borrower}->{name});
+ shift @{$borrowers} if !$borrowers->[0]->{displayed};
+ return $borrowers;
+ }
+ else
+ {
+ return $self->{$field}->getValues;
+ }
+ }
+
+
+ sub selectTitle
+ {
+ my $self = shift;
+ $self->myRealize;
+ }
+
+# sub paintBg
+# {
+# my $self = shift;
+# my $window = $self->{mainBox}->window;
+# $self->{mainBox}->set_app_paintable(1);
+# if (! $self->{gcMain})
+# {
+# $self->{gcMain} = Gtk2::Gdk::GC->new($window);
+# }
+# $window->draw_pixbuf($self->{gcMain}, $self->{backgroundPixbuf}, 0, 0, 0, 0, -1, -1, "none", 5, 5);
+# }
+
+ sub setBorrowers
+ {
+ my ($self) = @_;
+ }
+
+ sub createSpecial
+ {
+ my $self = shift;
+ }
+
+ sub createLabel
+ {
+ my ($self, $info) = @_;
+
+ my $label = $self->{model}->getDisplayedText($info->{label});
+ my $widget = new GCColorLabel($self->{styles}->{label}->{bgColor});
+ $widget->set_selectable(0);
+ $widget->set_padding(5,5);
+ $widget->set_justify('fill');
+ $widget->set_markup("<span ".$self->{styles}->{label}->{style}.">".$label.'</span>');
+ return $widget;
+ }
+
+ sub createExpander
+ {
+ my ($self, $label) = @_;
+
+ return new GCColorExpander($label,
+ $self->{styles}->{expander}->{bgColor},
+ $self->{styles}->{expander}->{style});
+ }
+
+ sub setWidgetStyle
+ {
+ my ($self, $widget, $name, $style) = @_;
+ $self->{style}->{$name} = $style;
+ if ($self->{styles}->{$style}->{bgColor})
+ {
+ $widget->modify_bg('normal', $self->{styles}->{$style}->{bgColor});
+ }
+
+ if ($widget->isa('GCColorLabel') || $widget->isa('GCColorText'))
+ {
+ my $justify = $self->{styles}->{$style}->{justify};
+ $widget->set_justify($justify) if $justify;
+ }
+
+ if ($widget->isa('GCColorExpander'))
+ {
+ my $arrowColor = Gtk2::Gdk::Color->parse($self->{styles}->{expander}->{arrow});
+ my $prelightColor;
+ if (exists $self->{styles}->{expander}->{prelight})
+ {
+ $prelightColor = Gtk2::Gdk::Color->parse($self->{styles}->{expander}->{prelight});
+ }
+ else
+ {
+ $prelightColor = $self->{styles}->{expander}->{bgColor};
+ }
+
+ $widget->modify_bg('prelight', $prelightColor);
+ $widget->get_label_widget->modify_bg('prelight', $prelightColor);
+ $widget->modify_fg('normal', $arrowColor);
+ $widget->modify_fg('prelight', $arrowColor);
+ }
+ }
+
+ sub createItem
+ {
+ my ($self, $info) = @_;
+
+ my $widget;
+
+ if ($info->{type} eq 'long text')
+ {
+ $widget = new GCColorText($self->{styles}->{field}->{bgColor}, 0);
+ $self->{style}->{$info->{value}} = 'field';
+ }
+ elsif ($info->{type} eq 'image')
+ {
+ $widget = new GCItemImage($self->{parent}->{options},
+ $self->{parent});
+ }
+ elsif ($info->{type} eq 'button')
+ {
+ $widget = new GCButton($self->{model}->getDisplayedText($info->{label}));
+ }
+ elsif($info->{type} =~ /list$/o)
+ {
+ my $number = GCUtils::listNameToNumber($info->{type});
+ my @labels;
+ for my $i (1..$number)
+ {
+ push @labels, $self->{model}->getDisplayedText($info->{'label'.$i});
+ }
+ $widget = new GCColorTable($number, \@labels,
+ $self->{styles}->{label},
+ $self->{styles}->{field},
+ $self->{model}->getDisplayedText($info->{label}));
+ }
+ elsif ($info->{type} eq 'url')
+ {
+ $widget = new GCColorLink($self->{styles}->{field}->{bgColor}, $self->{parent});
+ $self->{style}->{$info->{value}} = 'field';
+ $widget->set_selectable(0);
+ }
+ else
+ {
+ # See GCColorLabel constructor for the meaning of listType;
+ $widget = new GCColorLabel($self->{styles}->{field}->{bgColor});
+ if ($info->{value} eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $self->{prepare}->{$info->{value}}->{func} = 'prepareBorrower';
+ }
+ elsif ($info->{type} eq 'date')
+ {
+ $self->{prepare}->{$info->{value}}->{func} = 'prepareDate';
+ }
+ $self->{style}->{$info->{value}} = 'field';
+ $widget->set_selectable(0);
+ $widget->set_padding(5,5);
+ $widget->set_justify('fill');
+ $self->setAsFormatted($widget, $info->{value}, $info->{init})
+ if ($info->{type} eq 'formatted');
+ }
+ $widget->{name} = $info->{value};
+ return $widget;
+ }
+
+ sub getWidget
+ {
+ my ($self, $field, $info) = @_;
+
+ my $widget = $self->{$field};
+ if ($info->{height} && $widget->isa('GCColorLabel'))
+ {
+ my $style = $info->{style};
+ $style = 'field' if !$style;
+ $widget->destroy;
+ $widget = new GCColorText($self->{styles}->{$style}->{bgColor}, 0);
+ $widget->{name} = $self->{$field}->{name};
+ $self->{$field} = $widget;
+ }
+ elsif ($widget->isa('GCColorTable') && ($info->{flat} eq 'true'))
+ {
+ my $columns = $widget->{number};
+ $widget->destroy;
+ $self->{prepare}->{$field}->{func} = 'prepareMultipleList';
+ $self->{prepare}->{$field}->{extra} = $columns;
+ if ($info->{height})
+ {
+ $widget = new GCColorText($self->{styles}->{field}->{bgColor}, 0, $columns);
+ }
+ else
+ {
+ $widget = new GCColorLabel($self->{styles}->{field}->{bgColor}, $columns);
+ $widget->set_selectable(0);
+ $widget->set_padding(5,5);
+ $widget->set_justify('fill');
+ }
+ $self->{style}->{$field} = 'field';
+ $self->{$field} = $widget;
+ }
+
+ return $widget;
+ }
+
+ sub prepareMultipleList
+ {
+ my ($self, $value, $extra) = @_;
+ return GCPreProcess::multipleList($value, $extra);
+ }
+
+ sub prepareBorrower
+ {
+ my ($self, $value) = @_;
+
+ $value = $self->{lang}->{PanelNobody} if $value eq 'none';
+ $value = $self->{lang}->{PanelUnknown} if $value eq 'unknown';
+ return $value;
+ }
+
+ sub AUTOLOAD
+ {
+ return if our $AUTOLOAD =~ /::DESTROY$/;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ return if !$name;
+ no strict 'refs';
+
+ *{$AUTOLOAD} = sub {
+ my $self = shift;
+ return 0 if !$self->{$name};
+ return $self->{$name.'Value'}
+ if !(scalar @_);
+ my $text = shift;
+ $self->{$name.'Value'} = $text;
+ if (my $func = $self->{prepare}->{$name}->{func})
+ {
+ $text = $self->$func($text, $self->{prepare}->{$name}->{extra});
+ }
+ $text = ' ' if ! defined $text;
+ $text = $self->{model}->getDisplayedValue($self->{displayedValues}->{$name}, $text)
+ if ($self->{displayedValues}->{$name});
+ if ($self->{$name})
+ {
+ # Hide collapsible fields if the field is empty
+ if (($text !~ m/\S+/) && ($self->{$name}->{collapse}))
+ {
+ $self->{$name}->hide;
+ }
+ else
+ {
+ # Otherwise, make sure the field is shown
+ $self->{$name}->show;
+ }
+
+ if ($self->{$name}->acceptMarkup)
+ {
+ $self->{$name}->setMarkup("<span ".
+ $self->{styles}->{$self->{style}->{$name}}->{style}.
+ ">".$self->{$name}->cleanMarkup($text, 1).'</span>');
+ }
+ else
+ {
+ $self->{$name}->setValue($text);
+ }
+ #$self->{$name}->resetChanged;
+ }
+ };
+ goto &{$AUTOLOAD};
+ }
+}
+
+
+{
+ package GCFormPanel;
+
+ use Glib::Object::Subclass
+ Gtk2::Frame::
+ ;
+ @GCFormPanel::ISA = ('GCItemPanel');
+
+ sub createSpecial
+ {
+ my $self = shift;
+
+ $self->{mailButton} = new GCButton($self->{parent}->{lang}->{MailTitle});
+ $self->{mailButton}->signal_connect('clicked' => sub {
+ $self->sendBorrowerEmail;
+ });
+ push @{$self->{toDestroy}}, $self->{mailButton};
+
+ $self->{itemBackButton} = new GCButton($self->{parent}->{lang}->{PanelReturned});
+ $self->{itemBackButton}->signal_connect('clicked' => sub {
+ $self->itemBack;
+ });
+ push @{$self->{toDestroy}}, $self->{mailButton};
+
+ $self->{searchButton} = GCButton->newFromStock('gtk-jump-to');
+ $self->{searchButton}->signal_connect('clicked' => sub {
+ $self->searchItem;
+ });
+ my @subMenuSearch;
+ $subMenuSearch[0]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextChooseOne});
+ $subMenuSearch[0]->signal_connect("activate" , sub {$self->searchItem('ask')});
+
+ $subMenuSearch[1]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextMultiSite});
+ $subMenuSearch[1]->signal_connect("activate" ,sub {$self->searchItem('multi')});
+
+ $subMenuSearch[2]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextMultiSitePerField});
+ $subMenuSearch[2]->signal_connect("activate" ,sub {$self->searchItem('multiperfield')});
+
+ $subMenuSearch[3]=Gtk2::ImageMenuItem->new_with_mnemonic($self->{parent}->{lang}->{PanelSearchContextOptions});
+ $subMenuSearch[3]->signal_connect("activate" ,sub {$self->{parent}->options(0,3)});
+
+ $self->{searchButton}->setContextMenu(\@subMenuSearch);
+ $self->{searchButton}->enableContextMenu;
+ $self->{tooltips}->set_tip($self->{searchButton}, $self->{parent}->{lang}->{PanelSearchTip}, '');
+ push @{$self->{toDestroy}}, $self->{searchButton};
+
+ $self->{deleteButton} = GCButton->newFromStock('gtk-delete');
+ $self->{deleteButton}->signal_connect("clicked" => \&deleteItem, $self);
+ $self->{tooltips}->set_tip($self->{deleteButton}, $self->{parent}->{lang}->{PanelRemoveTip}, '');
+ push @{$self->{toDestroy}}, $self->{deleteButton};
+
+ $self->{refreshButton} = new GCButton($self->{parent}->{lang}->{PanelRefresh});
+ $self->{refreshButton}->signal_connect("clicked" => sub {
+ $self->searchItem('refresh');
+ });
+ $self->{tooltips}->set_tip($self->{refreshButton}, $self->{parent}->{lang}->{PanelRefreshTip}, '');
+ push @{$self->{toDestroy}}, $self->{refreshButton};
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $options, $layout) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent, $options, $layout);
+
+ bless ($self, $class);
+
+ $self->{withSeparator} = 1;
+ $self->{locked} = 0;
+ $self->{colSpacing} = $self->{margin};
+ $self->{rowSpacing} = $self->{halfMargin};
+
+ $self->{mainBox} = new Gtk2::VBox(0, 0);
+ $self->{mainBox}->set_border_width($self->{margin});
+
+ $self->set_name('GCItemFrame');
+
+ my $realMain = new Gtk2::VBox(0,0);
+
+ $realMain->pack_start($self->{mainBox},1,1,0);
+ $self->{layoutBox} = $self->{mainBox};
+
+ $self->add($realMain);
+ $self->show_all;
+
+ $self->{warning} = new Gtk2::Label;
+
+ $self->{infoBox}->pack_start($self->{warning},1,1,0);
+ $self->{infoBox}->pack_start($self->{viewAllBox},1,1,0);
+ $realMain->pack_start($self->{infoBox},1,1,0);
+
+ return $self;
+ }
+
+ sub isReadOnly
+ {
+ return 0;
+ }
+
+ sub searchItem
+ {
+ my ($self, $pluginType) = @_;
+
+ #$self->{parent}->searchItemForPanel($self->{$self->{model}->{commonFields}->{title}}->getValue, $self);
+ if ($pluginType eq 'refresh')
+ {
+ $self->{parent}->refreshItemForPanel($self, $self->{$self->{model}->{commonFields}->{url}}->getValue);
+ }
+ else
+ {
+ $self->{parent}->searchItemForPanel($self, $pluginType);
+ $self->showMe;
+ }
+ }
+
+ sub checkBorrowerButtons
+ {
+ my $self = shift;
+ my $borrowerField = $self->{model}->{commonFields}->{borrower}->{name};
+ return if ! $self->{$borrowerField};
+ my $locked = (($self->{$borrowerField}->getValue eq 'none')
+ || ($self->{$borrowerField}->getValue eq 'unknown'));
+ $self->{mailButton}->lock($locked)
+ if $self->{mailButton};
+ $locked = ($self->{locked} || ($self->{$borrowerField}->getValue eq 'none'));
+ $self->{itemBackButton}->lock($locked)
+ if $self->{itemBackButton};
+ }
+
+ sub itemBack
+ {
+ my $self = shift;
+
+ my $isBack = 0;
+ my $dialog = new GCDateSelectionDialog($self->{parent}, $self->{lang}->{PanelReturned});
+ if ($dialog->show)
+ {
+ my $borrowerField = $self->{model}->{commonFields}->{borrower}->{name};
+ my $lendDateField = $self->{model}->{commonFields}->{borrower}->{date};
+ my $borrowingsField = $self->{model}->{commonFields}->{borrower}->{history};
+ my $coverField = $self->{model}->{commonFields}->{cover};
+ my @data = ($self->{$borrowerField}->getDisplayedValue,
+ $self->{$lendDateField}->getValue,
+ $dialog->date);
+ foreach (@data[1..2])
+ {
+ $_ = $self->prepareDate($_);
+ }
+ $self->{$borrowingsField}->addValues(@data);
+ my $previous = $self->getAsHash;
+ $self->{$borrowerField}->setValue('none');
+ $self->{$lendDateField}->clear;
+ my $new = $self->getAsHash;
+ $self->{parent}->{itemsView}->changeCurrent($previous, $new, $self->{parent}->{items}->getCurrent, 1)
+ if $self->$coverField;
+ $isBack = 1;
+ }
+ $self->showMe;
+ return $isBack;
+ }
+
+ sub lock
+ {
+ my ($self, $value) = @_;
+ $self->changeState($self, $value);
+ }
+
+ sub deactivate
+ {
+ my $self = shift;
+ $self->changeState($self,1);
+ }
+
+ sub changeState
+ {
+ my ($caller, $self, $locked) = @_;
+ $locked = 1 if $self->{parent}->{items}->getLock;
+ return if $self->{locked} == $locked;
+ $self->{locked} = $locked;
+ my $info;
+ foreach (@{$self->{parent}->{model}->{fieldsNames}})
+ {
+ $info = $self->{model}->{fieldsInfo}->{$_};
+ next if $info->{type} eq 'button';
+ $self->{$_}->lock($locked) if ($self->{$_});
+ }
+
+ $self->{searchButton}->lock($locked);
+ $self->checkBorrowerButtons;
+ $self->{deleteButton}->lock($locked);
+ $self->{refreshButton}->lock($locked);
+ }
+
+ sub setShowOptionForSpecials
+ {
+ my ($self, $show, $hasToShow) = @_;
+
+ if (! $show->{$self->{model}->{commonFields}->{borrower}->{name}})
+ {
+ $self->{mailButton}->hide;
+ $self->{itemBackButton}->hide;
+ }
+ }
+
+ sub setBorrowers
+ {
+ my $self = shift;
+
+ return if ! $self->{borrowerControl};
+
+ my $borrowers = $self->{model}->getValues($self->{model}->{commonFields}->{borrower}->{name});
+ shift @{$borrowers} if !$borrowers->[0]->{displayed};
+ $self->{borrowerControl}->setValues($borrowers);
+
+ return;
+ }
+
+ sub sendBorrowerEmail
+ {
+ use GCDialogs;
+
+ my $self = shift;
+
+ my %info;
+ $info{title} = $self->{$self->{model}->{commonFields}->{title}}->getValue;
+ $info{borrower} = $self->{$self->{model}->{commonFields}->{borrower}->{name}}->getValue;
+ $info{lendDate} = $self->prepareDate(
+ $self->{$self->{model}->{commonFields}->{borrower}->{date}}->getValue
+ );
+ $self->{parent}->sendBorrowerEmail(\%info);
+ }
+
+ sub selectTitle
+ {
+ my $self = shift;
+ my $titleField = $self->{model}->{commonFields}->{title};
+ #$self->{$titleField}->select_region(0, length($self->{$titleField}->getValue));
+ $self->{$titleField}->selectAll;
+ }
+
+ sub deleteItem
+ {
+ my ($widget, $self) = @_;
+
+ $self->{parent}->deleteCurrentItem;
+ }
+
+ sub createItem
+ {
+ my ($self, $info) = @_;
+
+ my $widget;
+
+ if (exists $info->{linkedto})
+ {
+ $widget = new GCLinkedComponent($self->{$info->{linkedto}});
+ }
+ elsif ($info->{type} eq 'short text')
+ {
+ $widget = new GCShortText;
+ $widget->signal_connect('activate', sub {
+ $self->searchItem;
+ }) if $self->{model}->isSearchField($info->{value});
+ }
+ elsif ($info->{type} eq 'long text')
+ {
+ $widget = new GCLongText;
+ $widget->setSpellChecking($self->{parent}->{options}->spellCheck);
+ push @{$self->{longTextFields}}, $widget;
+ }
+ elsif ($info->{type} eq 'history text')
+ {
+ $widget = new GCHistoryText;
+ }
+ elsif ($info->{type} eq 'options')
+ {
+ $info->{values} = $info->{value} if !$info->{values};
+ if ($info->{value} eq $self->{model}->{commonFields}->{borrower}->{name})
+ {
+ $widget = new GCMenuList;
+ #When borrower not found, we use the last choice: unknown
+ $widget->setLastForDefault;
+ $self->{borrowerControl} = $widget;
+ $widget->signal_connect('changed' => sub {
+ $self->checkBorrowerButtons;
+ });
+ $self->setBorrowers;
+ }
+ else
+ {
+ $widget = new GCMenuList($self->{model}->getValues($info->{values}), $info->{separator});
+ }
+ }
+ elsif ($info->{type} =~ /list$/o)
+ {
+ my $number;
+ my $readonly = 0;
+ my $withHistory = 1;
+ my @types;
+ my @labels;
+ $withHistory = 0
+ if (exists $info->{history}) && ($info->{history} eq 'false');
+ $readonly = 1
+ if $info->{value} eq $self->{model}->{commonFields}->{borrower}->{history};
+ $number = GCUtils::listNameToNumber($info->{type});
+ @types=split / / ,$info->{subtypes} if $info->{subtypes};
+ my $typesRef = \@types;
+ undef $typesRef if scalar(@types)!=$number;
+ if ($number == 1)
+ {
+ @labels = ($self->{model}->getDisplayedText($info->{label}));
+ }
+ else
+ {
+ for my $i (1..$number)
+ {
+ push @labels, $self->{model}->getDisplayedText($info->{'label'.$i});
+ }
+ }
+ $widget = new GCMultipleList($self, $number, \@labels, $withHistory, $readonly,0,$typesRef);
+ }
+ elsif ($info->{type} eq 'checked text')
+ {
+ $widget = new GCCheckedText($info->{format});
+ $widget->signal_connect('activate', sub {
+ $self->searchItem;
+ }) if $self->{model}->isSearchField($info->{value});
+ }
+ elsif ($info->{type} eq 'number')
+ {
+ if (($info->{displayas} eq 'graphical')
+ && ($self->{parent}->{options}->useStars))
+ {
+ $widget = new GCNumeric($info->{init}, 0, $info->{max}, 0, 'graphical');
+ }
+ else
+ {
+ if ((exists $info->{min}) && ($info->{min} ne ''))
+ {
+ $widget = new GCNumeric($info->{init},
+ $info->{min},
+ $info->{max},
+ $info->{step},
+ 'text');
+ }
+ else
+ {
+ $widget = new GCCheckedText('0-9.');
+ $widget->setReadOnly
+ if ($info->{value} eq $self->{model}->{commonFields}->{id});
+ }
+ $widget->signal_connect('activate', sub {
+ $self->searchItem;
+ }) if $self->{model}->isSearchField($info->{value});
+ }
+ }
+ elsif ($info->{type} eq 'image')
+ {
+ my $img = new GCItemImage($self->{parent}->{options},
+ $self->{parent});
+ my $isCover = 0;
+ $isCover = 1 if $info->{value} eq $self->{model}->{commonFields}->{cover};
+ #$img->setImmediate if $isCover;
+ $widget = new GCImageButton($self, $img, $isCover, $info->{default});
+ }
+ elsif ($info->{type} eq 'button')
+ {
+ if ($info->{format} eq 'url')
+ {
+ $widget = new GCUrlButton($self->{model}->getDisplayedText($info->{label}),
+ $self->{parent});
+ $info->{tip} = $self->{lang}->{PanelWebTip}
+ if $info->{value} eq $self->{model}->{commonFields}->{url};
+ }
+ else
+ {
+ $widget = new GCButton($self->{model}->getDisplayedText($info->{label}));
+ }
+ }
+ elsif ($info->{type} eq 'url')
+ {
+ $widget = new GCUrl($self->{parent});
+ }
+ elsif ($info->{type} eq 'yesno')
+ {
+ $widget = new GCCheckBox($self->{model}->getDisplayedText($info->{label}));
+ }
+ elsif ($info->{type} eq 'file')
+ {
+ $widget = new GCFile($self, undef, undef, undef, undef, 1, $info->{format});
+ }
+ elsif ($info->{type} eq 'date')
+ {
+ $widget = new GCDate($self, $self->{lang}, 0,
+ $self->{parent}->{options}->dateFormat);
+ push @{$self->{dateFields}}, $widget;
+ }
+ elsif ($info->{type} eq 'formatted')
+ {
+ $widget = new GCShortText;
+ $widget->setReadOnly;
+ $self->setAsFormatted($widget, $info->{value}, $info->{init});
+ }
+ else
+ {
+ print "Invalid type : ",$info->{type}," for ",$info->{value},"\n";
+ $widget = 0;
+ }
+
+ $widget->{name} = $info->{value} if $widget;
+ $self->{tooltips}->set_tip($widget, $self->{model}->getDisplayedText($info->{tip}), '')
+ if $info->{tip};
+ $widget->activateStateTracking;
+ return $widget;
+ }
+
+ sub getValues
+ {
+ my ($self, $field) = @_;
+ return $self->{$field}->getValues
+ if exists $self->{$field};
+ return [];
+ }
+
+ sub AUTOLOAD
+ {
+ return if our $AUTOLOAD =~ /::DESTROY$/;
+ (my $name = $AUTOLOAD) =~ s/.*?::(.*)/$1/;
+ return if !$name;
+ my $self = $_[0];
+ no strict 'refs';
+ {
+ *{$AUTOLOAD} = sub {
+ my $self = shift;
+ return 0 if !$self->{$name};
+ return $self->{$name}->getValue
+ if !(scalar @_);
+ $self->{$name}->setValue(shift);
+ };
+ }
+ goto &{$AUTOLOAD};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins.pm b/lib/gcstar/GCPlugins.pm
new file mode 100644
index 0000000..d7acbd5
--- /dev/null
+++ b/lib/gcstar/GCPlugins.pm
@@ -0,0 +1,1783 @@
+{
+ package GCPlugins;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use File::Basename;
+use GCUtils 'glob';
+use GCDialogs;
+
+use base 'Exporter';
+our @EXPORT = qw(%pluginsMap %pluginsNameArrays);
+
+our %pluginsMap;
+our %pluginsNameArrays;
+
+sub loadPlugins
+{
+ my $model = shift;
+ return if $pluginsNameArrays{$model};
+ my $dir = $ENV{GCS_LIB_DIR}.'/GCPlugins/'.$model;
+ foreach (glob "$dir/*.pm")
+ {
+ my $plugin = basename($_, '.pm')."\n";
+ next if $plugin =~ /Common/;
+ (my $class = $plugin) =~ s/^GC/GCPlugin/;
+ my $obj;
+ eval "use GCPlugins::".$model."::$plugin; \$obj = new GCPlugins::".$model."::$class;";
+ die "Fatal error with plugin $plugin : $@" if $@;
+ $pluginsMap{$model}->{$obj->getName} = $obj;
+ }
+ my @names = sort keys %{$pluginsMap{$model}};
+ $pluginsNameArrays{$model} = \@names;
+
+}
+
+sub loadAllPlugins
+{
+ foreach my $dir(glob $ENV{GCS_LIB_DIR}.'/GCPlugins/*')
+ {
+ next if $dir =~ /PluginsBase/;
+ my $model = basename($dir);
+ next if ($model !~ /^GC/) || ($model eq 'GCstar');
+ loadPlugins($model);
+ }
+}
+
+ {
+ package GCPluginJob;
+
+ use Storable qw(store_fd fd_retrieve);
+ use IO::Handle;
+ use GCPlugins::GCPluginsBase;
+
+ sub new
+ {
+ my ($proto, $command, $data) = @_;
+ my $class = ref($proto) || $proto;
+
+ my $self = {command => $command, data => $data};
+ $command->autoflush(1);
+ $data->autoflush(1);
+ #GCPlugins::loadPlugins if ! $ENV{GCS_PROFILING};
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub run
+ {
+ my $self = shift;
+ my $command = $self->{command};
+ my $info;
+ while (1)
+ {
+ local $Storable::forgive_me = 1;
+ $info = fd_retrieve($command);
+ eval {$self->beginSearch($info)};
+ }
+ }
+
+ sub quit
+ {
+ my $self = shift;
+ close $self->{command};
+ close $self->{data};
+ wait;
+ exit;
+ }
+
+ sub beginSearch
+ {
+ my ($self, $info) = @_;
+ my $pid;
+ GCPlugins::loadPlugins($info->{model}) if $info->{model};
+ if ($pid = fork)
+ {
+ my $command = $self->{command};
+ $command->autoflush(1);
+ my $cmd = readline($command);
+ chomp $cmd;
+ kill 9,$pid if ($cmd eq 'STOP');
+ $self->quit if $cmd eq 'EXIT';
+ wait;
+ }
+ else
+ {
+ #$info could be a simple hash or the plugin itself depending on the phase
+ if ($info->{type} eq 'load')
+ {
+ # Here we create the plugin
+ my $plugin = $pluginsMap{$info->{model}}->{$info->{name}};
+ $plugin->setProxy($info->{proxy});
+ $plugin->setCookieJar($info->{cookieJar});
+ $plugin->{type} = $info->{type};
+ $plugin->{urlField} = $info->{urlField};
+ $plugin->{bigPics} = $info->{bigPics};
+
+ $self->{currentPlugin} = $plugin;
+
+ $plugin->{title} = $info->{query};
+ $plugin->{searchField} = $info->{field};
+ $plugin->{pass} = $info->{pass};
+ $plugin->{nextUrl} = $info->{nextUrl};
+
+ $plugin->load;
+
+ # Remove the user agent part of the data, otherwise the Storable lib complains
+ # about not being able to store the sub's stored in it.
+ undef($plugin->{ua});
+
+ local $Storable::forgive_me = 1;
+ store_fd $plugin, $self->{data};
+ }
+ elsif ($info->{type} ne 'exit')
+ {
+ # Here we re-use it
+ my $plugin = $info;
+ store_fd $plugin->getItemInfo, $self->{data};
+ }
+ exit;
+ }
+ }
+ }
+
+ use Gtk2;
+
+ {
+ package GCPluginsDialog;
+
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ $self->{useThisSite}->set_active(0);
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{fieldsList}->hide if $self->{hideFieldsList};
+ my $path = $self->{pluginsList}->get_selection->get_selected_rows;
+ $self->{pluginsList}->scroll_to_cell($path) if $path;
+
+ my $response = $self->run;
+ $self->{plugin} = undef;
+ if ($response eq 'ok')
+ {
+ my $pluginName = '';
+ my $idx = ($self->{pluginsList}->get_selected_indices)[0];
+ $pluginName = $self->{pluginsList}->{data}->[$idx]->[0];
+
+ $self->{plugin} = $self->{model}->getPlugin($pluginName);
+
+ if ($self->{useThisSite}->get_active)
+ {
+ $self->{parent}->{model}->{preferences}->plugin($pluginName);
+ $self->{parent}->checkPlugin;
+ }
+ }
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{PluginsTitle},
+ 'gtk-jump-to'
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->{titleGroup} = new GCGroup($parent->{lang}->{PluginsQuery});
+ my $queryHbox = new Gtk2::HBox(0,0);
+ $self->{query} = new GCShortText;
+ $self->{query}->signal_connect(activate => sub {
+ $self->response('ok');
+ });
+
+ $self->{fieldsList} = new GCMenuList;
+ $queryHbox->pack_start($self->{query}, 1, 1, 0);
+ $queryHbox->pack_start($self->{fieldsList}, 0, 0, $GCUtils::halfMargin);
+ $self->{titleGroup}->addWidget($queryHbox);
+ $self->vbox->pack_start($self->{titleGroup}, 0, 0, 0);
+
+
+ my $pluginGroup = undef;
+ my $pluginsFrame = new GCGroup($parent->{lang}->{PluginsFrame});
+
+ $self->{pluginsList} = new Gtk2::SimpleList($parent->{lang}->{PluginsName} => "text",
+ $parent->{lang}->{PluginsLang} => "text",
+ $parent->{lang}->{PluginsSearchFields} => "text",
+ $parent->{lang}->{PluginsAuthor} => "text",
+ $parent->{lang}->{PluginsPreferred} => "pixbuf",);
+ $self->{pluginsList}->set_border_width(5);
+ $self->{pluginsList}->set_rules_hint(1);
+ $self->{pluginsList}->get_column(0)->set_min_width(150);
+ for my $i (0..2)
+ {
+ $self->{pluginsList}->get_column($i)->set_resizable(1);
+ }
+ $self->{pluginsList}->signal_connect(row_activated => sub {
+ $self->response('ok');
+ });
+
+ # Setup tooltips for list control
+ $self->{pluginsList}->set_has_tooltip(1);
+ $self->{pluginsList}->signal_connect (query_tooltip => sub {
+ my ($widget, $x, $y, $keyboard_mode, $tooltip) = @_;
+
+ # Place the tooltip in the right position
+ my $path = $self->{pluginsList}->get_path_at_pos ($x, $y);
+ return 0 unless $path;
+ $self->{pluginsList}->set_tooltip_row($tooltip, $path);
+
+ # If row is for a preferred plugin, set the tooltip
+ my $index = ($path->get_indices)[0];
+ if (${ $self->{pluginsList}->{data} }[$index][4] == $self->{starPixbuf})
+ {
+ $tooltip->set_text($parent->{lang}->{PluginsPreferredTooltip});
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+ });
+
+ # Pixbufs for preferred and standard plugins
+ $self->{starPixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/star.png');
+ $self->{blankPixbuf} = Gtk2::Gdk::Pixbuf->new ('rgb', 1, 8, 1, 1);
+ $self->{blankPixbuf}->fill(0x00000000);
+
+ $self->{currentPluginList} = undef;
+
+ #$self->setModel;
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_border_width(5);
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{pluginsList});
+
+ $self->{useThisSite} = Gtk2::CheckButton->new($parent->{lang}->{PluginsUseSite});
+
+ my $pluginBox = new Gtk2::VBox(0,0);
+ $pluginBox->pack_start($scrollPanelList, 1, 1, 0);
+ $pluginBox->pack_start(Gtk2::VBox->new, 0, 0, $GCUtils::halfMargin);
+ $pluginBox->pack_start($self->{useThisSite}, 0, 0, 0);
+
+ $pluginsFrame->addWidget($pluginBox);
+ $self->vbox->pack_start($pluginsFrame, 1, 1, 0);
+
+ $self->set_default_size(1,550);
+
+ return $self;
+ }
+
+ sub query
+ {
+ my $self = shift;
+ if (@_)
+ {
+ my ($query, $field, $queries) = @_;
+ $self->{fieldsList}->setValue($field);
+ $self->{query}->setValue($query);
+ $self->{queries} = $queries;
+ $self->{fieldsList}->signal_connect('changed' => sub {
+ # Only change the search query if it's not empty, otherwise keep existing value
+ if ($self->{queries}->{$self->{fieldsList}->getValue})
+ {
+ $self->{query}->setValue(
+ $self->{queries}->{$self->{fieldsList}->getValue}
+ );
+ }
+ });
+ #$self->{fieldsList}->setDefaultValues(shift);
+ #$self->{searchField} = shift;
+ }
+ return ($self->{query}->getValue, $self->{fieldsList}->getValue);
+ }
+
+ sub plugin
+ {
+ my $self = shift;
+
+ return $self->{plugin};
+ }
+
+ sub setModel
+ {
+ my ($self, $model, $list) = @_;
+ $model ||= $self->{parent}->{model};
+ my @plugins_array = sort split (",", $list) if $list;
+
+ my @fields = @{$model->getSearchFields};
+ if ($#fields < 1)
+ {
+ $self->{hideFieldsList} = 1;
+ }
+ else
+ {
+ $self->{hideFieldsList} = 0;
+ my @values;
+ foreach (@fields)
+ {
+ push @values, {value => $_,
+ displayed => $model->getDisplayedText($model->{fieldsInfo}->{$_}->{label})};
+ }
+ $self->{fieldsList}->setValues(\@values);
+ }
+
+# if ($model)
+# {
+# my $titleField = $model->{commonFields}->{title};
+# my $titleInfo = $self->{parent}->{model}->{fieldsInfo}->{$titleField};
+# my $titleText = $model->getDisplayedText($titleInfo->{label});
+# $self->{titleGroup}->setLabel($titleText);
+# }
+
+ return if $list && ($self->{currentPluginList} eq $list);
+ $self->{currentPluginList} = $list;
+
+ my $pluginGroup = undef;
+ my $i = 0;
+ my @newData;
+
+ $self->{model} = $model;
+
+ if ($model)
+ {
+ foreach (sort keys %{$model->getAllPlugins})
+ {
+ my $plugin = $model->getPlugin($_);
+ if ((!$list) || ($plugin->getName eq $plugins_array[$i]))
+ {
+ # Add plugin to list
+ # Plugin should be marked as a default if it's both preferred, and for the user's language,
+ # or if isPreferred is 2 (not language dependant)
+ push @newData, [$plugin->getName, "\n".$plugin->getLang."\n",
+ $plugin->getSearchFields($model), $plugin->getAuthor,
+ ((($plugin->isPreferred == 1)
+ && ($self->{parent}->{options}->lang eq $plugin->getLang))
+ || ($plugin->isPreferred == 2))
+ ? $self->{starPixbuf} : $self->{blankPixbuf}];
+
+ $i++;
+ }
+ }
+ }
+
+ # Sort list with preferred plugins first
+ @{$self->{pluginsList}->{data}} = sort {
+ if (($a->[4] == $self->{starPixbuf}) && ($b->[4] == $self->{starPixbuf}))
+ { return lc($a->[0]) cmp lc($b->[0]); }
+ elsif ($a->[4] == $self->{starPixbuf}) { return -1; }
+ elsif ($b->[4] == $self->{starPixbuf}) { return 1; }
+ else { return lc($a->[0]) cmp lc($b->[0]); }
+ } @newData;
+
+ $self->{pluginsList}->select(0);
+ }
+ }
+
+ {
+ package GCAllPluginsDialog;
+
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ $self->SUPER::show();
+ $self->show_all;
+ ($self->action_area->get_children)[1]->hide_all;
+ my $response = $self->run;
+ $self->hide;
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{PluginsFrame},
+ 'gtk-close'
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{factory} = $parent->{modelsFactory};
+
+ my @columnsNames = ('Name', 'Lang', 'SearchFields', 'Author', 'Preferred');
+ $self->{pluginsModel} = new Gtk2::TreeStore(map {'Glib::String'} @columnsNames);
+ $self->{pluginsList} = Gtk2::TreeView->new_with_model($self->{pluginsModel});
+
+ my @columns;
+ my $i = 0;
+ for my $col(@columnsNames)
+ {
+ my $column = Gtk2::TreeViewColumn->new_with_attributes($parent->{lang}->{'Plugins'.$col},
+ Gtk2::CellRendererText->new,
+ 'text' => $i);
+ $column->set_resizable(1);
+ $self->{pluginsList}->append_column($column);
+ $i++;
+ }
+
+ $self->{pluginsList}->set_border_width(5);
+ $self->{pluginsList}->set_rules_hint(1);
+
+ my $scrollPanelList = new Gtk2::ScrolledWindow;
+ $scrollPanelList->set_border_width(5);
+ $scrollPanelList->set_policy ('never', 'automatic');
+ $scrollPanelList->set_shadow_type('etched-in');
+ $scrollPanelList->add($self->{pluginsList});
+
+ $self->{useThisSite} = Gtk2::CheckButton->new($parent->{lang}->{PluginsUseSite});
+
+ my $pluginBox = new Gtk2::VBox(0,0);
+ $pluginBox->pack_start($scrollPanelList, 1, 1, 0);
+
+ for my $modelInfo (@{$self->{factory}->getDefaultModels})
+ {
+ my $modelIter = $self->{pluginsModel}->append(undef);
+ $self->{pluginsModel}->set($modelIter,
+ (0 => $modelInfo->{description})
+ );
+
+ my $model = $self->{factory}->getModel($modelInfo->{name});
+ for my $pluginName (sort keys %{$model->getAllPlugins})
+ {
+ my $plugin = $model->getPlugin($pluginName);
+ my $pluginIter = $self->{pluginsModel}->append($modelIter);
+ my %data;
+ $i = 0;
+ my $method;
+ ($method = 'get'.$_, $data{$i++} = $plugin->$method($model))
+ foreach (@columnsNames);
+ $self->{pluginsModel}->set($pluginIter, %data);
+# (
+# 0 => $plugin->getName,
+# 1 => $plugin->getLang,
+# 2 => $plugin->getSearchFieldsAsString($model),
+# 4 => $plugin->getAuthor
+# )
+# );
+ }
+ }
+
+ $self->vbox->pack_start($pluginBox, 1, 1, 0);
+
+ $self->set_default_size(1,550);
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model, $list) = @_;
+ $model ||= $self->{parent}->{model};
+ my @plugins_array = sort split (",", $list) if $list;
+
+ my @fields = @{$model->getSearchFields};
+ if ($#fields < 1)
+ {
+ $self->{hideFieldsList} = 1;
+ }
+ else
+ {
+ $self->{hideFieldsList} = 0;
+ my @values;
+ foreach (@fields)
+ {
+ push @values, {value => $_,
+ displayed => $model->getDisplayedText($model->{fieldsInfo}->{$_}->{label})};
+ }
+ $self->{fieldsList}->setValues(\@values);
+ }
+
+ return if $list && ($self->{currentPluginList} eq $list);
+ $self->{currentPluginList} = $list;
+
+ my $pluginGroup = undef;
+ my $i = 0;
+ my @newData;
+
+ $self->{model} = $model;
+
+ if ($model)
+ {
+ foreach (sort keys %{$model->getAllPlugins})
+ {
+ my $plugin = $model->getPlugin($_);
+ if ((!$list) || ($plugin->getName eq $plugins_array[$i]))
+ {
+ push @newData, [$plugin->getName, "\n".$plugin->getLang."\n", $plugin->getAuthor,
+ $plugin->isPreferred ? $self->{starPixbuf} : $self->{blankPixbuf}];
+ $i++;
+ }
+ }
+ }
+
+ # Sort list with preferred plugins first
+ @{$self->{pluginsList}->{data}} = sort {
+ if (($a->[4] == $self->{starPixbuf}) && ($b->[4] == $self->{starPixbuf}))
+ { return lc($a->[0]) cmp lc($b->[0]); }
+ elsif ($a->[4] == $self->{starPixbuf}) { return -1; }
+ elsif ($b->[4] == $self->{starPixbuf}) { return 1; }
+ else { return lc($a->[0]) cmp lc($b->[0]); }
+ } @newData;
+
+ $self->{pluginsList}->select(0);
+ }
+ }
+
+ {
+ #Class that is used to let user select
+ #plugins he wants to use in a multi-site search.
+ package GCMultiSiteDialog;
+
+ use base 'GCDoubleListDialog';
+
+ sub getInitData
+ {
+ my $self = shift;
+
+ return $self->{model}->getPluginsNames;
+ }
+
+ sub getData
+ {
+ my $self = shift;
+
+ my @array = split m/,/, $self->{model}->{preferences}->multisite;
+ return \@array;
+ }
+
+ sub saveList
+ {
+ my ($self, $list) = @_;
+
+ my $value = join ',', @$list;
+ $self->{model}->{preferences}->multisite($value);
+ }
+
+ sub getPlugin
+ {
+ my ($self, $idx) = @_;
+ $self->init;
+ return $self->{usedArray}->[$idx];
+ }
+
+ sub getPluginsNumber
+ {
+ my $self = shift;
+ $self->init;
+ return scalar @{$self->{usedArray}};
+ }
+
+ sub preFill
+ {
+ my $self = shift;
+
+ my @data;
+ my $langName = $self->{options}->lang;
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ push @data, $_ if $self->{model}->getPlugin($_)->getLang eq $langName;
+ }
+ $self->getDoubleList->setListData(\@data);
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ $self->{model} = $model;
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new(
+ $parent,
+ $parent->{lang}->{MultiSiteTitle},
+ 0,
+ $parent->{lang}->{MultiSiteUnused},
+ $parent->{lang}->{MultiSiteUsed}
+ );
+ bless ($self, $class);
+
+ $self->setModel($model);
+
+ if (! $self->{model}->{preferences}->exists('multisite'))
+ {
+ $self->preFill;
+ $self->saveList(\@{$self->{usedArray}});
+ $self->{initialized} = 1;
+ }
+
+ my $langButton = new Gtk2::Button($parent->{lang}->{MultiSiteLang});
+ $langButton->set_border_width($GCUtils::margin);
+ $langButton->signal_connect('clicked' => sub {
+ $self->preFill;
+ });
+ my $clearButton = new Gtk2::Button($parent->{lang}->{MultiSiteClear});
+ $clearButton->set_border_width($GCUtils::margin);
+ $clearButton->signal_connect('clicked' => sub {
+ $self->clearList;
+ });
+
+ $self->getDoubleList->setDataHandler($self);
+ $self->getDoubleList->addBottomButtons($langButton,$clearButton);
+
+ return $self;
+ }
+ }
+
+ {
+ #Class that is used to let user select
+ #plugin order he wants to use for each imported fields
+ package GCMultiSitePerFieldDialog;
+ use base 'GCModalDialog';
+
+ our $removeValue = 'GCListRemove';
+ my $startColMenus=1;
+
+ my $pluginListOrderPerField;
+ my $fieldsToFetch;
+ my $remainingSourcesOrderPerField;
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+
+ my $response = $self->run;
+ $self->hide;
+ $self->cleanListOrder;
+ $self->savePrefOrderListFromForm if ($response eq 'ok');
+ $self->loadPrefOrderListInForm if ($response ne 'ok');
+ return ($response eq 'ok');
+ }
+
+ sub getSourcesListMenu
+ {
+ my ($self,$withRemoveItem) = @_;
+ return new GCMenuList($self->{sourcesList}) if !$withRemoveItem;
+ return new GCMenuList($self->{sourcesListWithRemoveItem}) if $withRemoveItem;
+ }
+
+ sub createRowForField
+ {
+ my ($self, $field, $row, $mandatory) = @_;
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+ $self->{fields}->{$field}->{row}=$row;
+ $self->{fields}->{$field}->{'Cb'} = new GCCheckBox($self->{parent}->{model}->getDisplayedText($fieldsInfo->{$field}->{label}));
+ if ($mandatory)
+ {
+ $self->{fields}->{$field}->{'Cb'}->lock(1);
+ $self->{fields}->{$field}->{'Cb'}->setValue(1);
+ $self->{fields}->{$field}->{'Cb'}->{mandatory} = 1;
+ }
+ $self->{table}->attach($self->{fields}->{$field}->{'Cb'}, 0, 1, $row, $row + 1, 'fill', ['fill', 'expand'], 0, 0);
+
+ my $curNbSite=0;
+ $self->{fields}->{$field}->{'SiteListMenus'}=[];
+ $self->{fields}->{$field}->{'SiteListAddLast'}=new Gtk2::Button("+");
+ $self->{fields}->{$field}->{'SiteListAddLast'}->signal_connect('clicked' => sub {
+ $self->addSiteListToField($field,-1);
+ });
+ $self->{fields}->{$field}->{'SiteListAddLast'}->set_no_show_all(1);
+
+ $self->{fields}->{$field}->{'SiteListAddFirst'}=new Gtk2::Button("+");
+ $self->{fields}->{$field}->{'SiteListAddFirst'}->signal_connect('clicked' => sub {
+ $self->addSiteListToField($field,0);
+ });
+ $self->{table}->attach($self->{fields}->{$field}->{'SiteListAddFirst'}, $startColMenus, 1+$startColMenus, $row, $row + 1, 'fill', 'fill', 0, 0);
+
+ my $Align = new Gtk2::Alignment(0.0, 0.5, 0.0, 0.0);
+ my $Hbox = new Gtk2::HBox();
+ $self->{fields}->{$field}->{'Hbox'}=$Hbox;
+ $Hbox->pack_start($self->{fields}->{$field}->{'SiteListAddLast'},1,0,0);
+ $Align->add($Hbox);
+ $self->{table}->attach($Align, 1+$startColMenus, 2+$startColMenus, $row, $row + 1, ['expand','fill'], 'fill', 0, 0);
+ }
+
+ sub addSiteListToField
+ {
+ my ($self, $field, $position,$value) = @_;
+ my $curListMenus=$self->{fields}->{$field}->{'SiteListMenus'};
+ my $curNbSite=scalar @{$curListMenus};
+ $curNbSite++;
+ $position=$curNbSite-1 if $position==-1;
+ my $Hbox = $self->{fields}->{$field}-> {'Hbox'};
+ my $newSiteList = $self->getSourcesListMenu(1);
+ $value=$self->{bottomline}->{siteAddToAll}->getValue(1) if !$value;
+ $newSiteList->setValue($value);
+ $newSiteList->{orderInList}=$position;
+ $newSiteList->signal_connect('changed' => sub {
+ if ($newSiteList->getValue eq $removeValue)
+ {
+ $self->removeSiteListFromField($field, $newSiteList->{orderInList})
+ }
+ });
+ #insert the new siteList
+ splice @{$curListMenus}, $position, 0, $newSiteList;
+ $Hbox->pack_start($newSiteList,0,0,0);
+ $Hbox->reorder_child($newSiteList,$position);
+ $newSiteList->show;
+ #move other siteList on this row to the right
+ for (my $idx=$position;$idx<$curNbSite;$idx++)
+ {
+ $curListMenus->[$idx]->{orderInList}=$idx;
+ }
+ if($curNbSite==1)
+ {
+ $self->{fields}->{$field}->{'SiteListAddLast'}->set_no_show_all(0);
+ $self->{fields}->{$field}->{'SiteListAddLast'}->show;
+ }
+ }
+
+ sub removeSiteListFromField
+ {
+ my ($self, $field, $position) = @_;
+ my $curListMenus=$self->{fields}->{$field}->{'SiteListMenus'};
+ my $curNbSite=scalar @{$curListMenus};
+ $position=$curNbSite-1 if $position==-1;
+ my $oldSiteList=splice @{$curListMenus}, $position, 1;
+ my $Hbox = $self->{fields}->{$field}-> {'Hbox'};
+ $Hbox->remove($oldSiteList);
+ $curNbSite--;
+ #move other siteList on this row to the left
+ for (my $idx=$position;$idx<$curNbSite;$idx++)
+ {
+ $curListMenus->[$idx]->{orderInList}=$idx;
+ }
+ if($curNbSite==0)
+ {
+ $self->{fields}->{$field}->{'SiteListAddLast'}->set_no_show_all(1);
+ $self->{fields}->{$field}->{'SiteListAddLast'}->hide;
+ }
+ }
+
+ sub removeAllSourceListFromField
+ {
+ my ($self, $field) = @_;
+ my $curNbSite=scalar @{$self->{fields}->{$field}->{'SiteListMenus'}};
+ for (my $i=0;$i<$curNbSite;$i++)
+ {
+ $self->removeSiteListFromField($field,-1);
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent, $model,$usePlugins,$otherSources) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{OptionsPluginsMultiPerFieldWindowTitle}
+ );
+
+ bless ($self, $class);
+ $model=$parent->{model} if !$model;
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(1,500);
+ my $layoutHbox = new Gtk2::HBox(0,0);
+ $self->{layoutVBox} = new Gtk2::VBox(0,0);
+ $self->vbox->pack_start($layoutHbox, 1,1,0);
+ $layoutHbox->pack_start($self->{layoutVBox},0,0,$GCUtils::margin);
+
+ $self->{table} = new Gtk2::Table(1, 3, 0);
+ $self->{table}->set_row_spacings($GCUtils::halfMargin);
+ $self->{table}->set_col_spacings($GCUtils::margin);
+ $self->{table}->set_border_width($GCUtils::margin);
+
+ $self->{scrollPanelList} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelList}->set_policy ('never', 'automatic');
+ $self->{scrollPanelList}->set_shadow_type('none');
+ $self->{scrollPanelList}->add_with_viewport($self->{table});
+
+ $self->{descriptionLabel}=new GCLabel($parent->{lang}->{OptionsPluginsMultiPerFieldDesc});
+ $self->{layoutVBox}->pack_start($self->{descriptionLabel},0,0,$GCUtils::margin);
+
+ $self->{layoutVBox}->pack_start($self->{scrollPanelList},1,1,$GCUtils::margin);
+
+ $self->setModel($model);
+
+ $self->setSourceList($usePlugins,$otherSources);
+ $self->initForm;
+ if (! $self->{model}->{preferences}->exists('multisiteperfield'))
+ {
+ $self->savePrefOrderListFromForm;
+ }
+ else
+ {
+ $self->loadPrefOrderListInForm;
+ }
+ return $self;
+ }
+
+ sub setSourceList
+ {
+ my ($self,$usePlugins,$otherSourcesList) = @_;
+ $#{$self->{sourcesList}}=-1;
+ $#{$self->{sourcesListWithRemoveItem}}=-1;
+ if ($usePlugins)
+ {
+ foreach (@{$self->{model}->getPluginsNames})
+ {
+ push @{$self->{sourcesList}},{value=>$_,
+ displayed=>$_};
+ }
+ }
+ if ($otherSourcesList && scalar (@$otherSourcesList))
+ {
+ foreach (@{$otherSourcesList})
+ {
+ push @{$self->{sourcesList}},Storable::dclone($_);
+ }
+ }
+ $self->{sourcesListWithRemoveItem}=Storable::dclone($self->{sourcesList});
+ unshift @{$self->{sourcesListWithRemoveItem}}, {value=>$removeValue,displayed=>$self->{parent}->{lang}->{OptionsPluginsMultiPerFieldRemove}};
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+
+ my $parent = $self->{parent};
+ return if $self->{model} == $model;
+ $self->{model} = $model;
+ }
+
+ sub initForm
+ {
+ my ($self) = @_;
+
+ my $parent = $self->{parent};
+ my $fieldsInfo = $self->{model}->{fieldsInfo};
+ $self->{urlField} = $self->{parent}->{model}->{commonFields}->{url};
+
+ foreach ($self->{table}->get_children)
+ {
+ $self->{table}->remove($_);
+ $_->destroy;
+ }
+
+ my $row = 0;
+ my $field;
+ foreach $field(@{$self->{model}->{fieldsNames}})
+ {
+ next if $fieldsInfo->{$field}->{imported} ne 'true';
+ next if ($field eq $self->{urlField});
+ $self->createRowForField($field, $row);
+ $row++;
+ }
+
+ $row++;
+ if($self->{bottomline})
+ {
+ foreach($self->{bottomline}->get_children)
+ {
+ $self->{bottomline}->remove($_);
+ $_->destroy;
+ }
+ $self->{bottomline}->destroy;
+ undef $self->{bottomline};
+ }
+ $self->{bottomline}=new Gtk2::HBox;
+
+ $self->{bottomline}->{selectAll}=new Gtk2::Button($parent->{lang}->{ImportSelectAll});
+ $self->{bottomline}->{selectAll}->signal_connect('clicked' => sub {
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $row->{'Cb'}->setValue(1);
+ }
+ });
+ $self->{bottomline}->pack_start($self->{bottomline}->{selectAll},0,0,0);
+
+ $self->{bottomline}->{selectNone}=new Gtk2::Button($parent->{lang}->{ImportSelectNone});
+ $self->{bottomline}->{selectNone}->signal_connect('clicked' => sub {
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $row->{'Cb'}->setValue(0);
+ }
+ });
+ $self->{bottomline}->pack_start($self->{bottomline}->{selectNone},0,0,0);
+
+ $self->{bottomline}->{clear}=new Gtk2::Button($parent->{lang}->{OptionsPluginsMultiPerFieldClearSelected});
+ $self->{bottomline}->{clear}->signal_connect('clicked' => sub {
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $self->removeAllSourceListFromField($field) if $row->{'Cb'}->getValue;
+ }
+ });
+ $self->{bottomline}->pack_start($self->{bottomline}->{clear},0,0,0);
+
+ $self->{bottomline}->{positionAddToAll} = new GCMenuList([{value=>'First',displayed=>$parent->{lang}->{OptionsPluginsMultiPerFieldFirst}},
+ {value=>'Last',displayed=>$parent->{lang}->{OptionsPluginsMultiPerFieldLast}}]);
+ $self->{bottomline}->pack_end($self->{bottomline}->{positionAddToAll},0,0,0);
+
+ $self->{bottomline}->{siteAddToAll} = $self->getSourcesListMenu;
+ $self->{bottomline}->pack_end($self->{bottomline}->{siteAddToAll},0,0,0);
+
+ $self->{bottomline}->{addToAll} = GCButton->newFromStock('gtk-add', 0);
+ $self->{bottomline}->{addToAll}->signal_connect('clicked' => sub {
+ my $positionAdd=$self->{bottomline}->{positionAddToAll}->getValue(0) eq 'First' ? 0:-1;
+ foreach $field(keys %{$self->{fields}})
+ {
+ $self->addSiteListToField($field,$positionAdd,$self->{bottomline}->{siteAddToAll}->getValue(0));
+ }
+ });
+ $self->{bottomline}->pack_end($self->{bottomline}->{addToAll},0,0,0);
+
+ $self->{layoutVBox}->pack_start($self->{bottomline},0,0,$GCUtils::margin);
+ }
+
+
+ sub loadPrefOrderListInForm
+ {
+ my $self = shift;
+ # load from preference string
+ undef $pluginListOrderPerField;
+ undef $fieldsToFetch;
+ my $valueStr = $self->{model}->{preferences}->multisiteperfield;
+ my @arrValues= split ';', $valueStr;
+ foreach (@arrValues)
+ {
+ my @line=split ',',$_;
+ my $field=shift @line;
+ $fieldsToFetch->{$field}=shift @line;
+ $pluginListOrderPerField->{$field}=\@line if scalar(@line);
+ }
+ # add values in form
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $self->removeAllSourceListFromField($field);
+ $self->addSiteListToField($field,-1,$_) foreach (@{$pluginListOrderPerField->{$field}});
+ $self->{fields}->{$field}->{Cb}->setValue($fieldsToFetch->{$field});
+ }
+ $self->cleanListOrder;
+ }
+
+ sub savePrefOrderListFromForm
+ {
+ my $self = shift;
+ undef $pluginListOrderPerField;
+ undef $fieldsToFetch;
+ # load from form
+ $self->cleanListOrder;
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ $fieldsToFetch->{$field}= $row->{'Cb'}->getValue;
+ push @{$pluginListOrderPerField->{$field}},$_->getValue foreach (@{$row->{'SiteListMenus'}});
+ }
+ # save to preference string
+ my $valueStrArr = [];
+ while ( my ($field, $row) = each(%{$self->{fields}}) ) {
+ my $value=$field.','.$fieldsToFetch->{$field};
+ $value=$value.','.join ',',@{$pluginListOrderPerField->{$field}} if $pluginListOrderPerField->{$field};
+ push @$valueStrArr,$value;
+ }
+ $self->{model}->{preferences}->multisiteperfield(join ';',@$valueStrArr);
+ }
+
+ sub cleanListOrder
+ {
+ my $self = shift;
+ # remove double sitename for each fields, keep the first one
+ for my $field (keys %{$self->{fields}} ) {
+ my $sites={};
+ my $row=$self->{fields}->{$field}->{SiteListMenus};
+ for (my $i = 0; $i <= $#$row; ++$i)
+ {
+ if ($sites->{$row->[$i]->getValue})
+ {
+ $self->removeSiteListFromField($field,$i);
+ $i--;
+ }
+ else
+ {
+ $sites->{$row->[$i]->getValue}=1;
+ }
+ }
+ undef $sites;
+ }
+ }
+
+ sub resetCurrentFetchingStatus
+ {
+ undef $remainingSourcesOrderPerField;
+ foreach (keys %$fieldsToFetch)
+ {
+ $remainingSourcesOrderPerField->{$_}=Storable::dclone($pluginListOrderPerField->{$_}) if $fieldsToFetch->{$_} ;
+
+ }
+ }
+
+ sub getNextSourceNeeded
+ {
+ my $self = shift;
+ foreach my $field(keys %$remainingSourcesOrderPerField)
+ {
+ if (scalar(@{$remainingSourcesOrderPerField->{$field}})>0)
+ {
+ return $remainingSourcesOrderPerField->{$field}->[0];
+ }
+ }
+ return undef;
+ }
+
+ sub getPlugin
+ {
+ my ($self,$pluginName) = @_;
+ return $self->{model}->getPlugin($pluginName);
+ }
+
+ sub getNonEmptyFields
+ {
+ my ($self,$info)=@_;
+ my $nonEmptyFields=[];
+ foreach my $field(keys %$info)
+ {
+ push @$nonEmptyFields,$field if $self->isFieldNonEmpty($info->{$field});
+ }
+ return $nonEmptyFields;
+ }
+
+ sub isFieldNonEmpty
+ {
+ my ($self,$var)=@_;
+ return 0 if !defined $var;
+ my $reftype=ref $var;
+ if (!$reftype)
+ {
+ return $var ne '';
+ }
+ elsif ($reftype eq 'SCALAR')
+ {
+ return $$var ne '' && $var!=undef;
+ }
+ elsif ($reftype eq 'ARRAY')
+ {
+ return scalar($var)>0;
+ }
+ elsif ($reftype eq 'HASH')
+ {
+ return scalar(keys(%{$var}))>0;
+ }
+ }
+
+ sub doneWithSourceName
+ {
+ my ($self,$pluginName,$info) = @_;
+ foreach my $field(keys %$remainingSourcesOrderPerField)
+ {
+ foreach my $pluginIdx (0..$#{$remainingSourcesOrderPerField->{$field}})
+ {
+ if ($remainingSourcesOrderPerField->{$field}->[$pluginIdx] eq $pluginName)
+ {
+ if ($self->isFieldNonEmpty($info->{$field}))
+ {
+ # if we have the field, so we wont need other info
+ $#{$remainingSourcesOrderPerField->{$field}}=$pluginIdx-1;
+ last;
+ }
+ else
+ {
+ # else we will still need the next one
+ splice @{$remainingSourcesOrderPerField->{$field}},$pluginIdx,1;
+ last;
+ }
+ }
+ }
+ }
+ }
+
+ sub joinInfo
+ {
+ my ($self,$infoPerPlugin) = @_;
+ my $info={};
+ my $fetchedSources=Storable::dclone($pluginListOrderPerField);
+ my %urls;
+ my $urlField=$self->{parent}->{model}->{commonFields}->{url};
+ foreach my $field(keys %$pluginListOrderPerField)
+ {
+ shift @{$fetchedSources->{$field}} while (scalar(@{$fetchedSources->{$field}}) && !$self->isFieldNonEmpty($infoPerPlugin->{$fetchedSources->{$field}->[0]}->{$field}));
+ if (scalar(@{$fetchedSources->{$field}})>0)
+ {
+ $info->{$field}=$infoPerPlugin->{$fetchedSources->{$field}->[0]}->{$field} ;
+ $urls{$fetchedSources->{$field}->[0]}=$infoPerPlugin->{$fetchedSources->{$field}->[0]}->{$urlField};
+ }
+ }
+ $info->{$urlField}=join ';',values %urls;
+ return $info;
+ }
+ }
+}
+
+{
+ package GCResultsDialog;
+ use base 'GCModalDialog';
+
+ sub show
+ {
+ my $self = shift;
+ for my $i (0..$self->{nbCols} - 1)
+ {
+ $self->{results}->get_column($i)->set_sort_indicator(0);
+ }
+ $self->{order} = 1;
+ $self->{sort} = '';
+
+ $self->{validated} = 0;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->{nextButton}->hide if !$self->{withNext};
+ $self->{multipleSelectionLabel}->hide if ! $self->{multipleSelection};
+ my $ended = 0;
+ my $code;
+ while (!$ended)
+ {
+ $code = $self->run;
+ if ($code eq 'ok')
+ {
+ $self->{validated} = 1;
+ $self->{itemsIndexes} = [];
+ my @idxs = $self->{results}->get_selected_indices;
+ foreach my $idx(@idxs)
+ {
+ push @{$self->{itemsIndexes}}, $self->{items}->[$idx]->{'#'};
+ }
+ }
+ elsif ($code eq 'yes')
+ {
+ my @idx = $self->{results}->get_selected_indices;
+ my $itemIndex = $self->{items}->[$idx[0]]->{'#'};
+ $self->{parent}->downloadItemInfoFromPlugin($self->{plugin}, $itemIndex, 1);
+ }
+ $ended = 1 if ($code eq 'ok') || ($code eq 'cancel') || ($code eq 'delete-event') || ($code eq 'no');
+ }
+ $self->hideTooltip;
+ $self->hide;
+ return ($code eq 'no');
+ }
+
+ sub getItemsIndexes
+ {
+ my $self = shift;
+ return $self->{itemsIndexes};
+ }
+
+ sub setMultipleSelection
+ {
+ my ($self, $activate) = @_;
+ return if !$self->{results};
+ $self->{results}->get_selection->set_mode ($activate ? 'multiple' : 'single');
+ $self->{multipleSelection} = $activate;
+ }
+
+ sub setWithNext
+ {
+ my ($self, $value) = @_;
+
+ $self->{withNext} = $value;
+ }
+
+ sub setSearchPlugin
+ {
+ my ($self, $plugin) = @_;
+
+ $self->{plugin} = $plugin;
+ $self->set_title($self->{parent}->{lang}->{ResultsTitle}.' ('.$plugin->getName.')');
+
+ for my $i (0..$self->{nbCols} - 2)
+ {
+ # If plugin is a multi-pass plugin, then update the column headers for this pass
+ $plugin->getReturnedFields() if $plugin->getNumberPasses > 1;
+
+ $self->{results}->get_column($i)->set_visible($plugin->hasField($self->{fields}->[$i]));
+ }
+
+ if ($plugin->getExtra)
+ {
+ $self->{results}->get_column($self->{nbCols} - 1)->set_visible(1);
+ $self->{results}->get_column($self->{nbCols} - 1)->set_title($plugin->getExtra);
+ $self->{withExtra} = 1;
+ }
+ else
+ {
+ $self->{results}->get_column($self->{nbCols} - 1)->set_visible(0);
+ $self->{withExtra} = 0;
+ }
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ResultsTitle},
+ undef, 0,
+ 'gtk-zoom-in' => 'yes'
+ );
+ bless ($self, $class);
+
+ $self->{results} = 0;
+ $self->{withExtra} = 0;
+ $self->{withNext} = 0;
+ $self->{multipleSelection} = 0;
+ $self->{nextButton} = Gtk2::Button->new_from_stock('gtk-go-forward');
+ $parent->{tooltips}->set_tip($self->{nextButton},
+ $parent->{lang}->{ResultsNextTip});
+ $self->add_action_widget($self->{nextButton}, 'no');
+
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+
+ $self->{scrollPanelList} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelList}->set_policy ('never', 'automatic');
+ $self->{scrollPanelList}->set_shadow_type('etched-in');
+
+ $self->vbox->pack_start($self->{scrollPanelList}, 1, 1, 0);
+ $self->vbox->pack_start(Gtk2::HSeparator->new, 0, 0, 0);
+ my $fillBox = new Gtk2::HBox(0,0);
+ $self->{multipleSelectionLabel} = GCLabel->new('<i>'.$parent->{lang}->{ResultsInfo}.'</i>');
+ $self->{multipleSelectionLabel}->set_line_wrap(1);
+ $self->{multipleSelectionLabel}->set_justify('center');
+ $self->{multipleSelectionLabel}->set_padding($GCUtils::margin, 0);
+ $fillBox->pack_start(Gtk2::HBox->new(0,0),1,1,0);
+ $fillBox->pack_start($self->{multipleSelectionLabel}, 0, 0, $GCUtils::margin);
+ $fillBox->pack_start(Gtk2::HBox->new(0,0),1,1,0);
+ $self->vbox->pack_start($fillBox, 0 , 0, $GCUtils::margin);
+
+ # To create a tooltip as it is not implemented directly in Gtk2
+ $self->{tooltipLabel} = Gtk2::Label->new;
+ $self->{tooltipLabel}->set_line_wrap(1);
+ $self->{tooltipLabel}->set_padding($GCUtils::margin, $GCUtils::margin);
+ $self->{tooltip} = Gtk2::Window->new('popup');
+ $self->{tooltip}->set_decorated(0);
+ $self->{tooltip}->set_sensitive(1);
+ $self->{tooltip}->modify_fg('normal', Gtk2::Gdk::Color->parse('#000000'));
+ $self->{tooltip}->modify_bg('normal', Gtk2::Gdk::Color->parse('#ffffbf'));
+ $self->{tooltip}->set_position('mouse');
+ $self->{tooltip}->add($self->{tooltipLabel});
+ $self->{tooltip}->signal_connect('button_press_event' => sub {
+ $self->hideTooltip;
+ if ($self->{results})
+ {
+ shift;
+ $self->{results}->signal_emit('button_press_event', @_);
+ }
+ });
+ $self->{tooltip}->signal_connect('motion-notify-event' => sub {
+ my ($widget, $event) = @_;
+ my ($x, $y) = ($event->x_root, $event->y_root);
+ my ($xoffset, $yoffset) = $widget->window->get_root_origin;
+ my $allocation = $widget->allocation();
+ my $x1 = $xoffset + 2 * $allocation->x;
+ my $y1 = $yoffset + 2 * $allocation->y;
+ my $x2 = $x1 + $allocation->width;
+ my $y2 = $y1 + $allocation->height;
+ my $isInWidget = ($x > $x1 && $x < $x2 && $y > $y1 && $y < $y2);
+
+ return if $isInWidget;
+ if ($self->{results})
+ {
+ shift;
+ $self->{results}->signal_emit('motion-notify-event', @_);
+ }
+ });
+ $self->{tooltipDisplayed} = 0;
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model, $fieldsInfo) = @_;
+
+ if ($self->{results})
+ {
+ $self->{scrollPanelList}->remove($self->{results});
+ $self->{results}->destroy;
+ }
+
+
+ $self->{fields} = [];
+ my @cols;
+
+ foreach my $field(@{$model->{resultsFields}})
+ {
+ push @cols, ($fieldsInfo->{$field}->{displayed} => 'text');
+ push @{$self->{fields}}, $field;
+ }
+
+ # Extra column
+ push @cols, ('' => 'text');
+ push @{$self->{fields}}, 'extra';
+
+ $self->{nbCols} = scalar @{$self->{fields}};
+
+ $self->{results} = Gtk2::SimpleList->new(@cols);
+
+ $self->{results}->set_rules_hint(1);
+ $self->{results}->set_headers_clickable(1);
+
+ $self->{order} = 1;
+ $self->{sort} = '';
+
+ for my $i (0..$self->{nbCols} - 1)
+ {
+ $self->{results}->get_column($i)->set_sort_indicator(0);
+ $self->{results}->get_column($i)->set_resizable(1);
+ $self->{results}->get_column($i)->signal_connect('clicked' => sub {
+ $self->sort($self->{fields}->[$i]);
+ });
+ $self->{results}->get_column($i)->{column_number} = $i;
+ }
+
+ $self->{scrollPanelList}->add($self->{results});
+
+ $self->{results}->signal_connect(row_activated => sub {
+ my ($sl, $path, $column) = @_;
+ $self->response('ok');
+ });
+ $self->{results}->signal_connect('motion-notify-event' => sub {
+ my ($widget, $event) = @_;
+ $self->displayTooltip($event);
+ });
+ $self->{results}->signal_connect('leave-notify-event' => sub {
+ my ($widget, $event) = @_;
+ # It corresponds to a leave of the whole widget not from a single cell
+ $self->hideTooltip if $event->detail eq 'ancestor';
+ });
+
+ $self->{multipleSelectionLabel}->set_markup('<i>'.$self->{parent}->{lang}->{ResultsInfo}.'</i>');
+
+ }
+
+ sub sort
+ {
+ my ($self, $type) = @_;
+
+ my $col = 0;
+
+ for my $i (0..$self->{nbCols} - 1)
+ {
+ $self->{results}->get_column($i)->set_sort_indicator(0);
+ $col = $i if $self->{fields}->[$i] eq $type;
+ }
+
+ my @items = @{$self->{items}};
+
+ if ($self->{sort} eq $type)
+ {
+ $self->{order} = 1 - $self->{order}
+ }
+ else
+ {
+ $self->{order} = 1;
+ }
+
+ @items = sort {$a->{$type} cmp $b->{$type}} @items;
+
+ @items = reverse @items if ! $self->{order};
+
+ $self->{results}->get_column($col)->set_sort_indicator(1);
+ $self->{results}->get_column($col)->set_sort_order($self->{order} ? 'ascending' : 'descending');
+
+ $self->setList('',@items);
+
+ $self->{sort} = $type;
+ }
+
+ sub setList
+ {
+ my ($self, $title, @items) = @_;
+
+ $self->set_title($self->get_title . ' - '.$title) if $title;
+
+ $self->{items} = \@items;
+
+ @{$self->{results}->{data}} = ();
+ $self->{tooltipsStrings} = {};
+
+ my $idx = 0;
+ my $col = 0;
+ foreach my $item (@items)
+ {
+ my $infos = [];
+ $col = 0;
+ foreach my $field(@{$self->{fields}})
+ {
+ my $value = '';
+ $value = $item->{$field} if exists $item->{$field};
+ (my $shortField = $value) =~ s/(.{40}).*/$1.../;
+ push @$infos, $shortField."\n";
+ # We store a tooltip is the text has been truncated
+ $self->{tooltipsStrings}->{$idx}->{$col} = $value
+ if $value ne $shortField;
+ $col++;
+ }
+ $item->{'#'} = $idx if ! exists $item->{'#'};
+ push @{$self->{results}->{data}}, $infos;
+ #push @{$self->{tooltipsStrings}}, $item->{$self->{fields}->[0]};
+ $idx++;
+ }
+ $self->{results}->select(0);
+ $self->{results}->columns_autosize;
+ $self->set_default_size(-1,400);
+ }
+
+
+ sub displayTooltip
+ {
+ my ($self, $event) = @_;
+ my ($path, $column, $cell_x, $cell_y) = $self->{results}->get_path_at_pos ($event->x, $event->y);
+ if ($path)
+ {
+ my $model = $self->{results}->get_model;
+ my $col = $column->{column_number};
+ my $row = $path->to_string();
+
+ # If a new cell is selected, then hide the tooltip
+ # It'll be re-shown as required by the code down under
+ if ($self->{selectedRow} ne $row or $self->{selectedCol} != $col)
+ {
+ $self->hideTooltip;
+ $self->{selectedRow} = $row;
+ $self->{selectedCol} = $col;
+ }
+ else
+ {
+ return;
+ }
+ if ($row ne '')
+ {
+ # Pick that popup string from our hash
+ #my $str = $popup_hash->{$row}->{$i};
+ my $str = $self->{tooltipsStrings}->{$row}->{$col};
+ if ($str)
+ {
+ $self->{tooltipLabel}->set_label($str);
+ if (!$self->{tooltipDisplayed})
+ {
+ $self->{tooltip}->show_all;
+ Gtk2->grab_add($self->{tooltip});
+ Gtk2::Gdk->pointer_grab(
+ $self->{tooltip}->window, 1,
+ [qw/button-press-mask button-release-mask pointer-motion-mask/],
+ undef, undef, 0);
+ Gtk2::Gdk->keyboard_grab ($self->{tooltip}->window, 0, 0);
+ $self->{tooltip}->grab_focus;
+ my ($thisx, $thisy) = $self->{tooltip}->window->get_origin;
+ # The window to be a bit away from the mouse pointer.
+ $self->{tooltip}->move($thisx, $thisy-20);
+ $self->{tooltipDisplayed} = 1;
+ }
+ }
+ }
+ return 0;
+ }
+ }
+
+ sub hideTooltip
+ {
+ my $self = shift;
+ if ($self->{tooltipDisplayed})
+ {
+ Gtk2->grab_remove($self->{tooltip});
+ $self->{tooltip}->hide;
+ $self->{tooltipDisplayed} = 0;
+ }
+ }
+
+}
+
+{
+ package GCImportFieldsDialog;
+ use base 'GCModalDialog';
+
+ sub setReadOnly
+ {
+ my ($self, $value) = @_;
+ $self->{readOnly} = $value;
+ my @children = $self->{table}->get_children;
+ foreach (@children)
+ {
+ $_->set_sensitive(!$value) if ($_->get_name eq 'GtkCheckButton')
+ && (!$_->{mandatory});
+ }
+ $self->set_title($value ? $self->{parent}->{lang}->{ResultsPreview}
+ : $self->{parent}->{lang}->{ImportWindowTitle});
+ }
+
+ sub info
+ {
+ my $self = shift;
+
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+
+ if (@_)
+ {
+ my $info = shift;
+
+ $self->{info} = $info;
+
+ my @children = $self->{table}->get_children;
+ foreach (@children)
+ {
+ $_->set_text('') if $_->get_name eq 'GtkEntry';
+ }
+
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+ foreach (keys %{$info})
+ {
+ my $tmp = $info->{$_};
+ if ($fieldsInfo->{$_}->{type} =~ /list/)
+ {
+ $tmp = GCPreProcess::multipleList($tmp, $fieldsInfo->{$_}->{type});
+ }
+ if ($fieldsInfo->{$_}->{values})
+ {
+ $tmp = $self->{parent}->{model}->getDisplayedValue($fieldsInfo->{$_}->{values},
+ $tmp);
+ }
+ if ($_ ne $self->{urlField})
+ {
+ $tmp =~ s/\n/ /g;
+ $tmp =~ s/(.{50}).*/$1.../m;
+ }
+ $self->{$_}->set_text($tmp)
+ if $self->{$_};
+ }
+ }
+ else
+ {
+ my $ignore = $self->{parent}->{ignoreString};
+
+ foreach my $field(@{$self->{parent}->{model}->{fieldsNames}})
+ {
+ next if $fieldsInfo->{$field}->{imported} ne 'true';
+ next if ($fieldsInfo->{$field}->{type} eq 'url');
+ if (! $self->{$field.'Cb'}->get_active)
+ {
+ unlink $self->{info}->{$field}
+ if ($fieldsInfo->{$field}->{type} eq 'image')
+ && ($self->{info}->{$field} !~ m|^http://|);
+ $self->{info}->{$field} = $ignore;
+ }
+ }
+
+ return $self->{info};
+ }
+ }
+
+ sub showImage
+ {
+ use File::Temp qw/ :POSIX /;
+
+ my ($self, $field) = @_;
+
+ my $location = $self->{info}->{$field};
+ if ($location =~ m|^http://|)
+ {
+ my ($name,$path,$suffix) = File::Basename::fileparse($location, "\.gif", "\.jpg", "\.jpeg", "\.png");
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('watch'));
+ GCUtils::updateUI;
+ (my $tmpFile = tmpnam) .= $suffix;
+ GCUtils::downloadFile($location, $tmpFile, $self->{parent});
+ $self->window->set_cursor(Gtk2::Gdk::Cursor->new('left_ptr'));
+ $self->{parent}->launch($tmpFile, 'image', 0, $self);
+ $self->{info}->{$field} = $tmpFile;
+ }
+ else
+ {
+ $self->{parent}->launch($location, 'image', 0, $self);
+ }
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show();
+ $self->show_all;
+ if ($self->{readOnly})
+ {
+ $self->{selectAll}->hide;
+ $self->{selectNone}->hide;
+ ($self->action_area->get_children)[1]->hide;
+ }
+
+ foreach (keys %{$self->{imagesButton}})
+ {
+ $self->{$_}->hide if $self->{info}->{$_};
+ $self->{imagesButton}->{$_}->hide if ! $self->{info}->{$_};
+ }
+ my $response = $self->run;
+ $self->hide;
+ return ($response eq 'ok');
+ }
+
+ sub createItem
+ {
+ my ($self, $field, $row, $mandatory) = @_;
+ my $fieldsInfo = $self->{parent}->{model}->{fieldsInfo};
+ $self->{$field.'Cb'} = new Gtk2::CheckButton($self->{parent}->{model}->getDisplayedText($fieldsInfo->{$field}->{label}));
+ if ($mandatory)
+ {
+ $self->{$field.'Cb'}->set_sensitive(0);
+ $self->{$field.'Cb'}->set_active(1);
+ $self->{$field.'Cb'}->{mandatory} = 1;
+ }
+ $self->{$field} = new Gtk2::Entry;
+ $self->{$field}->set_editable(0);
+ $self->{table}->attach($self->{$field.'Cb'}, 0, 1, $row, $row + 1, 'fill', ['fill', 'expand'], 0, 0);
+ $self->{table}->attach($self->{$field}, 1, 2, $row, $row + 1, ['fill', 'expand'], 'fill', 0, 0);
+ }
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent,
+ $parent->{lang}->{ImportWindowTitle}
+ );
+
+ bless ($self, $class);
+
+ $self->{parent} = $parent;
+
+ $self->set_modal(1);
+ $self->set_position('center');
+ $self->set_default_size(1,500);
+
+ $self->{table} = new Gtk2::Table(1, 2, 0);
+ $self->{table}->set_row_spacings($GCUtils::halfMargin);
+ $self->{table}->set_col_spacings($GCUtils::margin);
+ $self->{table}->set_border_width($GCUtils::margin);
+
+ $self->{scrollPanelList} = new Gtk2::ScrolledWindow;
+ $self->{scrollPanelList}->set_policy ('never', 'automatic');
+ $self->{scrollPanelList}->set_shadow_type('none');
+ $self->{scrollPanelList}->add_with_viewport($self->{table});
+
+ $self->vbox->pack_start($self->{scrollPanelList},1,1,$GCUtils::margin);
+
+ $self->setModel($parent->{model});
+
+ return $self;
+ }
+
+ sub setModel
+ {
+ my ($self, $model) = @_;
+
+ my $parent = $self->{parent};
+
+ $self->{model} = $model;
+ my $fieldsInfo = $model->{fieldsInfo};
+ $self->{urlField} = $self->{parent}->{model}->{commonFields}->{url};
+
+ foreach ($self->{table}->get_children)
+ {
+ $self->{table}->remove($_);
+ $_->destroy;
+ }
+
+ my $row = 0;
+
+ my @picFields;
+ my $field;
+ foreach $field(@{$model->{fieldsNames}})
+ {
+ next if $fieldsInfo->{$field}->{imported} ne 'true';
+ next if ($field eq $self->{urlField});
+ if ($fieldsInfo->{$field}->{type} eq 'image')
+ {
+ push @picFields, $field;
+ next;
+ }
+ $self->createItem($field, $row);
+ $row++;
+ }
+
+ foreach $field(@picFields)
+ {
+ $self->createItem($field, $row);
+ $self->{imagesButton}->{$field} = new Gtk2::Button($parent->{lang}->{ImportViewPicture});
+ $self->{imagesButton}->{$field}->signal_connect('clicked' => sub {
+ $self->showImage($field);
+ });
+ $self->{table}->attach($self->{imagesButton}->{$field}, 1, 2, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $row++;
+ }
+
+ if ($self->{urlField})
+ {
+ $self->createItem($self->{urlField}, $row, 1);
+ $row++;
+ }
+
+ $row++;
+
+ $self->{selectAll} = new Gtk2::Button($parent->{lang}->{ImportSelectAll});
+ $self->{selectAll}->signal_connect('clicked' => sub {
+ my @children = $self->{table}->get_children;
+ foreach (@children)
+ {
+ $_->set_active(1) if $_->get_name eq 'GtkCheckButton';
+ }
+ });
+ $self->{table}->attach($self->{selectAll}, 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+ $row++;
+ $self->{selectNone} = new Gtk2::Button($parent->{lang}->{ImportSelectNone});
+ $self->{selectNone}->signal_connect('clicked' => sub {
+ my @children = $self->{table}->get_children;
+ # Remove 2 items corresponding to website to keep it checked
+ splice @children, 2, 2;
+ foreach (@children)
+ {
+ $_->set_active(0) if $_->get_name eq 'GtkCheckButton';
+ }
+ });
+ $self->{table}->attach($self->{selectNone}, 0, 1, $row, $row + 1, 'fill', 'fill', 0, 0);
+
+
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCPluginsBase.pm b/lib/gcstar/GCPlugins/GCPluginsBase.pm
new file mode 100644
index 0000000..728e23a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCPluginsBase.pm
@@ -0,0 +1,396 @@
+package GCPlugins::GCPluginsBase;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+{
+ package GCPluginParser;
+ use base qw(HTML::Parser);
+ use LWP::Simple qw($ua);
+ use HTTP::Cookies::Netscape;
+ use URI::Escape;
+ use HTML::Entities;
+ use Encode;
+ use File::Spec;
+
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $ua->agent('Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.5) Gecko/20041111 Firefox/1.0');
+ $ua->default_header('Accept-Encoding' => 'x-gzip');
+ $ua->default_header('Accept' => 'text/html');
+ $self->{ua} = $ua;
+
+ $self->{itemIdx} = -1;
+ $self->{itemsList} = ();
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getItemsNumber
+ {
+ my ($self) = @_;
+
+ return $self->{itemIdx} + 1;
+ }
+
+ sub getItems
+ {
+ my ($self) = @_;
+ return @{$self->{itemsList}};
+ }
+
+ sub load
+ {
+ my $self = shift;
+
+ $self->checkProxy;
+ $self->checkCookieJar;
+
+ $self->{itemIdx} = -1;
+ $self->{isInfo} = 0;
+ $self->{itemsList} = ();
+
+ #my $word = uri_escape_utf8($self->{title});
+ my $title2 = encode($self->getSearchCharset, $self->{title});
+ my $word = uri_escape($title2);
+ $word =~ s/%20/+/g;
+
+ my $post;
+ my $html;
+
+ # For multi-pass plugins, the plugin will have set the url to load for
+ # the next pass as nextUrl. If this doesn't exist, we're either on the
+ # first pass, or only using a one-pass plugin, so call getSearchUrl
+ # to find the url to retrieve
+ if ($self->{nextUrl})
+ {
+ $html = $self->loadPage($self->{nextUrl});
+ }
+ else
+ {
+ $html = $self->loadPage($self->getSearchUrl($word));
+ }
+
+ $self->{parsingList} = 1;
+ $html = $self->preProcess($html);
+ decode_entities($html)
+ if $self->decodeEntitiesWanted;
+ $self->{inside} = undef;
+ $self->parse($html);
+
+ my @noConversion = @{$self->getNotConverted};
+ foreach my $item (@{$self->{itemsList}})
+ {
+ foreach (keys %{$item})
+ {
+ next if $_ eq 'url';
+ $item->{$_} = $self->convertCharset($item->{$_})
+ if ! GCUtils::inArrayTest($_, @noConversion);
+ }
+ }
+
+ }
+
+ sub loadPage
+ {
+ my ($self, $url, $post, $noSave) = @_;
+ my $debugPhase = $ENV{GCS_DEBUG_PLUGIN_PHASE};
+ my $debugFile;
+ $debugFile = File::Spec->tmpdir.'/'.GCUtils::getSafeFileName($url)
+ if ($debugPhase > 0);
+ $self->{loadedUrl} = $url if ! $noSave;
+ my $response;
+ my $result;
+ if ($debugPhase != 2)
+ {
+ if ($post)
+ {
+ $response = $ua->post($url, $post);
+ }
+ else
+ {
+ $response = $ua->get($url);
+ }
+
+ #UnclePetros 03/07/2011:
+ #code to handle correctly 302 response messages
+ my $label1 = $response->code;
+ if($response->code == '302'){
+ my $location = $response->header("location");
+ $response = $ua->get($location);
+ $self->{loadedUrl} = $location;
+ }
+
+ eval {
+ $result = $response->decoded_content;
+ };
+ if ($debugPhase == 1)
+ {
+ open DEBUG_FILE, ">$debugFile";
+ print DEBUG_FILE ($result || $response->content);
+ close DEBUG_FILE;
+ }
+ }
+ else
+ {
+ local $/;
+ open DEBUG_FILE, "$debugFile";
+ $result = <DEBUG_FILE>;
+ utf8::decode($result);
+ }
+ return $result || ($response && $response->content);
+ }
+
+ sub capWord
+ {
+ my ($self, $msg) = @_;
+
+ use locale;
+
+ (my $newmsg = lc $msg) =~ s/(\s|,|^)(\w)(\w)(\w*?)/$1\U$2\E$3$4/gi;
+ return $newmsg;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return [''];
+ }
+
+ sub getSearchFields
+ {
+ my ($self, $model) = @_;
+
+ my $result = '';
+ $result .= $model->getDisplayedLabel($_).', ' foreach (@{$self->getSearchFieldsArray});
+ $result =~ s/, $//;
+ return $result;
+ }
+
+ sub hasField
+ {
+ my ($self, $field) = @_;
+
+ return $self->{hasField}->{$field};
+ }
+
+ sub getExtra
+ {
+ return '';
+ }
+
+ # Character set for web page text
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ # Character set for encoding search term, can sometimes be different
+ # to the page encoding, but we default to the same as the page set
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ return getCharset;
+ }
+
+ # For some plugins, we need extra checks to determine if urls match
+ # the language the plugin is written for. This allows us to correctly determine
+ # if a drag and dropped url is handled by a particular plugin. If these
+ # checks are necessary, return 1, and make sure plugin handles the
+ # the testURL function correctly
+ sub needsLanguageTest
+ {
+ return 0;
+ }
+
+ # Used to test if a given url is handled by the plugin. Only required if
+ # needsLanguageTest is true.
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ return 1
+ }
+
+ # Determines whether plugin should be the default plugins gcstar uses.
+ # Plugins with this attribute set will appear first in plugin list,
+ # and will be highlighted with a star icon. A returned value of 1
+ # means the plugin is preferred if it's language matches the user's language,
+ # a returned value of 2 mean's it's preferred regardless of the language.
+ sub isPreferred
+ {
+ return 0;
+ }
+
+ sub getPreferred
+ {
+ return isPreferred;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 1;
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+
+ my $result = $value;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach my $line(@{$value})
+ {
+ my $i = 0;
+ map {$_ = decode($self->getCharset, $_)} @{$line};
+ }
+ }
+ else
+ {
+ eval {
+ $result = decode($self->getCharset, $result);
+ };
+ }
+ return $result;
+ }
+
+ sub getItemInfo
+ {
+ my $self = shift;
+
+ eval {
+ $self->init;
+ };
+ my $idx = $self->{wantedIdx};
+ my $url = $self->getItemUrl($self->{itemsList}[$idx]->{url});
+ $self->loadUrl($url);
+ return $self->{curInfo};
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+ $self->checkProxy;
+ $self->checkCookieJar;
+ my $realUrl = $self->changeUrl($url);
+ my $html = $self->loadPage($realUrl);
+ $self->{parsingList} = 0;
+ #$html = $self->convertCharset($html);
+ $self->{curInfo} = {};
+
+ $html = $self->preProcess($html);
+ decode_entities($html)
+ if $self->decodeEntitiesWanted;
+
+ $self->{curInfo}->{$self->{urlField}} = $url;
+ $self->{inside} = undef;
+ $self->parse($html);
+
+ my @noConversion = @{$self->getNotConverted};
+ foreach (keys %{$self->{curInfo}})
+ {
+ next if $_ eq $self->{urlField};
+ $self->{curInfo}->{$_} = $self->convertCharset($self->{curInfo}->{$_})
+ if ! GCUtils::inArrayTest($_, @noConversion);
+ if (ref($self->{curInfo}->{$_}) ne 'ARRAY')
+ {
+ $self->{curInfo}->{$_} =~ s/\|/,/gm;
+ $self->{curInfo}->{$_} =~ s/\r//gm;
+ $self->{curInfo}->{$_} =~ s/[ \t]*$//gm;
+ }
+ }
+ $self->{curInfo}->{$self->{urlField}} .= $GCModel::linkNameSeparator.$self->getName;
+ return $self->{curInfo};
+ }
+
+ sub setProxy
+ {
+ my ($self, $proxy) = @_;
+
+ $self->{proxy} = $proxy;
+ }
+
+ sub checkProxy
+ {
+ my $self = shift;
+ $ua->proxy(['http'], $self->{proxy});
+ #$self->{ua}->proxy(['http'], $self->{proxy});
+ }
+
+ sub setCookieJar
+ {
+ my ($self, $cookieJar) = @_;
+ $self->{cookieJar} = $cookieJar;
+ }
+
+ sub checkCookieJar
+ {
+ my $self = shift;
+ $ua->cookie_jar(HTTP::Cookies::Netscape->new(
+ 'file' => "$self->{cookieJar}",
+ 'autosave' => 1,));
+ }
+
+ # Used to set the number of passes the plugin requires
+ sub getNumberPasses
+ {
+ # Most plugins only need to search once, so default to one pass
+ return 1;
+ }
+
+ # Returns undef if it doesn't support search using barcode scanner
+ sub getEanField
+ {
+ return undef;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm
new file mode 100644
index 0000000..478f1b8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTVepisodesCommon.pm
@@ -0,0 +1,67 @@
+package GCPlugins::GCTVepisodes::GCTVepisodesCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 10;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCTVepisodes::GCTVepisodesPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->SUPER::loadUrl($url);
+
+ if (! $self->{curInfo}->{title} && $self->{curInfo}->{original})
+ {
+ $self->{curInfo}->{title} = $self->{curInfo}->{original};
+ $self->{curInfo}->{original} = '';
+ }
+ return $self->{curInfo};
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm
new file mode 100644
index 0000000..f275ca5
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdb.pm
@@ -0,0 +1,360 @@
+package GCPlugins::GCTVepisodes::GCTvdb;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTVepisodesCommon;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdb;
+
+ use base qw(GCPlugins::GCTVepisodes::GCTVepisodesPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{pass} eq 1)
+ {
+ # Searching on series name
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Series'],
+ KeyAttr => []
+ );
+
+ foreach my $series ( @{$xml->{Series}})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{nextUrl} = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/".$series->{id}."/all/".$self->siteLanguage().".xml";
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $series->{SeriesName};
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $series->{FirstAired};
+ }
+ }
+ else
+ {
+ if ($self->{parsingList})
+ {
+ # Searching on episodes
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+
+ );
+
+ foreach my $episode (@{$xml->{Episode}})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $episode->{EpisodeName}
+ if (!ref($episode->{EpisodeName}));
+ $self->{itemsList}[$self->{itemIdx}]->{season} = $episode->{SeasonNumber};
+ $self->{itemsList}[$self->{itemIdx}]->{episode} = $episode->{EpisodeNumber};
+ $self->{itemsList}[$self->{itemIdx}]->{director} = $episode->{Director}
+ if (!ref($episode->{Director}));
+ $self->{itemsList}[$self->{itemIdx}]->{writer} = $episode->{Writer}
+ if (!ref($episode->{Writer}));
+ $self->{itemsList}[$self->{itemIdx}]->{overview} = $episode->{Overview}
+ if (!ref($episode->{Overview}));
+ $self->{itemsList}[$self->{itemIdx}]->{image} = "http://thetvdb.com/banners/".$episode->{filename}
+ if (!ref($episode->{filename}));
+ $self->{itemsList}[$self->{itemIdx}]->{series} = $xml->{Series}->{SeriesName}
+ if (!ref($xml->{Series}->{SeriesName}));
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $xml->{Series}->{FirstAired}
+ if (!ref($xml->{Series}->{FirstAired}));
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $xml->{Series}->{Actors}
+ if (!ref($xml->{Series}->{Actors}));
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $xml->{Series}->{Genre}
+ if (!ref($xml->{Series}->{Genre}));
+ $self->{itemsList}[$self->{itemIdx}]->{runtime} = $xml->{Series}->{Runtime}
+ if (!ref($xml->{Series}->{Runtime}));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.thetvdb.com/?tab=episode&seriesid=".$episode->{seriesid}."&seasonid=".$episode->{seasonid}."&id=".$episode->{id}."&lid=".$self->siteLanguageCode();
+ }
+ }
+ elsif ($self->{pass} != 2)
+ {
+ # Process a given url
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+ );
+
+ # Need to grab the generic series info too
+ my $response = $ua->get('http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/'.$xml->{Episode}[0]->{seriesid}.'/'.$self->siteLanguage().'.xml');
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+ my $seriesxml = $xs->XMLin(
+ $result,
+ ForceArray => ['Series'],
+ KeyAttr => [],
+ );
+ $self->{curInfo}->{season} = $xml->{Episode}[0]->{SeasonNumber};
+ $self->{curInfo}->{episode} = $xml->{Episode}[0]->{EpisodeNumber};
+ $self->{curInfo}->{name} = $xml->{Episode}[0]->{EpisodeName};
+ $self->{curInfo}->{series} = $seriesxml->{Series}[0]->{SeriesName};
+ $self->{curInfo}->{director} = $xml->{Episode}[0]->{Director}
+ if (!ref($xml->{Episode}[0]->{Director}));
+ $self->{curInfo}->{director} =~ s/^\|//;
+ $self->{curInfo}->{director} =~ s/\|$//;
+ $self->{curInfo}->{firstaired} = $xml->{Episode}[0]->{FirstAired}
+ if (!ref($xml->{Episode}[0]->{FirstAired}));
+ $self->{curInfo}->{writer} = $xml->{Episode}[0]->{Writer}
+ if (!ref($xml->{Episode}[0]->{Writer}));
+ $self->{curInfo}->{writer} =~ s/^\|//;
+ $self->{curInfo}->{writer} =~ s/\|$//;
+
+ if (!ref($seriesxml->{Series}[0]->{Actors}))
+ {
+ my $actorString = $seriesxml->{Series}[0]->{Actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+ }
+
+ if (!ref($seriesxml->{Series}[0]->{Genre}))
+ {
+ my $genreString = $seriesxml->{Series}[0]->{Genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+ }
+
+ $self->{curInfo}->{time} = $seriesxml->{Series}[0]->{Runtime};
+ $self->{curInfo}->{image} = "http://thetvdb.com/banners/".$xml->{Episode}[0]->{filename}
+ if (!ref($xml->{Episode}[0]->{filename}));
+ $self->{curInfo}->{synopsis} = $xml->{Episode}[0]->{Overview}
+ if (!ref($xml->{Episode}[0]->{Overview}));
+ $self->{curInfo}->{webPage} = "http://www.thetvdb.com/?tab=episode&seriesid=".$xml->{Episode}[0]->{seriesid}."&seasonid=".$xml->{Episode}[0]->{seasonid}."&id=".$xml->{Episode}[0]->{id}."&lid=".$self->siteLanguageCode();
+ }
+ else
+ {
+ $self->{curInfo}->{season} = $self->{itemsList}[$self->{wantedIdx}]->{season};
+ $self->{curInfo}->{episode} = $self->{itemsList}[$self->{wantedIdx}]->{episode};
+ $self->{curInfo}->{name} = $self->{itemsList}[$self->{wantedIdx}]->{name};
+ $self->{curInfo}->{series} = $self->{itemsList}[$self->{wantedIdx}]->{series};
+ $self->{curInfo}->{director} = $self->{itemsList}[$self->{wantedIdx}]->{director};
+ $self->{curInfo}->{director} =~ s/^\|//;
+ $self->{curInfo}->{director} =~ s/\|$//;
+ $self->{curInfo}->{firstaired} = $self->{itemsList}[$self->{wantedIdx}]->{firstaired};
+ $self->{curInfo}->{writer} = $self->{itemsList}[$self->{wantedIdx}]->{writer};
+ $self->{curInfo}->{writer} =~ s/^\|//;
+ $self->{curInfo}->{writer} =~ s/\|$//;
+
+ my $actorString = $self->{itemsList}[$self->{wantedIdx}]->{actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+
+ my $genreString = $self->{itemsList}[$self->{wantedIdx}]->{genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+ $self->{curInfo}->{time} = $self->{itemsList}[$self->{wantedIdx}]->{runtime};
+ $self->{curInfo}->{image} = $self->{itemsList}[$self->{wantedIdx}]->{image};
+ $self->{curInfo}->{synopsis} = $self->{itemsList}[$self->{wantedIdx}]->{overview};
+ $self->{curInfo}->{webPage} = $self->{itemsList}[$self->{wantedIdx}]->{url};
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.thetvdb.com/api/GetSeries.php?seriesname=$word&language=".$self->siteLanguage();
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.thetvdb.com";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the tvdb api, so we need to find the episode id
+ # and return a url corresponding to the api page for this movie
+
+ $url =~ /[\?&]id=([0-9]+)*/;
+ my $id = $1;
+ $url = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/episodes/$id/".$self->siteLanguage().".xml";
+ }
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 2;
+ }
+
+ sub getName
+ {
+ return "Tvdb";
+ }
+
+ sub needsLanguageTest
+ {
+ return 1;
+ }
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ if ($self->{pass} == 1)
+ {
+ $self->{hasField} = {
+ name => 1,
+ firstaired => 1,
+ };
+ }
+ else
+ {
+ $self->{hasField} = {
+ name => 1,
+ season => 1,
+ episode => 1,
+ };
+ }
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'en';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 7;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm
new file mode 100644
index 0000000..dc753f1
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbES.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVepisodes::GCTvdbES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdbES;
+
+ use base qw(GCPlugins::GCTVepisodes::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getName
+ {
+ return "Tvdb ES";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'es';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 16;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm
new file mode 100644
index 0000000..791cee7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbFR.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVepisodes::GCTvdbFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdbFR;
+
+ use base qw(GCPlugins::GCTVepisodes::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getName
+ {
+ return "Tvdb FR";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'fr';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 17;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm
new file mode 100644
index 0000000..c3eab7b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVepisodes/GCTvdbIT.pm
@@ -0,0 +1,60 @@
+package GCPlugins::GCTVepisodes::GCTvdbIT;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVepisodes::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVepisodes::GCPluginTvdbIT;
+
+ use base qw(GCPlugins::GCTVepisodes::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getName
+ {
+ return "Tvdb IT";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'it';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 15;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm
new file mode 100644
index 0000000..119b1df
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTVseriesCommon.pm
@@ -0,0 +1,53 @@
+package GCPlugins::GCTVseries::GCTVseriesCommon;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 10;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCTVseries::GCTVseriesPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm b/lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm
new file mode 100644
index 0000000..e4d4eb2
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCThemoviedb.pm
@@ -0,0 +1,340 @@
+package GCPlugins::GCTVseries::GCthemoviedb;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCTVseries::GCTVseriesCommon;
+
+{
+
+ package GCPlugins::GCTVseries::GCPluginThemoviedb;
+
+ use base 'GCPlugins::GCTVseries::GCTVseriesPluginsBase';
+ use XML::Simple;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page !~ m/>Nothing found.<\/movie/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'movie', 'alternative_name' ],
+ KeyAttr => ['id']
+ );
+ my $movie;
+ foreach $movie (keys(%{$xml->{'movies'}->{'movie'}}))
+ {
+ # We only want movies, not series and everything else the api returns
+ if ($xml->{'movies'}->{'movie'}->{$movie}->{'type'} eq "movie")
+ {
+ $self->{itemIdx}++;
+ my $url = "http://api.themoviedb.org/2.1/Movie.getInfo/en/xml/9fc8c3894a459cac8c75e3284b712dfc/" . $movie;
+ # If the release date is missing, it will be returned as an array, so only save the release if
+ # it's not an array
+ my $released = "";
+ if (!ref($xml->{'movies'}->{'movie'}->{$movie}->{'released'}))
+ {
+ $released = $xml->{'movies'}->{'movie'}->{$movie}->{'released'};
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{firstaired} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =
+ $xml->{'movies'}->{'movie'}->{$movie}->{'name'};
+ # Now, check if there's any alternative names, and if so, add them in as
+ # additional search results.
+ for my $alternateName (
+ @{$xml->{'movies'}->{'movie'}->{$movie}->{alternative_name}})
+ {
+ if (!ref($alternateName))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{firstaired} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $alternateName;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'country', 'person', 'category', 'size', 'alternative_name' ],
+ KeyAttr => ['']
+ );
+
+ if (
+ (
+ $xml->{movies}->{movie}->{name} ne
+ $self->{itemsList}[ $self->{wantedIdx} ]->{title}
+ )
+ && ($self->{itemsList}[ $self->{wantedIdx} ]->{title})
+ )
+ {
+ # Name returned by tmdb is different to the one the user selected
+ # this means they choose an translated name, so use the name they choose
+ # as the default
+ $self->{curInfo}->{title} = $self->{itemsList}[ $self->{wantedIdx} ]->{title};
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $xml->{movies}->{movie}->{name};
+ }
+
+ # Try and guess the series name
+ $xml->{movies}->{movie}->{name} =~ /^(.*):/;
+ if ($1 ne '')
+ {
+ $self->{curInfo}->{series} = $1;
+ }
+ else
+ {
+ $self->{curInfo}->{series} = $xml->{movies}->{movie}->{name};
+ }
+
+ # Set season to 0 and set special flag
+ $self->{curInfo}->{season} = 0;
+ $self->{curInfo}->{specialep} = 1;
+
+ $self->{curInfo}->{webPage} = $xml->{movies}->{movie}->{url};
+
+ # The following fields could be missing from the xml, so we need to check if they're blank
+ # (in which case they'll be a array)
+ $self->{curInfo}->{synopsis} = $xml->{movies}->{movie}->{overview}
+ if (!ref($xml->{movies}->{movie}->{overview}));
+ $self->{curInfo}->{ratingpress} = $xml->{movies}->{movie}->{rating}
+ if (!ref($xml->{movies}->{movie}->{rating}));
+ $self->{curInfo}->{firstaired} = $xml->{movies}->{movie}->{released}
+ if (!ref($xml->{movies}->{movie}->{released}));
+ $self->{curInfo}->{time} = $xml->{movies}->{movie}->{runtime} . " mins"
+ if (!ref($xml->{movies}->{movie}->{runtime}));
+
+ if (!ref($xml->{movies}->{movie}->{certification}))
+ {
+ my $certification;
+ $certification = $xml->{movies}->{movie}->{certification};
+ $self->{curInfo}->{age} = 1
+ if ($certification eq 'Unrated') || ($certification eq 'Open');
+ $self->{curInfo}->{age} = 2
+ if ($certification eq 'G') || ($certification eq 'Approved');
+ $self->{curInfo}->{age} = 5
+ if ($certification eq 'PG')
+ || ($certification eq 'M')
+ || ($certification eq 'GP');
+ $self->{curInfo}->{age} = 13 if $certification eq 'PG-13';
+ $self->{curInfo}->{age} = 17 if $certification eq 'R';
+ $self->{curInfo}->{age} = 18
+ if ($certification eq 'NC-17') || ($certification eq 'X');
+ }
+
+ for my $country (@{$xml->{movies}->{movie}->{countries}->{country}})
+ {
+ $self->{curInfo}->{country} .= $country->{name} . ', ';
+ }
+ $self->{curInfo}->{country} =~ s/, $//;
+ for my $person (@{$xml->{movies}->{movie}->{cast}->{person}})
+ {
+ my $name = $person->{name};
+ # Strip any blank spaces from start and end of name
+ $name =~ s/\s*$//;
+ $name =~ s/^\s*//;
+ if ($person->{job} eq "Director")
+ {
+ $self->{curInfo}->{director} .= $name . ', ';
+ }
+ if ($person->{job} eq "Producer")
+ {
+ $self->{curInfo}->{producer} .= $name . ', ';
+ }
+ if ($person->{job} eq "Music")
+ {
+ $self->{curInfo}->{music} .= $name . ', ';
+ }
+ elsif ($person->{job} eq "Actor")
+ {
+ if ($self->{actorsCounter} < $GCPlugins::GCTVseries::GCTVseriesCommon::MAX_ACTORS)
+ {
+
+ push @{$self->{curInfo}->{actors}}, [$name];
+ my $role = $person->{character};
+ $role =~ s/\s*$//;
+ $role =~ s/^\s*//;
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} ]}, $role;
+ $self->{actorsCounter}++;
+ }
+ }
+ }
+ $self->{curInfo}->{director} =~ s/, $//;
+ $self->{curInfo}->{producer} =~ s/, $//;
+ $self->{curInfo}->{music} =~ s/, $//;
+ for my $category (@{$xml->{movies}->{movie}->{categories}->{category}})
+ {
+ push @{$self->{curInfo}->{genre}}, [ $category->{name} ]
+ if ($category->{type} eq 'genre');
+ }
+ for my $image (@{$xml->{movies}->{movie}->{images}->{image}})
+ {
+ if ($image->{type} eq "poster")
+ {
+ # Fetch either the big original pic, or just the small thumbnail pic
+ if ( (($self->{bigPics}) && ($image->{size} eq "original"))
+ || (!($self->{bigPics}) && ($image->{size} eq "thumb")))
+ {
+ if (!$self->{curInfo}->{image})
+ {
+ $self->{curInfo}->{image} = $image->{url};
+ }
+ }
+ }
+ }
+
+ # We have to return something as the name, even though this field will get automatically
+ # calculated for tv series collections.
+ $self->{curInfo}->{name} = "temp";
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ firstaired => 1
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.themoviedb.org";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the movie db api, so we need to find the movie id
+ # and return a url corresponding to the api page for this movie
+ my $found = index(reverse($url), "/");
+ if ($found >= 0)
+ {
+ my $id = substr(reverse($url), 0, $found);
+ $url =
+"http://api.themoviedb.org/2.1/Movie.getInfo/en/xml/9fc8c3894a459cac8c75e3284b712dfc/"
+ . reverse($id);
+ }
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return
+"http://api.themoviedb.org/2.1/Movie.search/en/xml/9fc8c3894a459cac8c75e3284b712dfc/$word";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return "The Movie DB";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm
new file mode 100644
index 0000000..ca4dc68
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdb.pm
@@ -0,0 +1,466 @@
+package GCPlugins::GCTVseries::GCTvdb;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTVseriesCommon;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdb;
+
+ use base qw(GCPlugins::GCTVseries::GCTVseriesPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{pass} eq 1)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Series'],
+ KeyAttr => []
+ );
+
+ foreach my $series ( @{$xml->{Series}})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{nextUrl} = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/".$series->{id}."/all/".$self->siteLanguage().".xml";
+ $self->{itemsList}[$self->{itemIdx}]->{series} = $series->{SeriesName};
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $series->{FirstAired};
+ }
+ }
+ else
+ {
+ if ($self->{parsingList})
+ {
+ # Searching on episodes
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+ );
+
+ # Need to grab the banners info too
+ my $response = $ua->get('http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/'.$xml->{Episode}[0]->{seriesid}.'/banners.xml');
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+ my $bannersxml = $xs->XMLin(
+ $result,
+ ForceArray => ['Banner'],
+ KeyAttr => [],
+ );
+
+ my @seasonNumbers;
+ foreach my $episode (@{$xml->{Episode}})
+ {
+ if (!grep(/\b$episode->{SeasonNumber}\b/,@seasonNumbers))
+ {
+ push (@seasonNumbers, $episode->{SeasonNumber});
+ $self->{itemIdx}++;
+
+ $self->{itemsList}[$self->{itemIdx}]->{series} = $xml->{Series}->{SeriesName}
+ if (!ref($xml->{Series}->{SeriesName}));
+ $self->{itemsList}[$self->{itemIdx}]->{season} = $episode->{SeasonNumber};
+ $self->{itemsList}[$self->{itemIdx}]->{overview} = $xml->{Series}->{Overview}
+ if (!ref($xml->{Series}->{Overview}));
+
+ # Find banner
+ foreach my $banner (@{$bannersxml->{Banner}})
+ {
+ if ($banner->{Season} == $episode->{SeasonNumber})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{image} = "http://thetvdb.com/banners/".$banner->{BannerPath}
+ if (!$self->{itemsList}[$self->{itemIdx}]->{image});
+ }
+ }
+
+ my $seasonEpisodes;
+ # Episodes
+ my $episodePos = 0;
+ foreach my $checkEpisode (@{$xml->{Episode}})
+ {
+ if (($checkEpisode->{EpisodeNumber} != 0) || (!ref($checkEpisode->{EpisodeName})))
+ {
+ # Prefer dvd episode numbers
+ if (($checkEpisode->{DVD_season} == $episode->{SeasonNumber})
+ || ((ref($checkEpisode->{DVD_season})) && ($checkEpisode->{SeasonNumber} == $episode->{SeasonNumber})))
+ {
+ if (ref($checkEpisode->{DVD_episodenumber}))
+ {
+ push (@{$seasonEpisodes},[ $checkEpisode->{EpisodeNumber}]);
+ }
+ else
+ {
+ my $trimmedEpNumber = $checkEpisode->{DVD_episodenumber};
+ $trimmedEpNumber =~ /^(\d*)/;
+ push (@{$seasonEpisodes},[ $1]);
+ }
+
+ push @{$seasonEpisodes->[ $episodePos ]}, $checkEpisode->{EpisodeName};
+ $episodePos++;
+ }
+ }
+ }
+
+ # If we found episodes, sort them
+ if (scalar( $seasonEpisodes) > 0)
+ {
+ my @sortedSeasonEpisodes = sort{ $a->[ 0 ] <=> $b->[ 0 ] } @{$seasonEpisodes};
+ @{$self->{itemsList}[$self->{itemIdx}]->{episodes}} = @sortedSeasonEpisodes;
+ }
+
+
+ $self->{itemsList}[$self->{itemIdx}]->{firstaired} = $xml->{Series}->{FirstAired}
+ if (!ref($xml->{Series}->{FirstAired}));
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $xml->{Series}->{Actors}
+ if (!ref($xml->{Series}->{Actors}));
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $xml->{Series}->{Genre}
+ if (!ref($xml->{Series}->{Genre}));
+ $self->{itemsList}[$self->{itemIdx}]->{runtime} = $xml->{Series}->{Runtime}
+ if (!ref($xml->{Series}->{Runtime}));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.thetvdb.com/?tab=season&seriesid=".$episode->{seriesid}."&seasonid=".$episode->{seasonid}."&lid=".$self->siteLanguageCode();
+ }
+ }
+
+ }
+ elsif ($self->{pass} != 2)
+ {
+ # Process a given url
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => ['Episode'],
+ KeyAttr => [],
+ );
+
+ # Need to grab the banners info too
+ my $response = $ua->get('http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/'.$self->{seriesid}.'/banners.xml');
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+ my $bannersxml = $xs->XMLin(
+ $result,
+ ForceArray => ['Banner'],
+ KeyAttr => [],
+ );
+
+ $self->{curInfo}->{series} = $xml->{Series}->{SeriesName}
+ if (!ref($xml->{Series}->{SeriesName}));
+ $self->{curInfo}->{synopsis} = $xml->{Series}->{Overview}
+ if (!ref($xml->{Series}->{Overview}));
+ $self->{curInfo}->{firstaired} = $xml->{Series}->{FirstAired}
+ if (!ref($xml->{Series}->{FirstAired}));
+ $self->{curInfo}->{time} = $xml->{Series}->{Runtime}
+ if (!ref($xml->{Series}->{Runtime}));
+
+ if (!ref($xml->{Series}->{Actors}))
+ {
+ my $actorString = $xml->{Series}->{Actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+ }
+
+ if (!ref($xml->{Series}->{Genre}))
+ {
+ my $genreString = $xml->{Series}->{Genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+ }
+
+ # Find corresponding season number
+ foreach my $episode (@{$xml->{Episode}})
+ {
+ if (($episode->{seasonid} == $self->{seasonid})
+ && (!$self->{curInfo}->{season}))
+ {
+ $self->{curInfo}->{season} = $episode->{SeasonNumber};
+ $self->{curInfo}->{webPage} = "http://www.thetvdb.com/?tab=season&seriesid=".$episode->{seriesid}."&seasonid=".$episode->{seasonid}."&lid=".$self->siteLanguageCode();
+ }
+ }
+
+ my $seasonEpisodes;
+ # Episodes
+ my $episodePos = 0;
+ foreach my $checkEpisode (@{$xml->{Episode}})
+ {
+ if (($checkEpisode->{EpisodeNumber} != 0) || (!ref($checkEpisode->{EpisodeName})))
+ {
+ # Prefer dvd episode numbers
+ if (($checkEpisode->{DVD_season} == $self->{curInfo}->{season})
+ || ((ref($checkEpisode->{DVD_season})) && ($checkEpisode->{SeasonNumber} == $self->{curInfo}->{season})))
+ {
+ if (ref($checkEpisode->{DVD_episodenumber}))
+ {
+ push (@{$seasonEpisodes},[ $checkEpisode->{EpisodeNumber}]);
+ }
+ else
+ {
+ my $trimmedEpNumber = $checkEpisode->{DVD_episodenumber};
+ $trimmedEpNumber =~ /^(\d*)/;
+ push (@{$seasonEpisodes},[ $1]);
+ }
+
+ push @{$seasonEpisodes->[ $episodePos ]}, $checkEpisode->{EpisodeName};
+ $episodePos++;
+ }
+ }
+ }
+
+ # If we found episodes, sort them
+ if (scalar( $seasonEpisodes) > 0)
+ {
+ my @sortedSeasonEpisodes = sort{ $a->[ 0 ] <=> $b->[ 0 ] } @{$seasonEpisodes};
+ @{$self->{curInfo}->{episodes}} = @sortedSeasonEpisodes;
+ }
+
+ # Find banner
+ foreach my $banner (@{$bannersxml->{Banner}})
+ {
+ if ($banner->{Season} == $self->{curInfo}->{season})
+ {
+ $self->{curInfo}->{image} = "http://thetvdb.com/banners/".$banner->{BannerPath}
+ if (!$self->{curInfo}->{image});
+ }
+ }
+
+ $self->{curInfo}->{name} = "temp";
+
+ }
+ else
+ {
+ $self->{curInfo}->{season} = $self->{itemsList}[$self->{wantedIdx}]->{season};
+ $self->{curInfo}->{episode} = $self->{itemsList}[$self->{wantedIdx}]->{episode};
+ $self->{curInfo}->{name} = $self->{itemsList}[$self->{wantedIdx}]->{name};
+ $self->{curInfo}->{series} = $self->{itemsList}[$self->{wantedIdx}]->{series};
+ $self->{curInfo}->{director} = $self->{itemsList}[$self->{wantedIdx}]->{director};
+ $self->{curInfo}->{director} =~ s/^\|//;
+ $self->{curInfo}->{director} =~ s/\|$//;
+ $self->{curInfo}->{firstaired} = $self->{itemsList}[$self->{wantedIdx}]->{firstaired};
+ $self->{curInfo}->{writer} = $self->{itemsList}[$self->{wantedIdx}]->{writer};
+ $self->{curInfo}->{writer} =~ s/^\|//;
+ $self->{curInfo}->{writer} =~ s/\|$//;
+
+ my $actorString = $self->{itemsList}[$self->{wantedIdx}]->{actors};
+ $actorString =~ s/^\|//;
+ $actorString =~ s/\|$//;
+ for my $actor (split(/\|/, $actorString))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor];
+ }
+
+ my $genreString = $self->{itemsList}[$self->{wantedIdx}]->{genre};
+ $genreString =~ s/^\|//;
+ $genreString =~ s/\|$//;
+ for my $genre (split(/\|/, $genreString))
+ {
+ push @{$self->{curInfo}->{genre}}, [$genre];
+ }
+
+ $self->{curInfo}->{time} = $self->{itemsList}[$self->{wantedIdx}]->{runtime};
+ $self->{curInfo}->{image} = $self->{itemsList}[$self->{wantedIdx}]->{image};
+ $self->{curInfo}->{synopsis} = $self->{itemsList}[$self->{wantedIdx}]->{overview};
+ $self->{curInfo}->{webPage} = $self->{itemsList}[$self->{wantedIdx}]->{url};
+ $self->{curInfo}->{episodes} = $self->{itemsList}[$self->{wantedIdx}]->{episodes};
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.thetvdb.com/api/GetSeries.php?seriesname=$word&language=".$self->siteLanguage();
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.thetvdb.com";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the tvdb api, so we need to find the episode id
+ # and return a url corresponding to the api page for this movie
+
+ $url =~ /[\?&]id=([0-9]+)*/;
+ my $id = $1;
+ $url =~ /[\?&]seriesid=([0-9]+)*/;
+ $self->{seriesid} = $1;
+ $url =~ /[\?&]seasonid=([0-9]+)*/;
+ $self->{seasonid} = $1;
+ $url = "http://www.thetvdb.com/api/A8CC4AF70D0385F3/series/".$self->{seriesid}."/all/".$self->siteLanguage().".xml";
+ }
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 2;
+ }
+
+ sub getName
+ {
+ return "Tvdb";
+ }
+
+ sub needsLanguageTest
+ {
+ return 1;
+ }
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ if ($self->{pass} == 1)
+ {
+ $self->{hasField} = {
+ series => 1,
+ firstaired => 1,
+ };
+ }
+ else
+ {
+ $self->{hasField} = {
+ series => 1,
+ season => 1
+ };
+ }
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'en';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 7;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm
new file mode 100644
index 0000000..3943bf0
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbES.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVseries::GCTvdbES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdbES;
+
+ use base qw(GCPlugins::GCTVseries::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getName
+ {
+ return "Tvdb ES";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'es';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 16;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm
new file mode 100644
index 0000000..6590f30
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbFR.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCTVseries::GCTvdbFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdbFR;
+
+ use base qw(GCPlugins::GCTVseries::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getName
+ {
+ return "Tvdb FR";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'fr';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 17;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm
new file mode 100644
index 0000000..cc4da08
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCTVseries/GCTvdbIT.pm
@@ -0,0 +1,60 @@
+package GCPlugins::GCTVseries::GCTvdbIT;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCTVseries::GCTvdb;
+
+
+{
+ package GCPlugins::GCTVseries::GCPluginTvdbIT;
+
+ use base qw(GCPlugins::GCTVseries::GCPluginTvdb);
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getName
+ {
+ return "Tvdb IT";
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'it';
+ }
+
+ sub siteLanguageCode
+ {
+ my $self = shift;
+
+ return 15;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm b/lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm
new file mode 100644
index 0000000..a1a4500
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCReservoirJeux.pm
@@ -0,0 +1,418 @@
+package GCPlugins::GCboardgames::GCReservoirJeux;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCboardgames::GCboardgamesCommon;
+
+{
+ package GCPlugins::GCboardgames::GCPluginReservoirJeux;
+
+ use base qw(GCPlugins::GCboardgames::GCboardgamesPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+
+ if ($self->{parsingList})
+ {
+ # Parse the search results here
+ if (($tagname eq "h3") && ($attr->{class} =~ /^rusearch_result/))
+ {
+ $self->{itemIdx}++;
+ $self->{isBoardgame} = 1;
+ $self->{insideName} = 1;
+ }
+ if ($self->{isBoardgame})
+ {
+ if (($tagname eq "a") && ($attr->{href} ne "#") && ($attr->{class} =~ /^lien_item/))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isBoardgame} = 0;
+ }
+ }
+ }
+ else
+ {
+ # Parse the items page here. Basically we do this by seaching for tags which match certain criteria, then preparing to grab
+ # the text inside these tags
+
+ if (($tagname eq "h1"))
+ {
+ $self->{insideName} = 1;
+ }
+ elsif (($tagname eq "div"))
+ {
+ if ($attr->{id} eq "fiche_technique_image")
+ {
+ $self->{insideImage} = 1;
+ }
+ elsif ($attr->{id} eq "bloc_centre_extensions")
+ {
+ $self->{insideExpansionList} = 1;
+ }
+ elsif ($attr->{id} eq "bloc_centre_extensions_bottom")
+ {
+ $self->{insideExpansionList} = 0;
+ }
+ elsif ($attr->{class} eq "fiche_technique_sep")
+ {
+ $self->{insideCategoryRow} = 0;
+ $self->{insideMechanicRow} = 0;
+ }
+
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($self->{insideImage})
+ {
+ $self->{curInfo}->{boxpic} = "http://www.reservoir-jeux.com".$attr->{src} if ! $self->{curInfo}->{boxpic};
+ $self->{insideImage} = 0;
+ }
+ if ($self->{insideExpansionList})
+ {
+ $self->{curInfo}->{expandedby} .= $attr->{alt}.','
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{class} eq "lien_item")
+ {
+ if ($self->{nextIsExpands})
+ {
+ $self->{insideExpands} = 1;
+ $self->{nextIsExpands} = 0;
+ }
+
+ if ($attr->{href} =~ /type=editeur/)
+ {
+ $self->{insidePublisher} = 1;
+ }
+ elsif ($attr->{href} =~ /type=auteur/)
+ {
+ $self->{insideDesigner} = 1;
+ }
+ elsif ($attr->{href} =~ /type=illustrateur/)
+ {
+ $self->{insideIllustrator} = 1;
+ }
+ elsif ($attr->{href} =~ /tag_id=/)
+ {
+ if ($self->{insideMechanicRow})
+ {
+ $self->{insideMechanic} = 1;
+ }
+ elsif ($self->{insideCategoryRow})
+ {
+ $self->{insideCategory} = 1;
+ }
+ }
+ elsif ($attr->{href} =~ /type=illustrateur/)
+ {
+ $self->{insideIllustrator} = 1;
+ }
+
+
+ }
+ }
+ elsif (($tagname eq "span") && ($attr->{class} eq "prod_description"))
+ {
+ $self->{insideDescription} = 1;
+ }
+
+ if ($tagname eq "br")
+ {
+ if($self->{insideDesignerRow})
+ {
+ $self->{curInfo}->{designedby} =~ s/\s\x2d\s$//g;
+ $self->{insideDesignerRow} = 0;
+ }
+ if($self->{insideIllustratorRow})
+ {
+ $self->{curInfo}->{illustratedby} =~ s/\s\x2d\s$//g;
+ $self->{insideIllustratorRow} = 0;
+ }
+ }
+
+ if ($self->{insideDescription})
+ {
+ if (($tagname eq "br") || ($tagname eq "p"))
+ {
+ # neatens up the description a little by starting new line on br tags
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif ($tagname eq "li")
+ {
+ # basic formatting of lists
+ $self->{curInfo}->{description} .= " - ";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{insideTechnicalDetails} && $tagname eq "div")
+ {
+ $self->{insideTechnicalDetails} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2);
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/^\s{2,//;
+ #French accents substitution
+ $origtext =~ s/&agrave;/à/;
+ $origtext =~ s/&Agrave;/À/;
+ $origtext =~ s/&eacute;/é/;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBoardgame} && $self->{insideName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{insideName} = 0;
+ }
+
+ }
+ else
+ {
+ # Parse the text items page here.
+
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{name} =~ s/^\s+//;
+ $self->{curInfo}->{name} =~ s/\s+\Z//;
+ $self->{insideName} = 0;
+ }
+ if ($self->{inside}->{h2})
+ {
+ if ($origtext =~ /^Fiche technique/)
+ {
+ $self->{insideTechnicalDetails} = 1;
+ }
+ elsif ($origtext =~ /^M\xe9canismes/)
+ {
+ $self->{insideMechanicRow} = 1;
+ }
+ elsif ($origtext =~/^Th\xe8mes/)
+ {
+ $self->{insideCategoryRow} = 1;
+
+ }
+ }
+ if ($self->{insideTechnicalDetails})
+ {
+ if ($origtext =~ /^Date de sortie/)
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{curInfo}->{released} =~ s/Date de sortie : //g
+ }
+ elsif( $origtext =~ /Dur\xe9e : /)
+ {
+ $self->{curInfo}->{playingtime} = $origtext;
+ $self->{curInfo}->{playingtime} =~ s/\s*Dur\xe9e : //g;
+ }
+ elsif($origtext =~ /\xc0 partir de\s[0-9]*\sans/)
+ {
+ $self->{curInfo}->{suggestedage} = $origtext;
+ $self->{curInfo}->{suggestedage} =~ s/^\s*//g;
+ }
+ elsif ($origtext =~ /De [0-9]* \xe0 [0-9]* joueurs/)
+ {
+ $self->{curInfo}->{players} = $origtext;
+ $self->{curInfo}->{players} =~ s/^\s*De //g;
+ $self->{curInfo}->{players} =~ s/ joueurs//g;
+ }
+ }
+ if ($self->{insideDesigner})
+ {
+ # Append text (and trailing ,) to existing designer field
+ $self->{curInfo}->{designedby} .= $origtext." - ";
+ $self->{insideDesigner} = 0;
+ }
+ if ($self->{insideIllustrator})
+ {
+ # Append text (and trailing ,) to existing illustrator field
+ $self->{curInfo}->{illustratedby} .= $origtext." - ";
+ $self->{insideIllustrator} = 0;
+ }
+ if ($self->{insidePublisher})
+ {
+ $self->{curInfo}->{publishedby} = $origtext;
+ $self->{insidePublisher} = 0;
+ }
+ if ($self->{insideExpands})
+ {
+ $self->{curInfo}->{expansionfor} = $origtext;
+ $self->{insideExpands} = 0;
+ }
+ if ($self->{insideMechanic})
+ {
+ $self->{curInfo}->{mechanics} .= $self->capWord($origtext).',';
+ $self->{insideMechanic} = 0;
+ }
+ if ($self->{insideCategory})
+ {
+ $self->{curInfo}->{category} .= $self->capWord($origtext).',';
+ $self->{insideCategory} = 0;
+ }
+
+
+ if ($origtext =~ /^\s*Auteur(s)? : /)
+ {
+ $self->{insideDesignerRow} = 1;
+ }
+ if ($origtext =~ /^\s*Illustrateur(s)? : /)
+ {
+ $self->{insideIllustratorRow} = 1;
+ }
+ if ($origtext =~ /^Ce produit est une extension de :/)
+ {
+ $self->{nextIsExpands} = 1;
+ }
+ if ($self->{insideDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ }
+ }
+
+ sub comment
+ {
+ my ($self, $comment) = @_;
+
+ if ($self->{parsingList})
+ {
+
+ }
+ else
+ {
+ if ($comment =~ /\/div/)
+ {
+ if($self->{insideDescription})
+ {
+ $self->{insideDescription} = 0;
+ # remove spaces from start and end of description
+ $self->{curInfo}->{description} =~ s/^\s+//;
+ $self->{curInfo}->{description} =~ s/\s+$//;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ };
+
+ $self->{isBoardgame} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Url returned below is the for the search page, where $word is replaced by the search
+ return ('http://www.reservoir-jeux.com/recherche.php', ['search' => $word, 'secteurid' => '-1', 'dv' => '30']);
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ if ($url =~ /^\//)
+ {
+ return "http://www.reservoir-jeux.com".$url;
+ }
+ else
+ {
+ return "http://www.reservoir-jeux.com/".$url;
+ }
+ }
+
+ sub getName
+ {
+ return "Reservoir Jeux";
+ }
+
+ sub getAuthor
+ {
+ return 'Florent';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm
new file mode 100644
index 0000000..038198f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamegeek.pm
@@ -0,0 +1,278 @@
+package GCPlugins::GCboardgames::GCboardgamegeek;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCboardgames::GCboardgamesCommon;
+
+{
+ package GCPlugins::GCboardgames::GCPluginboardgamegeek;
+
+ use base qw(GCPlugins::GCboardgames::GCboardgamesPluginsBase);
+ use XML::Simple;
+ use HTML::Entities;
+ use Encode;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['boardgame'], KeyAttr => ['objectid']);
+ my $game;
+ foreach $game ( keys( %{ $xml -> {'boardgame'}} ) )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.boardgamegeek.com/xmlapi/boardgame/".$game;
+ # Better check how the name is returned, the bgg api can be a little funny here
+ if (ref($xml->{'boardgame'}->{$game}->{'name'}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $xml->{'boardgame'}->{$game}->{'name'}->{'content'};
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $xml->{'boardgame'}->{$game}->{'name'};
+ }
+
+ if (!ref($xml->{'boardgame'}->{$game}->{'yearpublished'}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $xml->{'boardgame'}->{$game}->{'yearpublished'};
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['name','boardgamedesigner','boardgameartist','boardgamepublisher',
+ 'boardgamecategory','boardgamemechanic','boardgameexpansion'],
+ KeyAttr => []);
+
+ $self->{curInfo}->{released} = $xml->{boardgame}->{yearpublished};
+ $self->{curInfo}->{released} =~ s/([^0-9])//g;
+ $self->{curInfo}->{players} = $xml->{boardgame}->{minplayers}."-".$xml->{boardgame}->{maxplayers};
+ $self->{curInfo}->{playingtime} = $xml->{boardgame}->{playingtime}." mins";
+ $self->{curInfo}->{suggestedage} = $xml->{boardgame}->{age};
+
+ my $primaryName = "";
+ for my $name (@{$xml->{boardgame}->{name}})
+ {
+ $primaryName = $name->{content}
+ if $name->{primary} eq "true";
+ }
+
+ if (($primaryName ne $self->{itemsList}[$self->{wantedIdx}]->{name})
+ && ($self->{itemsList}[$self->{wantedIdx}]->{name}))
+ {
+ # Name returned by boardgamegeek is different to the one the user selected
+ # this means they choose an translated name, so use the name they choose
+ # as the default, and put boardgamegeek's name in as the original (untranslated) name of the game
+ $self->{curInfo}->{name} = $self->{itemsList}[$self->{wantedIdx}]->{name};
+ $self->{curInfo}->{original} = $primaryName;
+ }
+ else
+ {
+ $self->{curInfo}->{name} = $primaryName;
+ }
+
+ # Have to decode the html type characters here
+ $self->{curInfo}->{description} = decode_entities($xml->{boardgame}->{description});
+ $self->{curInfo}->{description} =~ s/\<br\/>/\n/g;
+ $self->{curInfo}->{description} =~ s/<.*?>//g;
+
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{boxpic} = $xml->{boardgame}->{image};
+ }
+ else
+ {
+ $self->{curInfo}->{boxpic} = $xml->{boardgame}->{thumbnail};
+ }
+
+ for my $designer (@{$xml->{boardgame}->{boardgamedesigner}})
+ {
+ $self->{curInfo}->{designedby} .= $designer->{content}.', ';
+ }
+ $self->{curInfo}->{designedby} =~ s/, $//;
+
+ for my $artist (@{$xml->{boardgame}->{boardgameartist}})
+ {
+ $self->{curInfo}->{illustratedby} .= $artist->{content}.', ';
+ }
+ $self->{curInfo}->{illustratedby} =~ s/, $//;
+
+ for my $publisher (@{$xml->{boardgame}->{boardgamepublisher}})
+ {
+ $self->{curInfo}->{publishedby} .= $publisher->{content}.', ';
+ }
+ $self->{curInfo}->{publishedby} =~ s/, $//;
+
+ for my $category (@{$xml->{boardgame}->{boardgamecategory}})
+ {
+ push @{$self->{curInfo}->{category}}, [$category->{content}];
+ }
+
+ for my $mechanic (@{$xml->{boardgame}->{boardgamemechanic}})
+ {
+ push @{$self->{curInfo}->{mechanics}}, [$mechanic->{content}];
+ }
+
+ for my $expansion (@{$xml->{boardgame}->{boardgameexpansion}})
+ {
+ if ($expansion->{inbound})
+ {
+ if ($self->{curInfo}->{expansionfor})
+ {
+ $self->{curInfo}->{expansionfor} .= ", ";
+ }
+ $self->{curInfo}->{expansionfor} .= $expansion->{content};
+ }
+ else
+ {
+ push @{$self->{curInfo}->{expandedby}}, [$expansion->{content}];
+ }
+ }
+ $self->{curInfo}->{web} = "http://boardgamegeek.com/boardgame/".$xml->{boardgame}->{objectid};
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ released => 1,
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.boardgamegeek.com";
+ }
+ elsif (index($url,"xmlapi") < 0)
+ {
+ # Url isn't for the bgg api, so we need to find the game id
+ # and return a url corresponding to the api page for this game
+ $url =~ /\/([0-9]+)[\/]*/;
+ my $id = $1;
+ $url = "http://www.boardgamegeek.com/xmlapi/boardgame/".$id;
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ # Quick and dirty fixes because the bgg api struggles with some words. Should not be required anymore (7/6/2010)
+ # $word =~ s/the\+/\+/ig;
+ # $word =~ s/\+and+/\+/g;
+ # $word =~ s/\+of\+/\+/g;
+
+ return "http://www.boardgamegeek.com/xmlapi/search?search=$word";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return "Board Game Geek";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm
new file mode 100644
index 0000000..088f077
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCboardgamesCommon.pm
@@ -0,0 +1,58 @@
+package GCPlugins::GCboardgames::GCboardgamesCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCboardgames::GCboardgamesPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->SUPER::loadUrl($url);
+
+ return $self->{curInfo};
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm b/lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm
new file mode 100644
index 0000000..e30e189
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCboardgames/GCtrictrac.pm
@@ -0,0 +1,462 @@
+package GCPlugins::GCboardgames::GCtrictrac;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCboardgames::GCboardgamesCommon;
+
+{
+ package GCPlugins::GCboardgames::GCPlugintrictrac;
+
+ use base qw(GCPlugins::GCboardgames::GCboardgamesPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+
+ if ($self->{parsingList})
+ {
+ # Parse the search results here
+
+ # Check if we are currently parsing an item page, not a search results page (ie - exact match has taken us straight to the page)
+ # Do this by checking if there is a heading on the page
+ if (($tagname eq "font") && ($attr->{style} =~ /FONT-SIZE: 20px/))
+ {
+ # Stop parsing results, switch to item parsing
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+
+ # Quite easy to parse the search results page since all the information we need (url, title, year) is contained within the <a>
+ # tag for the image of each search result
+
+ # TODO - check how search results look when they do not have an image??
+
+ # Check if tag is an <a>, the url referenced is valid (not "#"), and the onmouseover text looks right
+ if (($tagname eq "a") && ($attr->{href} ne "#") && ($attr->{onmouseover} =~ /^(return overlib)/))
+ {
+
+ # Add to search results
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+
+ my $mouseoverText = $attr->{onmouseover};
+
+ # Parse some regular expressions to find the name and release date
+ if ($mouseoverText =~ /<b>(.+)<\/b>/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $1;
+ }
+ if ($mouseoverText =~ /<\/b> \((\d+)\)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $1;
+ }
+ }
+ }
+ else
+ {
+ # Parse the items page here. Basically we do this by seaching for tags which match certain criteria, then preparing to grab
+ # the text inside these tags
+
+ if (($tagname eq "font") && ($attr->{style} =~ /FONT-SIZE: 20px/))
+ {
+ $self->{insideName} = 1;
+ }
+ elsif (($tagname eq "font") && ($attr->{style} =~ /FONT-SIZE: 12px/))
+ {
+ if ($self->{nextIsPlayers})
+ {
+ $self->{insidePlayers} = 1;
+ $self->{nextIsPlayers} = 0;
+ }
+ if ($self->{nextIsAges})
+ {
+ $self->{insideAges} = 1;
+ $self->{nextIsAges} = 0;
+ }
+ if ($self->{nextIsPlayingTime})
+ {
+ $self->{insidePlayingTime} = 1;
+ $self->{nextIsPlayingTime} = 0;
+ }
+
+ }
+ elsif (($tagname eq "td") && ($attr->{height} eq "250") && ($attr->{width} eq "250"))
+ {
+ $self->{insideImage} = 1;
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($self->{insideImage})
+ {
+ $self->{curInfo}->{boxpic} = "http://trictrac.net".$attr->{src} if ! $self->{curInfo}->{boxpic};
+ $self->{insideImage} = 0;
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{nextIsYear})
+ {
+ $self->{insideYear} = 1;
+ $self->{nextIsYear} = 0;
+ }
+ if ($self->{insideDesignerRow})
+ {
+ $self->{insideDesigner} = 1;
+ }
+ if ($self->{insideIllustratorRow})
+ {
+ $self->{insideIllustrator} = 1;
+ }
+ if ($self->{nextIsPublishers})
+ {
+ $self->{insidePublishers} = 1;
+ $self->{nextIsPublishers} = 0;
+ }
+ if ($self->{insideMechanicRow})
+ {
+ $self->{insideMechanic} = 1;
+ }
+ if ($self->{insideCategoryRow})
+ {
+ $self->{insideCategory} = 1;
+ }
+
+ }
+ elsif ($tagname eq "b")
+ {
+ if ($self->{insideExpansionList})
+ {
+ $self->{insideExpansion} = 1;
+ }
+ }
+ elsif (($tagname eq "p") && ( $attr->{style} =~ /TEXT-ALIGN: justify/))
+ {
+ $self->{insideDescription} = 1;
+ }
+ if ($self->{insideDescription})
+ {
+ if ($tagname eq "br")
+ {
+ # neatens up the description a little by starting new line on br tags
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif ($tagname eq "li")
+ {
+ # basic formatting of lists
+ $self->{curInfo}->{description} .= " - ";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "tr")
+ {
+ if ($self->{insideDesignerRow})
+ {
+ # Use regex to strip final , off end of line
+ $self->{curInfo}->{designedby} =~ s/(, )$//;
+ $self->{insideDesignerRow} = 0;
+ }
+ if ($self->{insideIllustratorRow})
+ {
+ # Use regex to strip final , off end of line
+ $self->{curInfo}->{illustratedby} =~ s/(, )$//;
+ $self->{insideIllustratorRow} = 0;
+ }
+ if ($self->{insideMechanicRow})
+ {
+ $self->{insideMechanicRow} = 0;
+ }
+ if ($self->{insideCategoryRow})
+ {
+ $self->{insideCategoryRow} = 0;
+ }
+ }
+ elsif ($tagname eq "table")
+ {
+ if ($self->{insideExpansionList})
+ {
+ $self->{insideExpansionList} = 0;
+ }
+ }
+ elsif ($tagname eq "b")
+ {
+ if ($self->{insideExpands})
+ {
+ $self->{curInfo}->{expansionfor} =~ s/"//g;
+ $self->{insideExpands} = 0;
+ }
+ }
+ elsif (($tagname eq "td") && ($self->{insideDescription}))
+ {
+ $self->{insideDescription} = 0;
+ # remove spaces from start and end of description
+ $self->{curInfo}->{description} =~ s/^\s+//;
+ $self->{curInfo}->{description} =~ s/\s+$//;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2);
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/^\s{2,//;
+ #French accents substitution
+ $origtext =~ s/&agrave;/à/;
+ $origtext =~ s/&eacute;/é/;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+
+ }
+ else
+ {
+ # fetching information from page
+ if ($origtext =~ /^Nom VO/)
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{curInfo}->{original} =~ s/Nom VO : //;
+ }
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideYear})
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{curInfo}->{released} =~ s/([^0-9])//g;
+ $self->{insideYear} = 0;
+ }
+ elsif ($self->{insideDesigner})
+ {
+ # Append text (and trailing ,) to existing designer field
+ $self->{curInfo}->{designedby} .= $origtext.", ";
+ $self->{insideDesigner} = 0;
+ }
+ elsif ($self->{insideIllustrator})
+ {
+ # Append text (and trailing ,) to existing designer field
+ $self->{curInfo}->{illustratedby} .= $origtext.", ";
+ $self->{insideIllustrator} = 0;
+ }
+ elsif ($self->{insidePublishers})
+ {
+ $self->{curInfo}->{publishedby} = $origtext;
+ $self->{insidePublishers} = 0;
+ }
+ elsif ($self->{insidePlayers})
+ {
+ $self->{curInfo}->{players} = $origtext;
+ $self->{insidePlayers} = 0;
+ }
+ elsif ($self->{insideAges})
+ {
+ $self->{curInfo}->{suggestedage} = $origtext;
+ $self->{insideAges} = 0;
+ }
+ elsif ($self->{insidePlayingTime})
+ {
+ $self->{curInfo}->{playingtime} = $origtext;
+ $self->{insidePlayingTime} = 0;
+ }
+ elsif ($self->{insideExpands})
+ {
+ $self->{curInfo}->{expansionfor} .= $origtext;
+
+ }
+ elsif ($self->{insideExpansion})
+ {
+ $self->{curInfo}->{expandedby} .= $self->capWord($origtext).',';
+ $self->{insideExpansion} = 0;
+ }
+ elsif ($self->{insideDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ elsif ($self->{insideMechanic})
+ {
+ $self->{curInfo}->{mechanics} .= $self->capWord($origtext).',';
+ $self->{insideMechanic} = 0;
+ }
+ elsif ($self->{insideCategory})
+ {
+ $self->{curInfo}->{category} .= $self->capWord($origtext).',';
+ $self->{insideCategory} = 0;
+ }
+
+
+ # Pre-detection based on text (not tags) for various fields
+ # that have no specific id in tags
+ if ($origtext =~ /^Ann\xe9e/)
+ {
+ $self->{nextIsYear} = 1;
+ }
+ if ($origtext =~ /^Auteur/)
+ {
+ $self->{insideDesignerRow} = 1;
+ }
+ if ($origtext =~ /^Illustrateur/)
+ {
+ $self->{insideIllustratorRow} = 1;
+ }
+ if ($origtext =~ /^Editeur/)
+ {
+ $self->{nextIsPublishers} = 1;
+ }
+ if ($origtext =~ /^Joueurs/)
+ {
+ $self->{nextIsPlayers} = 1;
+ }
+ if ($origtext =~ /^Age/)
+ {
+ $self->{nextIsAges} = 1;
+ }
+ if ($origtext =~ /^Dur/)
+ {
+ $self->{nextIsPlayingTime} = 1;
+ }
+ if ($origtext =~ /^Ceci est une extension pour/)
+ {
+ $self->{insideExpands} = 1;
+ }
+ if ($origtext =~ /canisme\(s\)/)
+ {
+ $self->{insideMechanicRow} = 1;
+ }
+ if ($origtext =~ /Th.{1,8}me\(s\)/)
+ {
+ $self->{insideCategoryRow} = 1;
+ }
+ if ($origtext =~ /^Les extensions/)
+ {
+ $self->{insideExpansionList} = 1;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ released => 1,
+ };
+
+ $self->{isBoardgame} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Url returned below is the for the search page, where $word is replaced by the search
+ return "http://trictrac.net/index.php3?id=jeux&rub=ludotheque&inf=cat&choix=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ if ($url =~ /^\//)
+ {
+ return "http://trictrac.net".$url;
+ }
+ else
+ {
+ return "http://trictrac.net/".$url;
+ }
+ }
+
+ sub getName
+ {
+ return "Tric Trac";
+ }
+
+ sub getAuthor
+ {
+ return 'Florent';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm
new file mode 100644
index 0000000..34997a8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisFI.pm
@@ -0,0 +1,59 @@
+package GCPlugins::GCbooks::GCAdlibrisFI;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksAdlibrisCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAdlibrisFI;
+
+ use base qw(GCPlugins::GCbooks::GCbooksAdlibrisPluginsBase);
+ use URI::Escape;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{isLang} = 'fi';
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Adlibris (FI)";
+ }
+
+ sub getLang
+ {
+ return 'FI';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm
new file mode 100644
index 0000000..f17abdb
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAdlibrisSV.pm
@@ -0,0 +1,59 @@
+package GCPlugins::GCbooks::GCAdlibrisSV;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksAdlibrisCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAdlibrisSV;
+
+ use base qw(GCPlugins::GCbooks::GCbooksAdlibrisPluginsBase);
+ use URI::Escape;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{isLang} = 'se';
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Adlibris (SV)";
+ }
+
+ sub getLang
+ {
+ return 'SV';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm b/lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm
new file mode 100644
index 0000000..44f3da0
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAlapage.pm
@@ -0,0 +1,391 @@
+package GCPlugins::GCbooks::GCAlapage;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAlapage;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'div') && ($attr->{class} eq 'infos_produit'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif ($tagname eq 'div')
+ {
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isUrl}) && ($self->{isBook}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $attr->{title};
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_auteurs") >= 0) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'br') && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'tpfcommentaire') && ($self->{isDescription} eq 1))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_auteurs") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'thickbox tooltip') && ($self->{curInfo}->{cover} eq ''))
+ {
+ my $html = $self->loadPage( "http://www.alapage.com" . $attr->{href}, 0, 1);
+ my $found = index($html,"\"laplusgrande\"");
+ if ( $found >= 0 )
+ {
+ my $found2 = index($html,"&m=v");
+ $html = substr($html, $found +length('"laplusgrande"'),length($html)- $found -length('"laplusgrande"'));
+
+ my @array = split(/"/,$html);
+ #"
+ $self->{curInfo}->{cover} = "http://www.alapage.com" . $array[1];
+ if ( $found2 >= 0 )
+ {
+ $self->{curInfo}->{backpic} = $self->{curInfo}->{cover};
+ $self->{curInfo}->{backpic} =~ s|&m=r|&m=v|gi;
+ }
+ }
+ }
+ elsif ($tagname eq 'li')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_cdu") >= 0))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_coll_serie") >= 0))
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"mot_editeur") >= 0) && ( index($attr->{href},"mot_coll_serie") == -1))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} eq 'comment'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'blocWithMargin') && ($self->{isDescription}) && ($self->{curInfo}->{description} eq '') )
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} ne ''))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'edito FP_commentaire'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isAuthor})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ my @array = split(/,/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ $self->{itemsList}[$self->{itemIdx}]->{edition} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} =~ s/\s+$//;
+
+ if ($#array ne 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[$#array];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/\s+$//;
+ }
+
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{curInfo}->{language} = 'Français';
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Dimensions/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Date de parution/i);
+ $self->{isPage} = 1 if ($origtext =~ m/Nombre de pages/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ my @array = split(/,/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ $element =~ s/^\s+//;
+ $self->{curInfo}->{genre} .= $element;
+ $self->{curInfo}->{genre} .= ",";
+ }
+ $self->{isGenre} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isISBN} = 0;
+ $self->{isGenre} = 0;
+ $self->{isPublication} = 0;
+ $self->{isPage} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<p>||gi;
+ $html =~ s|</p>||gi;
+ }
+ else
+ {
+ $html =~ s|<font style=&quot;font-size:13px;&quot;>||gi;
+ $html =~ s|<font style="font-size:13px;">||gi;
+ $html =~ s|</font>||gi;
+ $html =~ s|<strong>||gi;
+ $html =~ s|</strong>|</strong><tpfanalyse>|gi;
+ $html =~ s|</h3>|</h3><tpfcommentaire>|gi;
+ $html =~ s|<p>||gi;
+ $html =~ s|</p>||gi;
+ }
+
+ return $html;
+
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.alapage.com/-/Recherche/?type=1&mot_isbn=" . $word;
+ }
+ else
+ {
+ return "http://www.alapage.com/-/Recherche/?type=1&mot_titre=" . $word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.alapage.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Alapage";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn','title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm
new file mode 100644
index 0000000..7d70ec4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazon.pm
@@ -0,0 +1,352 @@
+package GCPlugins::GCbooks::GCAmazon;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazon;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use XML::Simple;
+ use LWP::Simple qw($ua);
+ use Encode;
+ use HTML::Entities;
+ use GCUtils;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['Item','Author'], KeyAttr => []);
+ my $book;
+ foreach $book ( @{ $xml -> {'Items'} -> {'Item'} })
+ {
+ $self->{itemIdx}++;
+ my $url = $self->baseAWSUrl."&Operation=ItemLookup&ResponseGroup=Large,EditorialReview&ItemId=".$book->{ASIN};
+
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $book->{ItemAttributes}->{'Title'};
+ for my $author (@{$book->{ItemAttributes}->{'Author'}})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", "
+ if $self->{itemsList}[$self->{itemIdx}]->{authors};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $author;
+ }
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $book->{ItemAttributes}->{'PublicationDate'};
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $book->{ItemAttributes}->{'Binding'};
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $book->{ItemAttributes}->{'Edition'};
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page, ForceArray => ['Author','EditorialReview','Language'], KeyAttr => []);
+ $self->{curInfo}->{title} = $xml->{Items}->{Item}->{ItemAttributes}->{Title};
+ for my $author (@{$xml->{Items}->{Item}->{ItemAttributes}->{Author}})
+ {
+ push @{$self->{curInfo}->{authors}}, [$author];
+ }
+
+ my $htmlDescription;
+ if ($xml->{Items}->{Item}->{EditorialReviews}->{EditorialReview}[0]->{Content})
+ {
+ $htmlDescription = $xml->{Items}->{Item}->{EditorialReviews}->{EditorialReview}[0]->{Content};
+ }
+ else
+ {
+ # Unfortunately the api doesn't always return the product description, which is due to
+ # copyright concerns or something. In this case, grab the product html and parse it for
+ # the description.
+ my $response = $ua->get($xml->{Items}->{Item}->{DetailPageURL});
+ my $result;
+ eval {
+ $result = $response->decoded_content;
+ };
+
+ # Replace some bad characters. TODO - will probably need to extend this for de/jp plugins
+ $result =~ s|\x{92}|'|gi;
+ $result =~ s|&#146;|'|gi;
+ $result =~ s|&#149;|*|gi;
+ $result =~ s|&#156;|oe|gi;
+ $result =~ s|&#133;|...|gi;
+ $result =~ s|\x{85}|...|gi;
+ $result =~ s|\x{8C}|OE|gi;
+ $result =~ s|\x{9C}|oe|gi;
+ $result =~ s|&#252;|ü|g;
+ $result =~ s|&#223;|ß|g;
+ $result =~ s|&#246;|ö|g;
+ $result =~ s|&#220;|Ü|g;
+ $result =~ s|&#228;|ä|g;
+ $result =~ s/&#132;/&#187;/gm;
+ $result =~ s/&#147;/&#171;/gm;
+
+ # Chop out the product description
+ $result =~ /<div class="productDescriptionWrapper">(.*?)<(\/)*?div/s;
+ $htmlDescription = $1;
+
+ # Decode
+ decode_entities($htmlDescription);
+ $htmlDescription = decode('ISO-8859-1', $htmlDescription);
+ }
+
+ # Replace some html with line breaks, strip out the rest
+ $htmlDescription =~ s/<br>/\n/ig;
+ $htmlDescription =~ s/<p>/\n\n/ig;
+ $htmlDescription =~ s/<(.*?)>//gi;
+ $htmlDescription =~ s/^\s*//;
+ $htmlDescription =~ s/\s*$//;
+ $htmlDescription =~ s/ {1,}/ /g;
+ $self->{curInfo}->{description} = $htmlDescription;
+
+ $self->{curInfo}->{publisher} = $xml->{Items}->{Item}->{ItemAttributes}->{Publisher}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{Publisher}));
+ $self->{curInfo}->{publication} = $xml->{Items}->{Item}->{ItemAttributes}->{PublicationDate}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{PublicationDate}));
+ $self->{curInfo}->{language} = $xml->{Items}->{Item}->{ItemAttributes}->{Languages}->{Language}[0]->{Name}
+ if (ref($xml->{Items}->{Item}->{ItemAttributes}->{Languages}->{Language}));
+ $self->{curInfo}->{pages} = $xml->{Items}->{Item}->{ItemAttributes}->{NumberOfPages}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{NumberOfPages}));
+ $self->{curInfo}->{isbn} = $xml->{Items}->{Item}->{ItemAttributes}->{EAN}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{EAN}));
+ $self->{curInfo}->{format} = $xml->{Items}->{Item}->{ItemAttributes}->{Binding}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{Binding}));
+ $self->{curInfo}->{edition} = $xml->{Items}->{Item}->{ItemAttributes}->{Edition}
+ if (!ref($xml->{Items}->{Item}->{ItemAttributes}->{Edition}));
+ $self->{curInfo}->{web} = $xml->{Items}->{Item}->{DetailPageURL};
+
+ # Genre handling via Amazon's browsenodes. Stupidly complicated way of doing things, IMO
+ # Loop through all the nodes:
+ for my $node (@{$xml->{Items}->{Item}->{BrowseNodes}->{BrowseNode}})
+ {
+ my $genre = '';
+ my $ancestor = $node;
+
+ # Push the lowest node to the temporary genre list
+ my @genre_list = ($node->{Name});
+
+ # Start stepping down through the current node to find it's children
+ while ($ancestor->{Ancestors}->{BrowseNode})
+ {
+ $ancestor = $ancestor->{Ancestors}->{BrowseNode};
+ if (($ancestor->{Name} eq 'Specialty Stores') ||
+ ($ancestor->{Name} eq 'Refinements') ||
+ ($ancestor->{Name} eq 'Self Service') ||
+ ($ancestor->{Name} eq 'Specialty Boutique'))
+ {
+ # Some categories we definetly want to ignore, since they are full of rubbish tags
+ $genre = 'ignore';
+ last;
+ }
+ elsif ($ancestor->{Name} =~ m/A\-Z/)
+ {
+ # Clear out the current genres from the node, will be full of rubbish like "Authors A-K"
+ # Keep looping afterwards though, since there could be valid tags below the author
+ # specific ones
+ undef(@genre_list);
+ }
+ elsif ($ancestor->{Name} eq 'Subjects')
+ {
+ # Don't go deeper than a Subjects node
+ last;
+ }
+ else
+ {
+ # Add the current node to the temporary list, if it's not already included in either list
+ push @genre_list, $ancestor->{Name}
+ if ((!GCUtils::inArrayTest($ancestor->{Name}, @genre_list)) &&
+ (!GCUtils::inArrayTest($ancestor->{Name}, @{$self->{curInfo}->{genre}})));
+ }
+ }
+
+ if ($genre ne 'ignore')
+ {
+ # Add temporary list to item info
+ push @{$self->{curInfo}->{genre}}, [$_] foreach @genre_list;
+ }
+ }
+
+ # Let's sort the list for good measure
+ @{$self->{curInfo}->{genre}} = sort @{$self->{curInfo}->{genre}};
+
+
+ # Fetch either the big original pic, or just the small thumbnail pic
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = $xml->{Items}->{Item}->{LargeImage}->{URL};
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = $xml->{Items}->{Item}->{SmallImage}->{URL};
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 1,
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://".$self->baseWWWamazonUrl();
+ }
+ elsif ($url !~ m/sowacs.appspot.com/)
+ {
+ # Convert amazon url to aws url
+ $url =~ /\/dp\/(\w*)[\/|%3F]/;
+ my $asinid = $1;
+ $url = $self->baseAWSUrl."&Operation=ItemLookup&ResponseGroup=Large,EditorialReview&ItemId=".$asinid;
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $key =
+ ($self->{searchField} eq 'authors') ? 'Author' :
+ ($self->{searchField} eq 'title') ? 'Title' :
+ ($self->{searchField} eq 'isbn') ? 'Keywords' :
+ '';
+ $word =~ s/\D//g
+ if $key eq 'Keywords';
+ return $self->baseAWSUrl."&Operation=ItemSearch&$key=$word&SearchIndex=Books&ResponseGroup=Medium";
+ }
+
+ sub baseAWSUrl
+ {
+ my $self = shift;
+ return "http://sowacs.appspot.com/AWS/%5Bamazon\@gcstar.org%5D".$self->baseAmazonUrl()."/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=AKIAJJ5TJWI62A5OOTQQ&AssociateTag=AKIAJJ5TJWI62A5OOTQQ";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.com";
+ }
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.com";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return "Amazon (US)";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title', 'authors', 'isbn'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm
new file mode 100644
index 0000000..eb51a4c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonCA.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCbooks::GCAmazonCA;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonCA;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.ca";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.ca";
+ }
+
+ sub getName
+ {
+ return "Amazon (CA)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 0;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm
new file mode 100644
index 0000000..0c87502
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonDE.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCbooks::GCAmazonDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonDE;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.de";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.de";
+ }
+
+ sub getName
+ {
+ return "Amazon (DE)";
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm
new file mode 100644
index 0000000..d87af48
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonFR.pm
@@ -0,0 +1,57 @@
+package GCPlugins::GCbooks::GCAmazonFR;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonFR;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.fr";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.fr";
+ }
+
+ sub getName
+ {
+ return "Amazon (FR)";
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm b/lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm
new file mode 100644
index 0000000..e39a2de
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCAmazonUK.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCbooks::GCAmazonUK;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCAmazon;
+
+{
+ package GCPlugins::GCbooks::GCPluginAmazonUK;
+
+ use base qw(GCPlugins::GCbooks::GCPluginAmazon);
+
+ sub baseWWWamazonUrl
+ {
+ return "www.amazon.co.uk";
+ }
+
+ sub baseAmazonUrl
+ {
+ return "ecs.amazonaws.co.uk";
+ }
+
+ sub getName
+ {
+ return "Amazon (UK)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub isPreferred
+ {
+ return 0;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm b/lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm
new file mode 100644
index 0000000..36074aa
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBDGest.pm
@@ -0,0 +1,477 @@
+package GCPlugins::GCbooks::GCBDGest;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBDGest;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+ # tableau pour stocker l'identifiant propre à bdgest
+ my @tableau;
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ # parse une liste de résultat
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'tr'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isUrl}) && ($self->{isBook}) && (index($attr->{href},"serie-") >= 0))
+ {
+ $self->{itemIdx}++;
+ $self->{isFound} = 1 ;
+ $tableau[$self->{itemIdx}] = substr($attr->{href},index( $attr->{href},"#")+1);
+ #on retravaille l'url pour avoir toutes les pages de la série
+ my $urlRecherche = substr($attr->{href},0,index($attr->{href},"."))."__10000".substr($attr->{href},index($attr->{href},"."));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $urlRecherche;
+ $self->{isSerie} = 1 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} eq 'TitreAlbum')&& ($self->{isBook}) && ($attr->{title} ne ''))
+ {
+ $self->{isTitle} = 1 ;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $attr->{title};
+ }
+ elsif (($tagname eq 'td') && $self->{isTitle} eq 1)
+ {
+ $self->{isPublisher} = 1 ;
+ $self->{isTitle} = 0;
+ }
+ elsif (($tagname eq 'td') && $self->{isPublisher} eq 2)
+ {
+ $self->{isPublication} = 1 ;
+ $self->{isPublisher} = 0;
+ }
+ }
+ else # parse un item
+ {
+ if (($tagname eq 'a') && ($attr->{name} eq $tableau[$self->{wantedIdx}]))
+ {
+ $self->{isTitle} = 1 ;
+ $self->{isCover} = 1;
+ $self->{isBook} = 1 ;
+ }
+ elsif ($tagname eq 'html')
+ {
+ $self->{isCover} = 0 ;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isCover} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} ne $tableau[$self->{wantedIdx}]) && ($attr->{name} ne ''))
+ {
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#294A6B') && ($attr->{style} eq 'font-family:Trebuchet MS; FONT-SIZE: 11pt;') && ($self->{isTitle} eq 1))
+ {
+ $self->{isTitle} = 2 ;
+ }
+# elsif (($tagname eq 'a') && ($self->{isCover} eq 0) && (index($attr->{href},"Couvertures") >= 0))
+ elsif (($tagname eq 'a') && ($self->{isCover} eq 0))
+ {
+ my $urlimage = $attr->{href};
+ $urlimage =~ s/\'//g;
+ $urlimage =~ s/\)//g;
+ $urlimage = substr($urlimage,index($urlimage,"Couvertures/"));
+ $self->{curInfo}->{cover} = 'http://www.bedetheque.com/'.$urlimage;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook}) && (index($attr->{href},"auteur") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'td') && ($self->{isPublisher} eq 1))
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isEdition} eq 1)
+ {
+ $self->{isEdition} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isFormatPublication} eq 1)
+ {
+ $self->{isFormatPublication} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif (($tagname eq 'td') && $self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif (($tagname eq 'i') && $self->{isDescription} eq 1)
+ {
+ $self->{isDescription} = 2 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isSerie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ if ($self->{isPublisher} eq 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 2 ;
+ }
+ if ($self->{isPublication} eq 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Je reinitialise le champs s il est cense etre vide
+ $origtext =~ s/#TPFCHAMPSVIDE#//;
+ if ($self->{isTitle} eq 2)
+ {
+ # si le titre contient INT (cas intégrale et donc sans titre de la série) on concaténe la série au titre.
+ if($origtext =~ /INT/i)
+ {
+ # on enléve le préfixe INT ou int et le point
+ $origtext =~ s/INT//i;
+ $origtext =~ s/.//;
+ $self->{curInfo}->{title} = $self->{itemsList}[$self->{wantedIdx}]->{serie}." ".$origtext;
+ }
+ else
+ {
+ # si numéro avant titre on le transforme en tome et on concaténe avec le nom de la série.
+ if($origtext =~ /[0-9]./)
+ {
+ my $tome = substr($origtext,0,index($origtext,"."));
+ $tome =~ s/^\s+//;
+ my $titre = substr($origtext,index($origtext,".")+1);
+ $titre =~ s/^\s+//;
+ $self->{curInfo}->{title} = $self->{itemsList}[$self->{wantedIdx}]->{serie}." Tome ".$tome ." : ".$titre;
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ }
+ $self->{curInfo}->{web} = "http://www.bedetheque.com/".$self->{itemsList}[$self->{wantedIdx}]->{url};
+ $self->{curInfo}->{serie} = $self->{itemsList}[$self->{wantedIdx}]->{serie};
+ $self->{curInfo}->{language} = 'Français';
+ $self->{isTitle} = 0 ;
+ }
+ elsif (($self->{isAuthor}) && ($self->{nbAuthor} < 3))
+ {
+ # Enleve la virgule entre le nom et le prenom
+ $origtext =~ s/,//g;
+ if (($origtext ne '') && ($origtext ne '#TPF NOIR ET BLANC TPF#'))
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ }
+ $self->{isAuthor} = 0;
+ $self->{nbAuthor} = $self->{nbAuthor} + 1;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 3 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 3 ;
+ }
+ elsif ($self->{isEdition} eq 2)
+ {
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 3 ;
+ }
+ elsif ($self->{isFormatPublication} eq 2 )
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormatPublication} = 3 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $origtext =~ s/978\-//;
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 3 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 3 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ if($origtext ne '')
+ {
+ if($self->{curInfo}->{description} ne '')
+ {
+ $self->{curInfo}->{description} .= "\n\n";
+ }
+ $self->{curInfo}->{description} .= "Info sur cette edition : ".$origtext;
+ }
+ $self->{isDescription} = 3 ;
+ }
+ elsif ($self->{isBook} eq 1)
+ {
+ if (($origtext eq "Editeur :") && ($self->{isPublisher} ne 3))
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif (($origtext eq "Dépot légal :") && ($self->{isPublication} ne 3))
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif (($origtext eq "Collection :") && ($self->{isEdition} ne 3))
+ {
+ $self->{isEdition} = 1;
+ }
+ elsif (($origtext eq "Taille :") && ($self->{isFormatPublication} ne 3))
+ {
+ $self->{isFormatPublication} = 1;
+ }
+ elsif (($origtext eq "ISBN :") && ($self->{isISBN} ne 3))
+ {
+ $self->{isISBN} = 1;
+ }
+ elsif (($origtext eq "Planches :") && ($self->{isPage} ne 3))
+ {
+ $self->{isPage} = 1;
+ }
+ elsif (($origtext eq "Info édition : ") && ($self->{isDescription} ne 3))
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ #la classe est instancié une seule fois au démarrage de l'appli.
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ serie => 1,
+ title => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ };
+ $self->{idPage} = 0;
+ $self->{nbAuthor} = 0;
+ $self->{isFound} = 0;
+ $self->{isSerie} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormatPublication} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #RAZ des variables (entre 2 recherches la classe reste en mémoire)
+ $self->{idPage} = 0;
+ $self->{nbAuthor} = 0;
+ $self->{isFound} = 0;
+ $self->{isSerie} = 0;
+ $self->{isEdition} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormatPublication} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+# $html =~ s|<i>||gi;
+# $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ # Quand un champs n est pas renseigne il peut y avoir un souci
+ $html =~ s|<td><font color="#5C7994"></font></td>|<td><font color="#5C7994"></font>#TPFCHAMPSVIDE#</td>|gi;
+
+ $html =~ s|<font color="#D19159">||gi;
+ $html =~ s|</font>||gi;
+ # Ce n est pas un coloriste donc il ne faut pas le rajouter a la liste des auteurs
+ $html =~ s|&lt;N&amp;B&gt;|#TPF NOIR ET BLANC TPF#|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ # si isbn renseigné alors url de recherche différent
+ if((length($word) eq 13 || length($word) eq 10) && ($word =~ /[0-9]/))
+ {
+ # si contient pas de caractére - alors insertion de ceux ci pour recherche chez bdgest (ISBN sur 10 au lieu de 13)
+ if($word =~ /\-/)
+ {
+ $word =~ s/978\-//;
+ return "http://www.bedetheque.com/index.php?R=1&RechISBN=". $word;
+ }
+ else
+ {
+ # Ajouts des - et enléve le 978 en début si présent
+ $word =~ s/978//;
+
+ #re calcul de la clé de vérification
+ my $total = substr($word,0,1)*10;
+ $total = $total + (substr($word,1,1)*9);
+ $total = $total + (substr($word,2,1)*8);
+ $total = $total + (substr($word,3,1)*7);
+ $total = $total + (substr($word,4,1)*6);
+ $total = $total + (substr($word,5,1)*5);
+ $total = $total + (substr($word,6,1)*4);
+ $total = $total + (substr($word,7,1)*3);
+ $total = $total + (substr($word,8,1)*2);
+ $total = 11 - ($total%11);
+
+ if($total eq 10)
+ {
+ $total = 'X';
+ }
+
+ $word = substr($word,0,1)."-".substr($word,1,2)."%25-%25".substr($word,7,2)."-".$total;
+ return "http://www.bedetheque.com/index.php?R=1&RechISBN=". $word;
+ }
+ }
+ else
+ {
+ return "http://www.bedetheque.com/index.php?R=1&RechSerie=". $word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.bedetheque.com/" . $url;
+ }
+
+ sub getName
+ {
+ return "BDGest";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'Rataflo';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn','title'];
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm b/lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm
new file mode 100644
index 0000000..927be0b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBibliotekaNarodowa.pm
@@ -0,0 +1,374 @@
+package GCPlugins::GCbooks::GCbooksBibliotekaNarodowa;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+my $searchISBN = "";
+
+{
+ package GCPlugins::GCbooks::GCPluginBibliotekaNarodowa;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'frameset') #od razu mamy wynik
+ {
+ $self->{isBook} = 7;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'frame') && ($attr->{name} eq 'bib_frame') && $self->{isBook} == 7) #od razu mamy wynik
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://alpha.bn.org.pl".$attr->{src};
+ $self->{isUrl} = 0;
+ $self->{isBook} = 0;
+ }
+
+ if (($tagname eq 'tr') && ($attr->{class} eq 'browseEntry'))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'browseEntryData') && ($self->{isBook} == 1))
+ {
+ $self->{isAuthor} = 2;
+ }
+ if (($tagname eq 'a') && ($self->{isBook} == 1) && ($self->{isAuthor} > 0))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://alpha.bn.org.pl".$attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{url} =~ s|frameset|bibframe|;
+ $self->{isUrl} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'browseEntryYear') && ($self->{isBook} == 1))
+ {
+ $self->{isPublication} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgTIAUTR'))
+ {
+ $self->{isTitle} = 1;
+ $self->{isAuthor} = 1;
+ $self->{isTranslator} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgISBN'))
+ {
+ $self->{isISBN} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPUBPD'))
+ {
+ $self->{isPublisher} = 1;
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgSERIA'))
+ {
+ $self->{isSerie} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgEDITI'))
+ {
+ $self->{isEdition} = 1;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'tr') && ($self->{isBook} == 1))
+ {
+ $self->{isBook} = 0;
+ }
+ }
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ $origtext =~ s|^\s*||m;
+ $origtext =~ s|\s*$||m;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} == 1)
+ {
+ if ($self->{isTitle} == 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} > 0)
+ {
+ $origtext =~ s|\s*\/\s*(.*)\s*;|$1|;
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $1;
+ $self->{isAuthor} = 1;
+ }
+ if ($self->{isPublication} == 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ }
+
+ }
+ else
+ {
+ if (($self->{isTitle} == 1) && ($self->{isAuthor} == 1) && ($self->{isTranslator} == 1))
+ {
+ my ($ti, $au, $tr, $bubu);
+ $origtext =~ m|.*(\.){1}$|;
+ $bubu = $1;
+ if ($bubu eq '.')
+ {
+ $origtext =~ s|(.*)\.$|$1|;
+ }
+ $origtext =~ m/([^\/]+)(\/\s+[^;]*)?(;\s*.*(tł|przeł|przekł)\..*)?$/;
+# $origtext =~ m|([^/]+)(/\s[^;]+)?(;.*)?$|;
+ $ti = $1;
+ $au = $2;
+ $tr = $3;
+ $ti =~ s|([^:]*):?.*$|$1|;
+ $ti =~ s|\s*$||;
+ $self->{curInfo}->{title} = $ti;
+ $self->{isTitle} = 0;
+ $au =~ s|^(.*)il\..*$|$1|;
+ $au =~ s/(\/|tekst)//g;
+ $au =~ s| i |,|g;
+ $au =~ s|, |,|g;
+ $au =~ s|^\s*||;
+ $au =~ s|\s*$||;
+ $self->{curInfo}->{authors} = $au;
+ $self->{isAuthor} = 0;
+ $tr =~ s|[\[\]]||g;
+ $tr =~ s/;\s*.*(tł|przeł|przekł)\. (\[.*\] )?(.*)\.?$/$3/;
+ $tr =~ s|(z \w+\. )?(.*)|$2|;
+ $self->{curInfo}->{translator} = $tr;
+ $self->{isTranslator} = 0;
+ }
+ if (($self->{isPublisher} == 1) && ($self->{isPublication} == 1))
+ {
+ my ($pu, $pd);
+ $origtext =~ m|(.*)\s:\s(.*),\s(.*)|;
+ $pu = $2;
+ $pd = $3;
+ $pu =~ s|([^"]*")?([^"]*)"?|$2|;
+ $pu =~ s|[\[\]]||g;
+ $self->{curInfo}->{publisher} = $pu;
+ $self->{isPublisher} = 0;
+ $pd =~ s|[^\d]||g;
+ $self->{curInfo}->{publication} = $pd;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isISBN} eq '1')
+ {
+ my ($pom1, $pom2);
+ if ($self->{searchField} eq 'isbn')
+ {
+ $pom1 = $self->{searchISBN};
+ $pom2 = $origtext;
+ $pom2 =~ s|[^\dX]||g;
+ $pom1 =~ s|-||g;
+ $pom2 =~ s|-||g;
+ if ($pom1 eq $pom2)
+ {
+ $self->{curInfo}->{isbn} = $self->{searchISBN};
+ }
+ else
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ }
+ }
+ else
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ }
+ $self->{isISBN} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isEdition} eq '1')
+ {
+ $origtext =~ s|[\[\]]||g;
+ $origtext =~ s|(.*)\.{1}$|$1|;
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ if ($self->{isSerie} eq '1')
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|gms;
+ $html =~ s|<td class="browseEntryData">\s*<a(.*)/a>\s*(.*)\s*|<td class="browseEntryData">$2<a$1/a>|gm;
+ }
+ else
+ {
+ $html =~ s|</?strong>||gi;
+ $html =~ s|</?br>||gi;
+ $html =~ s|</?i>||gi;
+
+ $html =~ s|<td.*>ISBN</td>\s*<.*>\s*(\w*)</td>|<div id="wrgISBN">$1</div>|m;
+ $html =~ s|<td.*>Seria</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgSERIA">$1</div>|m;
+ $html =~ s|<div id="wrgSERIA">(.*)( / [^<]*)</div>|<div id="wrgSERIA">$1</div>|;
+ $html =~ s|<td.*>Opis fiz</td>\s*<.*>\s*(\d*)\D.*</td>|<div id="wrgPAGES">$1</div>|m;
+ $html =~ s|<td.*>TytuÅ</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgTIAUTR">$1</div>|m;
+ $html =~ s|<td.*>Adres wyd</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgPUBPD">$1</div>|m;
+ $html =~ s|<td.*>Wydanie</td>\s*<.*>\s*(.*)\s*</td>|<div id="wrgEDITI">$1</div>|m;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $bubu;
+ if ($self->{searchField} eq 'isbn')
+ {
+ $bubu = "i";
+ $self->{searchISBN} = $word;
+ }
+ else
+ {
+ $bubu = "t";
+ $self->{searchISBN} = "";
+ }
+ return "http://alpha.bn.org.pl/search*pol/".$bubu."?SEARCH=".$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://alpha.bn.org.pl'
+ }
+
+ sub getName
+ {
+ return "Biblioteka Narodowa";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm b/lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm
new file mode 100644
index 0000000..d32c1f4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBokkilden.pm
@@ -0,0 +1,295 @@
+package GCPlugins::GCbooks::GCBokkilden;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBokkilden;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'h1') && ($attr->{class} eq 'normal'))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ }
+ elsif ($self->{isBook})
+ {
+ if ($tagname eq 'a')
+ {
+ if (($attr->{href} =~ /produkt\.do/)
+ && (!$self->{itemsList}[$self->{itemIdx}]->{title}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1;
+ }
+ elsif ($attr->{href} =~ /sok\.do\?enkeltsok/)
+ {
+ $self->{isAuthor} = 1;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'table')
+ {
+ $self->{isBook} = 1
+ if ($attr->{class} eq 'bokfaktatabell');
+ }
+ elsif ($tagname eq 'div')
+ {
+ $self->{isCover} = 1 if ($attr->{class} eq 'img-ilus')
+ && ($attr->{style} eq 'width:120px;');
+ $self->{is} = 'description' if $attr->{id} eq 'omtale-hidden';
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($self->{isCover})
+ {
+ $self->{curInfo}->{cover} = 'http://www.bokkilden.no/SamboWeb/'
+ . $attr->{src};
+ $self->{isCover} = 0;
+ }
+ }
+ elsif ($tagname eq 'h1')
+ {
+ $self->{h1Style} = $attr->{style};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{title})
+ {
+ $self->{parsingEnded} = 1 if $origtext !~ /S..?k p..?/;
+ }
+
+ elsif ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ','
+ if $self->{itemsList}[$self->{itemIdx}]->{authors};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ $self->{isAuthor} = 0;
+ }
+ elsif ($self->{isBook})
+ {
+ if ($origtext =~ / \| /)
+ {
+ $origtext =~ /(\d{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $1;
+ $self->{isBook} = 0;
+ }
+ }
+ }
+ else
+ {
+ if ($self->{is})
+ {
+ $origtext =~ s/^\s*//;
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ if ($self->{is} eq 'genre')
+ {
+ $self->{curInfo}->{genre} =~ s/;\s*/,/g;
+ }
+ elsif ($self->{is} eq 'pages')
+ {
+ $self->{curInfo}->{pages} =~ s/[^0-9]//g;
+ }
+ $self->{is} = '';
+ }
+ elsif ($self->{inside}->{title})
+ {
+ $self->{tmpTitle} = $origtext;
+ }
+ elsif ($self->{inside}->{h1})
+ {
+ if (!$self->{curInfo}->{title})
+ {
+ if ($self->{h1Style})
+ {
+ $self->{tmpTitle} =~ /\s*(.*?) av (.*?) »/gim;
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{authors} = $2;
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ }
+ }
+ elsif ($self->{inside}->{author})
+ {
+ $self->{curInfo}->{authors} .= ','
+ if $self->{curInfo}->{authors};
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ if ($self->{inside}->{translator})
+ {
+ $self->{curInfo}->{translator} .= ', '
+ if $self->{curInfo}->{translator};
+ $self->{curInfo}->{translator} .= $origtext;
+ }
+ elsif (($self->{isBook}) && $self->{inside}->{b})
+ {
+ $self->{is} =
+ ($origtext eq 'Utgitt: ') ? 'publication'
+ : ($origtext eq 'Forlag: ') ? 'publisher'
+ : ($origtext eq 'Innb.: ') ? 'format'
+ : ($origtext =~ /Spr..?k:/) ? 'language'
+ : ($origtext eq 'Sider: ') ? 'pages'
+ : ($origtext eq 'ISBN: ') ? 'isbn'
+ : ($origtext eq 'Utgave: ') ? 'edition'
+ : ($origtext eq 'Genre:') ? 'genre'
+ : '';
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 0,
+ };
+
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{isBook} = 0;
+ if ($self->{parsingList})
+ {
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ }
+ else
+ {
+ $self->{is} = '';
+ $self->{isCover} = 0;
+ $html =~ s|<a href="emneliste\.do\?emnekode=[.0-9]*">(.*?)</a>|$1|gim;
+ $html =~ s|<a href="sok\.do\?enkeltsok=[^"]*">([^<]*)</a>|<author>$1</author>|gim;
+ #"
+ $html =~ s|<a href="sok\.do\?.*?rolle1=Oversetter">(.*?)</a>|<translator>$1</translator>|gim;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.bokkilden.no/SamboWeb/sok.do?rom=MP&enkeltsok=$word&innsnevre=ja";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return "http://www.bokkilden.no/SamboWeb/$url"
+ if $url !~ m|http://www.bokkilden.no/|;
+ return $url;
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return 'UTF-8';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getName
+ {
+ return 'Bokkilden';
+ }
+
+ sub getLang
+ {
+ return 'NO';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBol.pm b/lib/gcstar/GCPlugins/GCbooks/GCBol.pm
new file mode 100644
index 0000000..6e882b1
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBol.pm
@@ -0,0 +1,485 @@
+package GCPlugins::GCbooks::GCBol;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBol;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'td')
+ {
+ if($self->{bookStep} == 0)
+ {
+ $self->{bookStep} = 1 ;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if($self->{bookStep} == 1)
+ {
+ $self->{bookStep} = 2;
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if($self->{bookStep}==2)
+ {
+ $self->{url} = "http://www.bol.it" . $attr->{href};
+ $self->{bookStep} = 3 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif($self->{bookStep}==3)
+ {
+ $self->{bookStep} = 4 ;
+ $self->{isAuthor} = 1 ;
+ }
+ }
+ elsif ($tagname eq 'br')
+ {
+ if($self->{bookStep}==4)
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{url};
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{title};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{author};
+
+ $self->{isFormat} = 1 ;
+ #$self->{bookStep} = 0 ;
+ }
+ }
+ elsif (
+ (($tagname ne 'h3') || ( ($tagname eq 'h3') && ($self->{bookStep} != 2) )) &&
+ (($tagname ne 'p') || ( ($tagname eq 'p') && ($self->{bookStep} != 3) )) &&
+ (($tagname ne 'span') || ( ($tagname eq 'span') && ($self->{bookStep} != 4) ))
+ )
+ {
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isCover} = 0;
+ $self->{isGenre} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isISBN} = 0;
+
+ $self->{isBook} = 0;
+ $self->{bookStep} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'img') && ($attr->{class} eq 'cover'))
+ {
+ $self->{curInfo}->{cover} = "http://www.bol.it" . $attr->{src};
+ $self->{bookStep} = 1;
+ }
+ elsif (($tagname eq 'h1') && ($self->{bookStep} == 1))
+ {
+ $self->{curInfo}->{title} = "http://www.bol.it" . $attr->{src};
+ $self->{isTitle} = 1;
+ $self->{bookStep} = 2;
+ }
+ elsif ($self->{bookStep} == 2)
+ {
+ if (($tagname eq 'a') && ($self->{areAuthors} == 0))
+ {
+ $self->{isAuthor} = 1;
+ $self->{areAuthors} = 1;
+ }
+ if ($self->{areAuthors} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isAuthor} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 3;
+ $self->{areAuthors} = 0;
+ }
+ }
+ }
+ elsif ($self->{bookStep} == 4)
+ {
+ if (($tagname eq 'a') && ($self->{areGenres} == 0))
+ {
+ $self->{isGenre} = 1;
+ $self->{areGenres} = 1;
+ }
+ if ($self->{areGenres} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isGenre} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 5;
+ $self->{areGenres} = 0;
+ }
+ }
+ }
+ elsif ($self->{bookStep} == 6)
+ {
+ if (($tagname eq 'a') && ($self->{areTranslators} == 0))
+ {
+ $self->{isTranslator} = 1;
+ $self->{areTranslators} = 1;
+ }
+ if ($self->{areTranslators} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isTranslator} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 6;
+ $self->{areTranslators} = 0;
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{author} = $origtext;
+ $self->{isAuthor} = 0;
+ }
+ elsif ($self->{isFormat})
+ {
+ my @array = split(/\|/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $array[0];
+ $self->{itemsList}[$self->{itemIdx}]->{format} =~ s/^\s+//;
+ $self->{isFormat} = 0;
+ $self->{isPublisher} = 1;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 1;
+ }
+ elsif ($self->{isPublication})
+ {
+ my @array = split(/\|/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[1];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/^\s+//;
+ $self->{isPublication} = 0;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+
+ if ($origtext eq 'I contenuti')
+ {
+ $self->{isDescription} = 1;
+ }
+ elsif ($origtext eq 'Formato:')
+ {
+ $self->{isFormat} = 1;
+ }
+ elsif (substr($origtext,0,7) eq 'Pagine:')
+ {
+ $self->{isPage} = 1;
+ }
+ elsif ($origtext eq 'Lingua:')
+ {
+ $self->{isLanguage} = 1;
+ }
+ elsif ($origtext eq 'Editore:')
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif ($origtext eq 'Anno di pubblicazione')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($origtext eq 'Codice EAN:')
+ {
+ $self->{isISBN} = 1;
+ }
+ elsif (($origtext eq 'Traduttore:') || ($origtext eq 'Traduttori:'))
+ {
+ $self->{bookStep} = 6;
+ }
+ elsif ($origtext eq 'Generi:')
+ {
+ $self->{bookStep} = 4;
+ }
+ elsif ($origtext ne '')
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ $self->{curInfo}->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ elsif ($self->{isPage})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ elsif ($self->{isLanguage})
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ elsif ($self->{isISBN})
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ elsif ($self->{isGenre})
+ {
+ if ($self->{curInfo}->{genre} eq '')
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{genre} .= ", " . $origtext;
+ }
+ $self->{isGenre} = 0 ;
+ }
+ elsif ($self->{isTranslator})
+ {
+ if ($self->{curInfo}->{translator} eq '')
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{translator} .= ", " . $origtext;
+ }
+ $self->{isTranslator} = 0 ;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isCover} = 0;
+ $self->{isGenre} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isISBN} = 0;
+ $self->{areAuthors} = 0;
+ $self->{areGenres} = 0;
+ $self->{areTranslators} = 0;
+
+ $self->{isBook} = 0;
+ $self->{bookStep} = 0;
+ $self->{title} = 0;
+ $self->{author} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<br><i>|<i>|gi;
+ #$html =~ s/[\n\r\t]//g;
+ }
+ else
+ {
+ my $found = index($html,'<a name="commenti">');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ #$html =~ s|<br>|\n|gi;
+ #$html =~ s|<br />|\n|gi;
+ #$html =~ s|<b>||gi;
+ #$html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return ('http://www.bol.it/libri/ricerca', ["crc" => "100", "crcselect" => "100", "g" => "$word", "tpr" => "10"] );
+ }
+ else
+ {
+ $word =~ s/\+/ /g;
+ return ('http://www.bol.it/libri/ricerca', ["crc" => "100", "crcselect" => "100", "g" => "$word", "tpr" => "10"] );
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.bol.it';
+ }
+
+ sub getName
+ {
+ return "Bol";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF, UnclePetros';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm b/lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm
new file mode 100644
index 0000000..ad46177
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCBuscape.pm
@@ -0,0 +1,479 @@
+package GCPlugins::GCbooks::GCBuscape;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginBuscape;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'a') && ($attr->{class} eq 'xu'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif (( $attr->{class} eq 'xj') && ($self->{itemIdx} eq '-1') && ($self->{searchField} eq 'isbn'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ elsif (($tagname eq 'meta') && ($self->{itemIdx} eq '-1') && ($self->{searchField} eq 'isbn'))
+ {
+ my $html = $self->loadPage($self->{loadedUrl}, 0, 1);
+ my $found = index($html,"URL=");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('URL='),length($html)- $found -length('URL='));
+ $html = substr($html, 0, index($html,"\""));
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $html;
+ }
+ }
+ }
+ else
+ {
+ if (( $attr->{class} eq 'xj') && ($self->{isAnalyse} eq 0))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{onerror} ne '') && ($self->{curInfo}->{title} eq ''))
+ {
+ # Attention il y a 2 formats differents pour ce site
+ if ($attr->{alt} ne '')
+ {
+ $self->{curInfo}->{title} = $attr->{alt};
+ }
+ if ($attr->{title} ne '')
+ {
+ my @array = split(/\(/,reverse($attr->{title}));
+ my @array2;
+ if ($array[1] ne '')
+ {
+ $self->{curInfo}->{isbn} = reverse($array[0]);
+ $self->{curInfo}->{isbn} =~ s/\)//;
+ # J enleve le premier champs qui est sense etre le code ISBN
+ shift(@array);
+ my $element1;
+ my $element2;
+ foreach $element1 (@array)
+ {
+ if ($element2 eq '')
+ {
+ $element2 = $element1;
+ }
+ else
+ {
+ $element2 .= "(" .$element1;
+ }
+ }
+ @array2 = split(/-/,$element2);
+ }
+ else
+ {
+ @array2 = split(/-/,$array[0]);
+ }
+
+ if ($array2[1] ne '')
+ {
+ # J enleve le dernier champs qui est l auteur
+ shift(@array2);
+ }
+ my $element;
+ foreach $element (@array2)
+ {
+ if ($self->{curInfo}->{title} eq '')
+ {
+ $self->{curInfo}->{title} = $element;
+ }
+ else
+ {
+ $self->{curInfo}->{title} .= "-" .$element;
+ }
+ }
+ $self->{curInfo}->{title} = reverse($self->{curInfo}->{title});
+ }
+
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ my @array = split(/\(/,reverse($origtext));
+ my @array2;
+ if ($array[1] ne '')
+ {
+ # J enleve le premier champs qui est sense etre le code ISBN
+ shift(@array);
+ my $element1;
+ my $element2;
+ foreach $element1 (@array)
+ {
+ if ($element2 eq '')
+ {
+ $element2 = $element1;
+ }
+ else
+ {
+ $element2 .= "(" .$element1;
+ }
+ }
+ @array2 = split(/-/,$element2);
+ }
+ else
+ {
+ @array2 = split(/-/,$array[0]);
+ }
+
+ if ($array2[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = reverse($array2[0]);
+ my $found = index($self->{itemsList}[$self->{itemIdx}]->{authors}," Cod:");
+ if ( $found >= 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = substr($self->{itemsList}[$self->{itemIdx}]->{authors}, 0, $found);
+ }
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{authors} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{authors} =~ s/\s+$//g;
+ shift(@array2);
+ }
+ my $element;
+ foreach $element (@array2)
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{title} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $element;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} .= "-" .$element;
+ }
+ }
+ $self->{itemsList}[$self->{itemIdx}]->{title} = reverse($self->{itemsList}[$self->{itemIdx}]->{title});
+ $self->{isTitle} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isAnalyse} eq 1)
+ {
+ if ($origtext =~ m/Autor/i)
+ {
+ $self->{isAuthor} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/Editora/i)
+ {
+ $self->{isPublisher} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/Ano de edi/i)
+ {
+ $self->{isPublication} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/N.* de p.*ginas/i)
+ {
+ $self->{isPage} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/ISBN/i)
+ {
+ $self->{isISBN} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($origtext =~ m/Encaderna/i)
+ {
+ $self->{isFormat} = 1 ;
+ $self->{isAnalyse} = 2 ;
+ }
+ else
+ {
+ $self->{isAnalyse} = 0 ;
+ }
+
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ if ($origtext =~ m/N.*o Cadastrado/i)
+ {
+ }
+ else
+ {
+ my @nom_prenom = split(/,/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isISBN} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isPublisher} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isPublication} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isPage} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{curInfo}->{format} = $origtext if ( !($origtext =~ m/N.*o Cadastrado/i) && !($origtext =~ m/n.*o dispon.*vel/i));
+ $self->{isFormat} = 0 ;
+ $self->{isAnalyse} = 0 ;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 0,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isPage} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<br><i>|<i>|gi;
+ }
+ else
+ {
+ my $found = index($html,'<a name="commenti">');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+
+ $html =~ s|<!--||gi;
+ $html =~ s|<strong>||gi;
+ $html =~ s|</strong>|<tpfnesertarien>TPFNESERTARIEN</tpfnesertarien><tpfnesertarien></tpfnesertarien>|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://compare.buscape.com.br/proc_unico?id=3482&Carac1000000000=" .$word;
+ }
+ else
+ {
+ return "http://compare.buscape.com.br/proc_unico?id=3482&Carac1000000000=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ # Attention il y a 2 formats differents pour ce site
+ if ($url =~ m/counter_livro.asp/i)
+ {
+ my $html = $self->loadPage($url, 0, 1);
+ my $found = index($html,"URL=");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('URL='),length($html)- $found -length('URL='));
+ $html = substr($html, 0, index($html,"\""));
+ }
+ return $html;
+ }
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Buscape";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ISBN', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm b/lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm
new file mode 100644
index 0000000..5d8f7e4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCCasadelibro.pm
@@ -0,0 +1,420 @@
+package GCPlugins::GCbooks::GCbooksCasadelibro;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginCasadelibro;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'p') && ($attr->{class} eq 'tit'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook}) && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.casadelibro.com" . $attr->{href};
+ $self->{isUrl} = 0 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'p') && ($attr->{class} eq 'liz'))
+ {
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'autor') && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} =~ m/autor/i) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'p') && ($attr->{class} eq 'puestoEditorial') && ($self->{isBook}))
+ {
+ $self->{isEditionPublication} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isLanguage} eq 1)
+ {
+ $self->{isLanguage} = 2 ;
+ }
+ elsif ($self->{isEdition} eq 1)
+ {
+ $self->{isEdition} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'tit_ficha'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif ($tagname eq 'tpfnoauthortpf')
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'autor2'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'edicion_ficha'))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif ($tagname eq 'tpfstarttagtpf')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'txt_resumen'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'imgFicha') && ($attr->{src} ne '/l/grande.gif'))
+ {
+ $self->{curInfo}->{cover} = "http://www.casadelibro.com" . $attr->{src} ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @nom_prenom = split(/,/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isEditionPublication})
+ {
+ $_= $origtext;
+ if (/(.*),\s([0-9][0-9][0-9][0-9]$)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $1;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ }
+
+ $_= $origtext;
+ if (/(.*)\s([0-9][0-9][0-9][0-9]$)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $2;
+ }
+
+ $self->{isEditionPublication} = 0 ;
+ }
+ }
+ else
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isLanguage} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{language} = $array[1];
+ $self->{curInfo}->{language} =~ s/^\s//;
+ $self->{curInfo}->{language} =~ s/\s+$//;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isEdition} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{edition} = $array[1];
+ $self->{curInfo}->{edition} =~ s/^\s//;
+ $self->{curInfo}->{edition} =~ s/\s+$//;
+ $self->{isEdition} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{format} = $array[1];
+ $self->{curInfo}->{format} =~ s/^\s//;
+ $self->{curInfo}->{format} =~ s/\s+$//;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{serie} = $array[1];
+ $self->{curInfo}->{serie} =~ s/^\s//;
+ $self->{curInfo}->{serie} =~ s/\s+$//;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{curInfo}->{publication} =~ s/^\s//;
+ $self->{curInfo}->{publication} =~ s/\s+$//;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isLanguage} = 1 if ($origtext =~ m/Lengua/i);
+ $self->{isEdition} = 1 if ($origtext =~ m/^n(.*)\sEdici/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Encuadernaci/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Colecci/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/^A(.*)o de Edici/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @nom_prenom = split(/,/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[0];
+ }
+ $self->{curInfo}->{authors} .= ",";
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ my @array = split(/:/,$origtext);
+ $self->{curInfo}->{isbn} = $array[1];
+ $self->{curInfo}->{isbn} =~ s/^\s//;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{curInfo}->{description} =~ s/\t//g;
+ $self->{curInfo}->{description} =~ s/^\s//;
+ $self->{curInfo}->{description} =~ s/\s+$//;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditionPublication} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isEdition} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPublication} = 0;
+ $self->{isISBN} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|'| |gi;
+ }
+ else
+ {
+ my $found = index($html,"<div class=\"azul3\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|"tit_ficha"><strong>|"tit_ficha">|gi;
+ $html =~ s|de </span>|<TPFNOAUTHORTPF>|gi;
+ $html =~ s|<strong>|<TPFSTARTTAGTPF>|gi;
+ $html =~ s|</strong>|<TPFSTOPTAGTPF>|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+
+ return "http://www.casadellibro.com/busquedas/resultados2?titbus=&autorbus=&isbnbus=" . $word. "&editbus=&idibus=0&encbus=0&sl1=-1";
+# return "http://www.casadellibro.com/busquedas/quickResults/0,,1-i-" . $word. ",00.html?tBusq=t&tValueForSearch=" .$word. "&cFo=true&rOd=&NotQueryAgain=false";
+ }
+ else
+ {
+ my $word2 = $word;
+ $word2 =~ s|\+|%20|gi;
+ return "http://www.casadellibro.com/busquedas/quickResults2/0,," . $word2. ",00.html?Buscar=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.casadellibro.com/';
+ }
+
+ sub getName
+ {
+ return "Casadelibro";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm b/lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm
new file mode 100644
index 0000000..242871c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCChapitre.pm
@@ -0,0 +1,430 @@
+package GCPlugins::GCbooks::GCChapitre;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginChapitre;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'a') && ( $attr->{id} =~ m/ctl00_PHCenter_SearchResult1_rpResult_ctl.._searchResultTitle_hlProduct/))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.chapitre.com" . $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif ($tagname eq 'tpfauthortpf')
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($tagname eq 'strong')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isAuthor} eq 2)
+ {
+ if ($tagname ne 'a')
+ {
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'clear'))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isLanguage} eq 1)
+ {
+ $self->{isLanguage} = 2 ;
+ }
+ elsif ($self->{isCollection} eq 1)
+ {
+ $self->{isCollection} = 2 ;
+ }
+ elsif ($self->{isGenre} eq 1)
+ {
+ $self->{isGenre} = 2 ;
+ }
+ }
+ elsif (($tagname eq 'a') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductTitle1_linkTitleProduct'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductTitle1_pnlAuthor'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'h2') && ( $self->{isAuthor} eq 1))
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif (($tagname eq 'div') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductTitle1_pnlTranslator'))
+ {
+ $self->{isTranslator} = 1 ;
+ }
+ elsif (($tagname eq 'tpftraducteurtpf') && ( $self->{isTranslator} eq 1))
+ {
+ $self->{isTranslator} = 2 ;
+ }
+ elsif (($tagname eq 'img') && ( $attr->{id} eq 'ctl00_PHCenter_ProductFile1_ProductPicture1_imgProduct') && ( index($attr->{src},"http://images.chapitre.com/indispo") eq -1 ))
+ {
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'presentation'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'tpfdescriptiontpf') && ($self->{isDescription} eq 1))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif ($tagname eq 'th')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( $attr->{href} =~ m|/CHAPITRE/fr/search/Default.aspx\?collection=|i))
+ {
+ $self->{isCollection} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ( $attr->{href} =~ m|/CHAPITRE/fr/search/Default.aspx\?themeId=|i))
+ {
+ $self->{isGenre} = 2 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editeur :/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Collection :/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Date :/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ my @array = split(/\n/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ my @array = split(/\n/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[0];
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ my @array = split(/\n/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{serie} = $array[0];
+ $self->{isSerie} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ if ( $origtext ne '')
+ {
+ my @array = split(/;/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ elsif ($self->{isTranslator} eq 2)
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isPublication} = 1 if ($origtext =~ m/parution/i);
+ $self->{isISBN} = 1 if ($origtext =~ m/EAN13/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editeur/i);
+ $self->{isLanguage} = 1 if ($origtext =~ m/Langue/i);
+ $self->{isCollection} = 1 if ($origtext =~ m/Collection/i);
+ $self->{isGenre} = 1 if ($origtext =~ m/Genre/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isLanguage} eq 2)
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isCollection} eq 2)
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isCollection} = 0 ;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ $origtext =~ s|/|,|gi;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{isGenre} = 0 ;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ serie => 1,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPublication} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isISBN} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isCollection} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isGenre} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|</a>,|</a>,<tpfauthortpf>|gi;
+ }
+ else
+ {
+
+ $html =~ s|</strong>|</strong><tpftraducteurtpf>|gi;
+ $html =~ s|</h3>|</h3><tpfdescriptiontpf>|gi;
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s/\+/ /g;
+ return ('http://www.chapitre.com/CHAPITRE/fr/search/Default.aspx?search=true', ["quicksearch" => "$word"] );
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Chapitre.com";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ISBN', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm b/lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm
new file mode 100644
index 0000000..927e099
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCDoubanbook.pm
@@ -0,0 +1,238 @@
+package GCPlugins::GCbooks::GCDoubanbook;
+
+###################################################
+#
+# Copyright 2005-2010 Bai Wensimi
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginDoubanbook;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if (($page =~ /^bad isbn/) & ($page =~ /^The/));
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page =~ /feed>$/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ foreach my $ItemBook ( @{$xml->{'entry'}}){
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $ItemBook->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $ItemBook->{'title'};
+ foreach my $tmp_author (@{$ItemBook->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'authors'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=',';}
+ $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=$tmp_author->{'name'};
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $xml->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $xml->{'title'};
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=$tmp_author->{'name'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'authors'}.=',';
+ }
+ }
+ }
+ else
+ {
+ $xml =$xs->XMLin($page,
+ ForceArray => [ 'author' ],
+ KeyAttr => {'db:tag'=>'name','link'=>'rel'});
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{curInfo}->{authors}.=$tmp_author->{'name'};
+ $self->{curInfo}->{authors}.=',';
+ }
+ $self->{curInfo}->{title}=$xml->{'title'};
+ $self->{curInfo}->{description}=$xml->{'summary'};
+ $self->{curInfo}->{web}=$xml->{'link'}->{'alternate'}->{'href'};
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH: {
+ $db_attr eq 'publisher' and $self->{curInfo}->{publisher}=$check->{'content'} ,last;
+ $db_attr eq 'pubdate' and $self->{curInfo}->{publication}=$check->{'content'} ,last;
+ $db_attr eq 'pages' and $self->{curInfo}->{pages}=$check->{'content'} ,last;
+ $db_attr eq 'isbn13' and $self->{curInfo}->{isbn}=$check->{'content'} ,last;
+ $db_attr eq 'binding' and $self->{curInfo}->{format}=$check->{'content'} ,last;
+ $db_attr eq 'translator' and { ($self->{curInfo}->{translator} ne '' ) and $self->{curInfo}->{translator}.=',' }, $self->{curInfo}->{translator}.=$check->{'content'} ,last;
+ $db_attr eq 'author-intro' and $self->{curInfo}->{description}.="\n\n".$check->{'content'},last;
+ ;
+ }
+ }
+
+ my $tmp_image=$xml->{'link'}->{'image'}->{'href'};
+ $tmp_image =~ s/spic/lpic/;
+ $self->{curInfo}->{cover}=$tmp_image;
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ };
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://api.douban.com/book/subject/isbn/" .$word;
+ }
+ else
+ {
+ return "http://api.douban.com/book/subjects?q=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "豆瓣";
+ }
+
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ };
+ }
+
+ sub getAuthor
+ {
+ return 'BW';
+ }
+
+ sub getLang
+ {
+ return 'ZH';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "UTF-8";
+ }
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'ZH';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCFnac.pm b/lib/gcstar/GCPlugins/GCbooks/GCFnac.pm
new file mode 100644
index 0000000..9c0e804
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCFnac.pm
@@ -0,0 +1,462 @@
+package GCPlugins::GCbooks::GCFnac;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginFnac;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ return if $self->{isFound};
+ if (($tagname eq 'h3') && ($attr->{class} eq 'hStyle1'))
+ {
+ $self->{isFound} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ return;
+ }
+ elsif ($tagname eq 'td')
+ {
+ if (($attr->{width} eq '254') && (!exists $attr->{bgcolor}))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isColonne} = 0 ;
+ }
+ else
+ {
+ $self->{isColonne} ++ ;
+ $self->{isTitle} = 2 ;
+ }
+ }
+ elsif (($attr->{class} eq 'subTitre') && (!exists $attr->{color}) && ($self->{isTitle} eq '0'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'tpfpublicationtpf') && ($self->{isBook}))
+ {
+ $self->{isPublication} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook}))
+ {
+ if ($attr->{href} =~ m|/advanced/book.do\?category=book|i)
+ {
+ $self->{isBook} = 0 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif ($self->{isUrl})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif ($self->{isColonne} eq 2)
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($self->{isColonne} eq 4)
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'tr')
+ {
+ $self->{isAuthor} = 0 ;
+ $self->{isISBN} = 0 ;
+ $self->{isPublisher} = 0 ;
+ $self->{isFormat} = 0 ;
+ $self->{isSerie} = 0 ;
+ $self->{isPublication} = 0 ;
+ $self->{isPage} = 0 ;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($self->{isTranslator} eq 1)
+ {
+ $self->{isTranslator} = 2 ;
+ }
+ elsif (($tagname eq 'h3') && ($attr->{class} eq 'hStyle1'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'strong') && (($self->{isTitle}) || $attr->{class} eq 'titre dispeblock'))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'th') && ($attr->{scope} eq 'row'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'expandimg') && ($self->{bigPics}))
+ {
+ $self->{curInfo}->{cover} = $attr->{href} ;
+ }
+ elsif (($attr->{class} eq 'activeimg') && ((!$self->{bigPics}) || ($self->{curInfo}->{cover} eq '')))
+ {
+ $self->{isCover} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isCover}))
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ $self->{isCover} = 0 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} =~ /^lireLaSuite/))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ $self->{isDescription} = 0 if $tagname eq 'div';
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if (($self->{itemsList}[$self->{itemIdx}]->{title} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} .= ' - ';
+ $self->{itemsList}[$self->{itemIdx}]->{title} .= $origtext;
+ }
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if (($self->{itemsList}[$self->{itemIdx}]->{authors} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '2')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isAuthor} = 1 if ($origtext =~ m/Auteur/i);
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editeur/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Format/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Collection/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Date de parution/i);
+ $self->{isPage} = 1 if ($origtext =~ m/pages/i);
+ $self->{isTranslator} = 1 if ($origtext =~ m/Traduction/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ # Enleve les virgules
+ $origtext =~ s/,//;
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ }
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ }
+ elsif (($self->{isPage} eq 2))
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ }
+ elsif ($self->{isTranslator})
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isFound} = 0;
+ $self->{isColonne} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|</a><br>|</a><tpfpublicationtpf>|gmi;
+ }
+ else
+ {
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<strong>Mot de l'");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found +length('<strong>Mot de l\''),length($html)- $found -length('<strong>Mot de l\''));
+ my $found2 = index($html2,"<h4 ");
+ my $html3 = $html2;
+ if ( $found2 >= 0 )
+ {
+ $html3 = substr($html2, $found2 +length('<h4 '),length($html2)- $found2 -length('<h4 '));
+ $html2 = substr($html2, 0, $found2);
+ }
+
+ $found2 = index($html2,"</strong>");
+ if ( $found2 >= 0 )
+ {
+ $html2 = substr($html2, $found2 +length('</strong>'),length($html2)- $found2 -length('</strong>'));
+ }
+
+ $html2 =~ s|<li>|\n* |gi;
+ $html2 =~ s|<br>|\n|gi;
+ $html2 =~ s|<br />|\n|gi;
+ $html2 =~ s|<b>||gi;
+ $html2 =~ s|</b>||gi;
+ $html2 =~ s|<i>||gi;
+ $html2 =~ s|</i>||gi;
+ $html2 =~ s|<p>|\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|</h4>||gi;
+ $html2 =~ s|\x{92}|'|g;
+ $html2 =~ s|&#146;|'|gi;
+ $html2 =~ s|&#149;|*|gi;
+ $html2 =~ s|&#133;|...|gi;
+ $html2 =~ s|\x{85}|...|gi;
+ $html2 =~ s|\x{8C}|OE|gi;
+ $html2 =~ s|\x{9C}|oe|gi;
+
+ }
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www3.fnac.com/search/quick.do?filter=-3&text=". $word ."&category=book";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.fnac.com/';
+ }
+
+ sub getName
+ {
+ return "Fnac (FR)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+# return "UTF-8";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm b/lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm
new file mode 100644
index 0000000..eb119a7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCFnacPT.pm
@@ -0,0 +1,390 @@
+package GCPlugins::GCbooks::GCFnacPT;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginFnacPT;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'a') && ($attr->{class} eq 'txtpretoarial11'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.fnac.pt" . $attr->{href};
+ }
+ elsif (($tagname eq 'strong') && ($self->{isBook}))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'span') && ($attr->{class} eq 'txtpretoarial11'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'txt_arial14'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'strong') && ($self->{isTitle}))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'txt_arial10') && ( index($attr->{href},"param=autor") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'tabfundo_branco'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m/Images\/catalogo\/livros/i))
+ {
+ $self->{curInfo}->{cover} = "http://www.fnac.pt" . $attr->{src};
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'txtpretoarial11') && ($attr->{colspan} eq '2'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'object')
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'param')
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'embed')
+ {
+ $self->{isDescription} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/&/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ if ($origtext ne '')
+ {
+ my @array = split(/&/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s+//;
+ $nom_prenom[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s+$//;
+ $nom_prenom[1] =~ s/\s+$//;
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ if ($nom_prenom[1] eq '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] eq '')
+ {
+ $self->{curInfo}->{authors} = $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+ }
+
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/Editora/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Encaderna/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Colec/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Ano/i);
+ $self->{isPage} = 1 if ($origtext =~ m/pages/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif (($self->{isPage} eq 2))
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 0,
+ };
+
+ $self->{isFound} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isSerie} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ my $found = index($html,'"listagem de resultados"');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('"listagem de resultados"'),length($html)- $found -length('"listagem de resultados"'));
+ }
+
+ $found = index($html,'"tabela de estrutura do cart');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|</h4>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|<center>||gi;
+ $html =~ s|</center>||gi;
+ $html =~ s|</embed>||gi;
+ $html =~ s|</object>||gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.fnac.pt/pt/Search/Search.aspx?categoryN=&cIndex=&catalog=livros&str=". $word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.fnac.pt/';
+ }
+
+ sub getName
+ {
+ return "Fnac (PT)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "UTF-8";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm b/lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm
new file mode 100644
index 0000000..2b7256c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCISBNdb.pm
@@ -0,0 +1,370 @@
+package GCPlugins::GCbooks::GCISBNdb;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginISBNdb;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'div') && ($attr->{class} eq 'bookInfo') && ($self->{searchField} ne 'isbn'))
+ {
+ $self->{isBook} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/book/") >= 0) && ($self->{isBook}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://isbndb.com" . $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/person/") >= 0) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/publisher/") >= 0) && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{onclick},"isbndbTrackBuy") >= 0) && ($self->{itemIdx} eq '-1'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl} ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'inactive'))
+ {
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if ($tagname eq 'title')
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/person/") >= 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/d/publisher/") >= 0))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ( index($attr->{href},"/c/Library_Shelves/Dewey") >= 0))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'iframe') && ($self->{curInfo}->{cover} eq ''))
+ {
+ my $html = $self->loadPage( $attr->{src}, 0, 1 );
+ my $found = index($html,"<img src=\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<img src="'),length($html)- $found -length('<img src="'));
+
+ my @array = split(/"/,$html);
+ $self->{curInfo}->{cover} = $array[0];
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isFormat} = 1 if ($origtext =~ m/Book Details:/i);
+ $self->{isDescription} = 1 if ($origtext =~ m/Notes:/i);
+ $self->{isDescription} = 1 if ($origtext =~ m/Summary:/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ my @array = split(/\n/,$origtext);
+ my @array2;
+ my @array3;
+ my $element;
+ my $element2;
+ foreach $element (@array)
+ {
+ @array2 = split(/:/,$element);
+ # Enleve les blancs en debut de chaine
+ $array2[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array2[1] =~ s/\s+$//g;
+ if ($array2[0] =~ m/Language/i)
+ {
+ $self->{curInfo}->{language} = $array2[1];
+ }
+ elsif ($array2[0] =~ m/Physical Description/i)
+ {
+ @array3 = split(/;/,$array2[1]);
+ foreach $element2 (@array3)
+ {
+ # Enleve les blancs en debut de chaine
+ $element2 =~ s/^\s+//;
+ $_= $element2;
+ if (/(^[0-9]+)(\s[p])(.*)/)
+ {
+ $self->{curInfo}->{pages} = $1;
+ }
+ elsif (/(.*)(\s)([0-9]+)(\s[p])(.*)/)
+ {
+ $self->{curInfo}->{pages} = $3;
+ }
+ }
+ }
+ elsif ($array2[0] =~ m/Edition Info/i)
+ {
+ @array3 = split(/;/,$array2[1]);
+ $self->{curInfo}->{format} = $array3[0];
+ $_= $array3[1];
+ if (/(.*)([0-9][0-9][0-9][0-9])(.*)/)
+ {
+ $self->{curInfo}->{publication} = $array3[1];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{publication} =~ s/^\s+//;
+ }
+ }
+ }
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $origtext =~ s/\n\n/\n/g;
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ my @array = split(/--/,$origtext);
+
+ $self->{curInfo}->{genre} = $array[1];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{genre} =~ s/^\s+//;
+ $self->{isGenre} = 0 ;
+ }
+ elsif (($origtext =~ m/ISBN:/i) && ($self->{curInfo}->{isbn} eq ''))
+ {
+ my @array = split(/:/,$origtext);
+
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[1] =~ s/\s+$//g;
+ my @array2 = split(/ /,$array[1]);
+
+ $self->{curInfo}->{isbn} = $array2[0];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{isbn} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{isbn} =~ s/\s+$//g;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isDescription} = 0;
+ $self->{isGenre} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://isbndb.com/search-all.html?kw=" .$word;
+ }
+ else
+ {
+ return "http://isbndb.com/search-title.html?kw=" .$word ."&isn=";
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "ISBNdb";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm b/lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm
new file mode 100644
index 0000000..3b553e9
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCInternetBokHandeln.pm
@@ -0,0 +1,464 @@
+package GCPlugins::GCbooks::GCbooksInternetBokHandeln;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginInternetBokHandeln;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'span') && ($attr->{class} eq 'title1'))
+ {
+ $self->{isFound} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ elsif (($tagname eq 'td') && ($attr->{rowspan} eq '4') && ($self->{isBook} eq '0') && ($self->{isFound} eq 0))
+ {
+ # En fait la sequence est un peu tordue. Je cherche le deuxieme passage dans la sequence
+ # rowspan/a
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isBook} eq '1') && ($self->{isUrl}))
+ {
+ $self->{isBook} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBook} eq '2') && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.internetbokhandeln.se" . $attr->{href};
+ $self->{isUrl} = 0 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'author') && ($self->{isFound} eq 0))
+ {
+ $self->{isAuthor} = 1 ;
+ $self->{isBook} = 0 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'shaded') && ($self->{isFound} eq 0))
+ {
+ $self->{isEditor_Publication_Format_Lang} = 1 ;
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if ($self->{isAuthor} eq 1)
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif ($self->{isPublisher} eq 1)
+ {
+ $self->{isPublisher} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isEdition} eq 1)
+ {
+ $self->{isEdition} = 2 ;
+ }
+ elsif ($self->{isPage} eq 1)
+ {
+ $self->{isPage} = 2 ;
+ }
+ elsif ($self->{isLanguage} eq 1)
+ {
+ $self->{isLanguage} = 2 ;
+ }
+ elsif ($self->{isPublication} eq 1)
+ {
+ $self->{isPublication} = 2 ;
+ }
+ elsif ($self->{isSerie} eq 1)
+ {
+ $self->{isSerie} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'title1'))
+ {
+ $self->{isTitle} = 1 ;
+ # On initialise la variable ( sinon d une fiche sur l autre est n est pas reinitialisee )
+ $self->{isDescription} = 0;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'font5'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'p') && ($self->{curInfo}->{isbn} ne '') && ($self->{curInfo}->{description} eq '') && ($self->{isDescription} ne 2))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'largebook'))
+ {
+ # Pour etre sur s il n y a pas de commentaire de ne pas prendre n importe quoi
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'pricecolumn'))
+ {
+ $self->{isCover} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isCover} eq 1))
+ {
+ # le but est de determiner s il y a une couverture ou non, et s il y en a une, on recuperera
+ # la version grand format qui est bien plus tard
+ if ($attr->{onclick} eq 'return showBig();')
+ {
+ $self->{isCover} = 2 ;
+ }
+ else
+ {
+ if ($attr->{src} eq '/i/dummy.gif')
+ {
+ # Il n y a pas d image
+ $self->{isCover} = 3 ;
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ $self->{isCover} = 3 ;
+ }
+ }
+ }
+ elsif (($tagname eq 'img') && ($attr->{onclick} eq 'return hideBig();') && ($self->{isCover} eq 2))
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ $self->{isCover} = 3 ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/;/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s$//;
+ $nom_prenom[1] =~ s/\s$//;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[0];
+ }
+ }
+ else
+ {
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[0];
+ }
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isEditor_Publication_Format_Lang})
+ {
+ my @Editor_Publication_Format_Lang = split(/\|/,$origtext);
+
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $Editor_Publication_Format_Lang[1];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/\s$+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $Editor_Publication_Format_Lang[2];
+ $self->{itemsList}[$self->{itemIdx}]->{format} =~ s/^\s+//;
+ $self->{itemsList}[$self->{itemIdx}]->{format} =~ s/\s$+//;
+
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isAuthor} = 1 if ($origtext =~ m/F.*rfattare/i);
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isPublisher} = 1 if ($origtext =~ m/F.*rlag/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Band/i);
+ $self->{isEdition} = 1 if ($origtext =~ m/Upplagenr/i);
+ $self->{isPage} = 1 if ($origtext =~ m/Sidor/i);
+ $self->{isLanguage} = 1 if ($origtext =~ m/Spr.*k/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Utgivning/i);
+ $self->{isSerie} = 1 if ($origtext =~ m/Serie/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ my @array = split(/;/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s//;
+ $nom_prenom[1] =~ s/^\s//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s$//;
+ $nom_prenom[1] =~ s/\s$//;
+ if ($nom_prenom[1] ne '')
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= $nom_prenom[0];
+ }
+ $self->{curInfo}->{authors} .= ",";
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ # Il y a 2 ISBN sur le site, seul le premier m interesse
+ if ($self->{curInfo}->{isbn} eq '')
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ }
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher} eq 2)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ my @array = split(/\n/,$origtext);
+
+ $self->{curInfo}->{format} = $array[0];
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isEdition} eq 2)
+ {
+ # There is some trouble on the site with this field : it is not accurrate. For example for ISBN 9113014528
+ # this field is set to 7000. So for instance this field isn't taken.
+# $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0 ;
+ }
+ elsif ($self->{isPage} eq 2)
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isLanguage} eq 2)
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isPublication} eq 2)
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{curInfo}->{publication} =~ s|([0-9]*) ([A-Za-z]*) ([0-9]*)|$1.'/'.$self->{monthNumber}->{$2}.'/'.$3|e;
+ $self->{curInfo}->{publication} =~ s|([A-Za-z]*) ([0-9]*)|$self->{monthNumber}->{$1}.'/'.$2|e;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isSerie} eq 2)
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 1)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 2 ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{monthNumber} = {
+ Januari => '01',
+ Februari => '02',
+ Mars => '03',
+ April => '04',
+ Maj => '05',
+ Juni => '06',
+ Juli => '07',
+ Augusti => '08',
+ September => '09',
+ Oktober => '10',
+ November => '11',
+ December => '12'
+ };
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.internetbokhandeln.se/results.html?new_search=1&all_search=" . $word. "&search_media=all";
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.internetbokhandeln.se/';
+ }
+
+ sub getName
+ {
+ return "InternetBokHandeln";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'SV';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm b/lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm
new file mode 100644
index 0000000..713646c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCInternetBookShop.pm
@@ -0,0 +1,376 @@
+package GCPlugins::GCbooks::GCInternetBookShop;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginInternetBookShop;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'td')
+ {
+ if($self->{bookStep} == 0)
+ {
+ $self->{bookStep} = 1 ;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if($self->{bookStep} == 1)
+ {
+ $self->{bookStep} = 2;
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if($self->{bookStep}==2)
+ {
+ $self->{url} = $attr->{href} ;
+ $self->{bookStep} = 3 ;
+ $self->{isTitle} = 1 ;
+ }
+ }
+ elsif (($tagname eq 'br') && ($self->{bookStep}==3))
+ {
+ $self->{bookStep} = 4 ;
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'i') && ($self->{bookStep}==4))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{url};
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{title};
+
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '' )
+ {
+ my @fields = split /,/, $self->{authorAndYear};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $fields[0];
+ }
+ $self->{isPublisher} = 1;
+ }
+ elsif ($tagname ne 'b')
+ {
+ $self->{bookStep} = 0;
+ $self->{url} = '';
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPage} = 0;
+ $self->{isSerie} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isDescription} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'input') && ( $attr->{name} eq 'isbn') && ($self->{curInfo}->{isbn} eq ''))
+ {
+ $self->{curInfo}->{isbn} = $attr->{value} ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m/$self->{curInfo}->{isbn}/i) && ($attr->{src} =~ m/cop/i))
+ {
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ elsif ($self->{bookStep} == 1)
+ {
+ if (($tagname eq 'a') && ($self->{areAuthors} == 0))
+ {
+ $self->{isAuthor} = 1;
+ $self->{areAuthors} = 1;
+ }
+ if ($self->{areAuthors} == 1)
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{isAuthor} = 1;
+ }
+ else
+ {
+ $self->{bookStep} = 2;
+ $self->{areAuthors} = 0;
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{authorAndYear} = $origtext;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($origtext eq 'Titolo')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($origtext eq 'Autore')
+ {
+ $self->{bookStep} = 1;
+ }
+ elsif ($origtext eq 'Dati')
+ {
+ $self->{isPage} = 1;
+ }
+ elsif ($origtext eq 'Editore')
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif ($origtext eq 'Traduttore')
+ {
+ $self->{isTranslator} = 1;
+ }
+ elsif ($origtext eq '(collana')
+ {
+ $self->{isSerie} = 1;
+ }
+ elsif ($origtext eq 'Descrizione')
+ {
+ $self->{isDescription} = 1;
+ }
+ else
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{curInfo}->{authors} eq '')
+ {
+ $self->{curInfo}->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{authors} .= ", " . $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPage})
+ {
+ my @array = split(/,/,$origtext);
+
+ $self->{curInfo}->{publication} = $array[0];
+ $self->{curInfo}->{pages} = $array[1];
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{pages} =~ s/^\s+//;
+ $self->{curInfo}->{pages} =~ s/p.//;
+ if ($array[3] ne '')
+ {
+ $self->{curInfo}->{format} = $array[2] . "," .$array[3];
+ }
+ else
+ {
+ $self->{curInfo}->{format} = $array[2];
+ }
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{format} =~ s/^\s+//;
+
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isTranslator})
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPage} = 0;
+ $self->{isSerie} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isDescription} = 0;
+ $self->{areAuthors} = 0;
+
+ $self->{bookStep} = 0;
+ $self->{url} = '';
+ $self->{authorAndYear} = '';
+ $self->{title} = '';
+
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<br><i>|<i>|gi;
+ }
+ else
+ {
+ my $found = index($html,'<a name="commenti">');
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|</h4>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|<center>||gi;
+ $html =~ s|</center>||gi;
+ $html =~ s|</embed>||gi;
+ $html =~ s|</object>||gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.internetbookshop.it/ser/serpge.asp?type=keyword&x=".$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.internetbookshop.it/';
+ }
+
+ sub getName
+ {
+ return "InternetBookShop";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm b/lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm
new file mode 100644
index 0000000..ff4d6c4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCLeLivre.pm
@@ -0,0 +1,334 @@
+package GCPlugins::GCbooks::GCLeLivre;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginLeLivre;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'font') && ( $attr->{size} eq '-1') && ( $attr->{face} eq 'Courier New, Courier, mono') && ( $attr->{color} eq '#990000'))
+ {
+ $self->{itemIdx}++;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'input') && ( $attr->{name} eq 'add'))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.le-livre.com/index.php?fich=fiche_info.php3&ref=" . $attr->{value};
+ }
+ elsif (($tagname eq 'font') && ( $attr->{size} eq '-1') && ( $attr->{face} eq 'Courier New, Courier, mono') && ( $attr->{color} eq '#0000CC'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ( $attr->{size} eq '-1') && ( $attr->{face} eq 'Times New Roman, Times, serif'))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ }
+ else
+ {
+ if ($self->{isTitle} eq 3)
+ {
+ $self->{isTitle} = 0 ;
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{isISBN} = 3 ;
+ }
+ elsif ($self->{isFormat} eq 1)
+ {
+ $self->{isFormat} = 2 ;
+ }
+ elsif ($self->{isFormat} eq 2)
+ {
+ $self->{isFormat} = 3 ;
+ }
+ elsif (($tagname eq 'font') && ( $attr->{color} eq '#990000') && ($self->{curInfo}->{title} eq ''))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ( $attr->{size} eq '2') && ( $attr->{face} eq 'Arial, Helvetica, sans-serif') && ($self->{isTitle} eq 1))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'img') && ( index($attr->{src},"/photos/") >= 0) && ($self->{curInfo}->{cover} eq ''))
+ {
+ $self->{curInfo}->{cover} = $attr->{src};
+ }
+ elsif (($tagname eq 'font') && ( $attr->{color} eq '#000099'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($tagname eq 'tpftraducteurtpf')
+ {
+ $self->{isTranslator} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $origtext =~ s|\.\.|\.|gi;
+ my @array = split(/\./,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[1];
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $array[2];
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq 2)
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 3 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $origtext =~ s|/ ||g;
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isTranslator})
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Descriptif/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isFormat} eq 3)
+ {
+ $origtext =~ s|\.\.|\.|gi;
+ my @array = split(/\./,$origtext);
+ $self->{curInfo}->{publisher} = $array[0];
+
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[1] =~ s/\s+$//g;
+ $_= $array[1];
+ if (/(.*)([0-9][0-9][0-9][0-9])(.*)/)
+ {
+ $self->{curInfo}->{publication} = $array[1];
+ }
+
+ # Enleve les blancs en debut de chaine
+ $array[2] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[2] =~ s/\s+$//g;
+ $self->{curInfo}->{format} = $array[2];
+
+ my $element;
+ foreach $element (@array)
+ {
+ $element =~ s/^\s+//;
+ $_= $element;
+ if (/(^[0-9]+)(\s[p])(.*)/)
+ {
+ $self->{curInfo}->{pages} = $1;
+ }
+ elsif (/(^[Oo][u][v][r][a][g][e])(\s[e][n]\s)(.*)/)
+ {
+ $self->{curInfo}->{language} = $3;
+ }
+ }
+
+ $self->{isFormat} = 0 ;
+
+ }
+ elsif ($self->{isISBN} eq 3)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 1,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+
+ $html =~ s|: </font>|<tpfpourfaireunebalisetpf>|gi;
+ $html =~ s|Traduction de |<tpftraducteurtpf>|gi;
+
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.le-livre.com/index.php?page=1&Categ=0&mot=". $word;
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Le-Livre";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ISBN', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm b/lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm
new file mode 100644
index 0000000..1b219aa
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCLiberOnWeb.pm
@@ -0,0 +1,418 @@
+package GCPlugins::GCbooks::GCLiberOnWeb;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginLiberOnWeb;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ use Encode;
+ use HTML::Entities;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'font') && ($attr->{color} eq '#E7E4D8') && ($attr->{face} eq 'Arial'))
+ {
+ $self->{itemIdx}++;
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#D90000') && ($attr->{size} eq '3') && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 0 ;
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#FFFFFF') && ($attr->{size} eq '2') && ($attr->{face} eq 'Arial') && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|libro.asp|i) && ($self->{isBook}) && ($self->{isUrl}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.liberonweb.com/asp/" . $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#D90000') && ($attr->{size} eq '5') && ($self->{searchField} eq 'isbn'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ }
+ else
+ {
+ if (($tagname eq 'font') && ($attr->{color} eq '#E7E4D8') && ($attr->{size} eq '4'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#D90000') && ($attr->{size} eq '5'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{face} eq 'Arial') && ($attr->{size} eq '2'))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{face} eq 'Verdana, Arial, Helvetica') && ($attr->{size} eq '2') && ($attr->{color} eq ''))
+ {
+ $self->{isFormat} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{color} eq '#6F6948') && ($attr->{size} eq '4'))
+ {
+ $self->{isAnalyse} = 0 ;
+ $self->{isDescription} = 1 ;
+ }
+ elsif ($tagname eq 'tpfserie')
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif ($tagname eq 'tpfanalysecarac')
+ {
+ $self->{isSerie} = 0 ;
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($tagname eq 'tpffindesc')
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'tpfsautdeligne') && ($self->{isDescription}))
+ {
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/images/books/|i))
+ {
+ $self->{curInfo}->{cover} = 'http://www.liberonweb.com/asp/' .$attr->{src};
+
+ my $isbn = reverse($attr->{src});
+ my $found = index($isbn,"/");
+ if ( $found >= 0 )
+ {
+ $isbn = substr($isbn, 0,$found);
+ $isbn = reverse($isbn);
+ $found = index($isbn,".");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{isbn} = substr($isbn, 0,$found);
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ if (($origtext =~ m/Collana:/i) && ($self->{itemsList}[$self->{itemIdx}]->{edition} eq ''))
+ {
+ my @array = split(/-/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[0] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[0] =~ s/\s+$//g;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $array[0];
+ }
+ elsif (($origtext =~ m/Anno /i) && ($self->{itemsList}[$self->{itemIdx}]->{publication} eq ''))
+ {
+ my $found = index($origtext,"Anno ");
+ if ( $found >= 0 )
+ {
+ $origtext = substr($origtext, $found +length('Anno '),length($origtext)- $found -length('Anno '));
+ my @array = split(/,/,$origtext);
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $array[0];
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{publication} =~ s/\s+$//g;
+ }
+ }
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ if ($origtext =~ m/Argomenti:/i)
+ {
+ my @array = split(/:/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ $array[1] =~ s|, |,|gi;
+ $self->{curInfo}->{genre} = $array[1];
+ }
+ $self->{isGenre} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ if ($origtext =~ m/Caratteristiche:/i)
+ {
+ my @array = split(/:/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ $self->{curInfo}->{format} = $array[1];
+ }
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/-/,$origtext);
+ my $element;
+
+ foreach $element (@array)
+ {
+ my @array = split(/\(/,$element);
+ # Enleve les blancs en debut de chaine
+ $array[0] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $array[0] =~ s/\s+$//;
+
+ if ($array[0] ne '')
+ {
+ $self->{curInfo}->{authors} .= $array[0];
+ $self->{curInfo}->{authors} .= ",";
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ if ($origtext =~ m/Collana:/i)
+ {
+ my @array = split(/:/,$origtext);
+ # Enleve les blancs en debut de chaine
+ $array[1] =~ s/^\s+//;
+ $self->{curInfo}->{serie} = $array[1];
+ }
+ elsif (($origtext ne '') && ($self->{curInfo}->{serie} eq ''))
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ }
+ }
+ elsif ($self->{isAnalyse})
+ {
+
+ my @array = split(/ - /,$origtext);
+ my $element;
+
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $element =~ s/\s+$//;
+
+ if ($element =~ m/Pagine/i)
+ {
+ $element =~ s/Pagine //i;
+ $element =~ s/-/,/i;
+ my @array2 = split(/,/,$element);
+ if ($array2[1] eq '')
+ {
+ $self->{curInfo}->{pages} = $array2[0];
+ }
+ else
+ {
+ $self->{curInfo}->{pages} = $array2[1];
+ }
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{pages} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{pages} =~ s/\s+$//;
+ }
+ elsif ($element =~ m/Anno/i)
+ {
+ my @array2 = split(/ /,$element);
+ $self->{curInfo}->{publication} = $array2[1];
+ }
+ }
+
+ }
+ elsif ($self->{isDescription})
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ $self->{curInfo}->{description} .= "\n";
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isSerie} = 0;
+ $self->{isGenre} = 0;
+ $self->{isFormat} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+ else
+ {
+ $html =~ s|\n||gi;
+ $html =~ s|\r||gi;
+ $html =~ s|\t||gi;
+
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|<tpfsautdeligne>|gi;
+ $html =~ s|<br />|<tpfsautdeligne>|gi;
+ $html =~ s|<br clear=all>|<tpfsautdeligne>|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<!--Visualizzazione delle Note del libro-->|<tpfanalysecarac>|gi;
+ $html =~ s|<!--Visualizzazione dell'Editore e della Collana-->|<tpfserie>|gi;
+ $html =~ s|<font face=Verdana, Arial, Helvetica size=2>|<font face="Verdana, Arial, Helvetica" size=2>|gi;
+ $html =~ s|<!--mstheme-->|<tpffindesc>|gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.liberonweb.com/asp/libro.asp?ISBN=" . $word;
+ }
+ else
+ {
+ return "http://www.liberonweb.com/asp/lista.asp?D1=Titolo&T1=" . $word. "&I1=1";
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "LiberOnWeb";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCMareno.pm b/lib/gcstar/GCPlugins/GCbooks/GCMareno.pm
new file mode 100644
index 0000000..1afdc67
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCMareno.pm
@@ -0,0 +1,365 @@
+package GCPlugins::GCbooks::GCbooksMareno;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+my $searchURL = "";
+
+{
+ package GCPlugins::GCbooks::GCPluginMareno;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'title') #od razu mamy wynik?
+ {
+ $self->{isBook} = 7;
+ }
+
+ if (($tagname eq 'table') && ($attr->{class} eq 'bookData'))
+ {
+ $self->{itemIdx}++;
+ $self->{isBook} = 1;
+ }
+ if (($tagname eq 'a') && ($self->{isBook} == 1))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.mareno.pl".$attr->{href};
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{class} eq 'bookAuthor') && ($self->{isBook} == 1))
+ {
+ $self->{isAuthor} = 1;
+ $self->{isFormat} = 1;
+ $self->{isPublisher} = 1;
+ $self->{isPublication} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgISBN'))
+ {
+ $self->{isISBN} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPUBLI'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPDATE'))
+ {
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgFORMAT'))
+ {
+ $self->{isFormat} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgDESCR'))
+ {
+ $self->{isDescription} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgTITLE'))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgAUTOR'))
+ {
+ $self->{isAuthor} = 2;
+ }
+ if ($tagname eq 'a')
+ {
+ if ($self->{isAuthor} eq '1')
+ {
+ $self->{isAuthor} = 2;
+ }
+ elsif ($self->{isAuthor} eq '2')
+ {
+ $self->{isAuthor} = 1;
+ }
+ }
+ if (($tagname eq 'a') && ($attr->{href} =~ /okladki\/big/))
+ {
+ $self->{isCover} = 1;
+ $self->{curInfo}->{cover} = "http://www.mareno.pl".$attr->{href};
+ $self->{isCover} = 0;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($tagname eq 'table')
+ {
+ $self->{isBook} = 0;
+ }
+ if ($tagname eq 'div')
+ {
+ $self->{isAuthor} = 0;
+ }
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} == 7) #od razu mamy wynik?
+ {
+ $origtext =~ s|^\s*||gs;
+ $origtext =~ s|\s*$||gs;
+ if (($origtext ne '') && ($origtext !~ /wyszukiwanie/))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $searchURL;
+ $self->{isUrl} = 0;
+ }
+ $self->{isBook} = 0;
+ }
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ if ($self->{isAuthor} == 1)
+ {
+ my ($au, $fo, $pu, $pd);
+ $origtext =~ m|(#\^#- [^#]+#\^#)?(okładka\s*[^,]+,\s*)?([^,]+,\s*)?(\d*)?|s;
+ $au = $1;
+ $fo = $2;
+ $pu = $3;
+ $pd = $4;
+ $au =~ s|#\^#- ([^#]+)#\^#|$1|g;
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $au;
+ $self->{isAuthor} = 0;
+ $fo =~ s|okładka\s*([^,]+),\s*|$1|g;
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $fo;
+ $self->{isFormat} = 0;
+ $pu =~ s|([^,]+),\s*|$1|g;
+ $self->{itemsList}[$self->{itemIdx}]->{publisher} = $pu;
+ $self->{isPublisher} = 0;
+ $self->{itemsList}[$self->{itemIdx}]->{publication} = $pd;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isTitle} == 1)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} == 1)
+ {
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|\s*$||;
+ if ($origtext ne '')
+ {
+ if ($self->{curInfo}->{authors} ne '')
+ {
+ $self->{curInfo}->{authors} .= ",";
+ }
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 2;
+ }
+ if ($self->{isFormat} == 1)
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ if ($self->{isDescription} == 1)
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0;
+ }
+ if ($self->{isISBN} eq '1')
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ if ($self->{isPublication} eq '1')
+ {
+ $origtext =~ s|(\S*)\s*(\S{4})|$2|;
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 1,
+ format => 1,
+ edition => 0,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+ $self->{actorsCounter} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s/<\/?(b|strong)>//gi;
+ $html =~ s|</?font[^>]*>||gi;
+ $html =~ s|<br>|#\^#|gi;
+ $html =~ s|<TABLE border="0">\s*<tr>\s*<td valign=top>\s*</td>|<table border="0" class="bookData">|gs;
+ $html =~ s|<td valign=top align=center><a href="[^"]*" class="left-menulink">\s*<IMG SRC[^>]*></a></td>||gs;
+ $html =~ s|<td valign=top align=left><A HREF([^>]*)>\s*|<a href$1>|gm;
+ $html =~ s|</a>&nbsp;\s*|</a>\n<div class="bookAuthor">|gm;
+ $html =~ s|</td></tr>|</div>|g;
+ }
+ else
+ {
+ $html =~ s/<\/?(i|br|strong)>//gi;
+
+ $html =~ s|<h1>([^<]*)</h1>|<div id="wrgTITLE">$1</div>|s;
+ $html =~ s|<h2><A(.*)</A></h2>|<div id="wrgAUTOR"><A$1</A></div>|s;
+ $html =~ s|<span class=textsmall>\s*ISBN:\s*([\dX]*)\s*</span>|<div id="wrgISBN">$1</div>|s;
+ $html =~ s|<span class=textsmall>\s*okładka:\s*([^,]*),?\s*(\d*)[^<]*</span>|<div id="wrgFORMAT">$1</div><div id="wrgPAGES">$2</div>|s;
+ $html =~ s|<span class=textsmall>\s*wydawnictwo:\s*([^,]*),\s*(\d*)\s*</span>|<div id="wrgPUBLI">$1</div><div id="wrgPDATE">$2</div>|s;
+ $html =~ s|opis produktu:\s*([^<]*)<hr>|<div id="wrgDESCR">$1</div><hr>|;
+# $html =~ s|<dt>Seria:</dt>$*\s*<dd>(.*)</dd>|<div id="wrgSERIA">$1</div>|;
+# $html =~ s|<dt>Wydanie:</dt><dd>(.*)</dd>|<div id="wrgEDITI">$1</div>|;
+# $html =~ s|<dt>TÅ‚umaczenie:\s*</dt>$*\s*<dd>|<dd id="wrgTRANS">|;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ $searchURL = "http://www.mareno.pl/rezultat.php?tytul=".$word;
+ return $searchURL;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.mareno.pl/';
+ }
+
+ sub getName
+ {
+ return "Mareno";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm b/lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm
new file mode 100644
index 0000000..6b5f41b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCMediabooks.pm
@@ -0,0 +1,333 @@
+package GCPlugins::GCbooks::GCMediabooks;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginMediabooks;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ use Encode;
+ use HTML::Entities;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+
+ if (($tagname eq 'font') && ($attr->{class} eq 'font4Copy'))
+ {
+ $self->{isBook} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/artigos/popUp_detalhe.jsp|i) && ($self->{isBook}) && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ my $found = index($self->{itemsList}[$self->{itemIdx}]->{url},"'");
+ if ( $found >= 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = substr($self->{itemsList}[$self->{itemIdx}]->{url}, $found +length("'"),length($self->{itemsList}[$self->{itemIdx}]->{url})- $found -length("'"));
+ $found = index($self->{itemsList}[$self->{itemIdx}]->{url},"'");
+ if ( $found >= 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = substr($self->{itemsList}[$self->{itemIdx}]->{url}, 0, $found);
+ }
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.mediabooks.pt" .$self->{itemsList}[$self->{itemIdx}]->{url};
+ }
+
+ $self->{isTitle} = 1 ;
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/autores/index.jsp|i) && ($self->{isBook}))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/editores/index.jsp|i) && ($self->{isBook}))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'input') && ($attr->{type} eq 'hidden'))
+ {
+ $self->{isBook} = 0 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'a') && ($attr->{href} =~ m|/autores/index.jsp|i))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/editores/index.jsp|i))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif ($self->{isISBN} eq 1)
+ {
+ $self->{isISBN} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($self->{isTitle}))
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'font4Copy'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/artigos/imagens/|i))
+ {
+ if ($origtext =~ m|/artigos/imagens/livros|i)
+ {
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = 'http://www.mediabooks.pt' .$attr->{src};
+ }
+
+ $self->{isTitle} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ # Enleve les retours chariots
+ $origtext =~ s/\n//g;
+ $origtext =~ s/\r//g;
+ if (($self->{itemsList}[$self->{itemIdx}]->{authors} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '2')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/ISBN/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Formato/i);
+ $self->{isDescription} = 1 if ($origtext =~ m/Breve Descri/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Ano de Edi/i);
+ $self->{isPage} = 1 if ($origtext =~ m/P.ginas/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN} eq 2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isPage})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isFound} = 0;
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormatPublication} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublication} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPage} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|\n||gi;
+ $html =~ s|\r||gi;
+ $html =~ s|\t||gi;
+
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|</h4>||gi;
+ $html =~ s|\x{92}|'|g;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return ('http://www.mediabooks.pt/pesquisa/result_pesq.jsp', ["v_sec_id" => "1", "v_prev_sec_id" => "", "v_pes_id" => "2", "v_pesquisa" => "$word", "image.x" => "5", "image.y" => "7"] );
+ }
+ else
+ {
+ return ('http://www.mediabooks.pt/pesquisa/result_pesq.jsp', ["v_sec_id" => "1", "v_prev_sec_id" => "", "v_pes_id" => "1", "v_pesquisa" => "$word", "image.x" => "5", "image.y" => "7"] );
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.mediabooks.pt/';
+ }
+
+ sub getName
+ {
+ return "Mediabooks";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm b/lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm
new file mode 100644
index 0000000..5c5129a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCMerlin.pm
@@ -0,0 +1,389 @@
+package GCPlugins::GCbooks::GCbooksMerlin;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginMerlin;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'li') && ($attr->{class} eq 'tytul'))
+ {
+ $self->{isBook} = 1;
+ $self->{isUrl} = 1;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'li') && ($attr->{class} eq 'wydawca'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ if (($tagname eq 'a')
+ && ($self->{isUrl} eq '1'))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.merlin.com.pl".$attr->{href};
+ $self->{isUrl} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgISBN'))
+ {
+ $self->{isISBN} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPUBLI'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgPDATE'))
+ {
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgSERIA'))
+ {
+ $self->{isSerie} = 2;
+ }
+ if (($tagname eq 'a') && ($self->{isSerie} eq '2'))
+ {
+ $self->{isSerie} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'wrgEDITI'))
+ {
+ $self->{isEdition} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'prodHead'))
+ {
+ $self->{isCover} = 2;
+ $self->{isTitle} = 2;
+ $self->{isFormat} = 2;
+ }
+ if (($tagname eq 'h1') && ($attr->{class} eq 'prodTitle') && ($self->{isTitle} eq '2'))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'h2') && ($attr->{class} eq 'prodPerson'))
+ {
+ $self->{isAuthor} = 2;
+ }
+ if ($tagname eq 'a')
+ {
+ if ($self->{isAuthor} eq '1')
+ {
+ $self->{isAuthor} = 2;
+ }
+ elsif ($self->{isAuthor} eq '2')
+ {
+ $self->{isAuthor} = 1;
+ }
+ }
+ if (($tagname eq 'dd') && ($attr->{id} eq 'wrgTRANS'))
+ {
+ $self->{isTranslator} = 2;
+ }
+ if ($tagname eq 'a')
+ {
+ if ($self->{isTranslator} eq '1')
+ {
+ $self->{isTranslator} = 2;
+ }
+ elsif ($self->{isTranslator} eq '2')
+ {
+ $self->{isTranslator} = 1;
+ }
+ }
+ if (($tagname eq 'div') && ($attr->{id} eq 'prodImg') && ($self->{isCover} eq '2'))
+ {
+ $self->{isCover} = 1;
+ }
+ if (($tagname eq 'img') && ($self->{isCover} eq '1'))
+ {
+ $self->{curInfo}->{cover} = "http://www.merlin.com.pl".$attr->{src};
+ $self->{isCover} = 0;
+ }
+ if (($tagname eq 'div') && ($attr->{class} eq 'prodFeatureSpec') && ($self->{isFormat} eq '2'))
+ {
+ $self->{isFormat} = 1;
+ }
+ if (($tagname eq 'div') && ($attr->{class} eq 'productDesc'))
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($tagname eq 'h2')
+ {
+ $self->{isAuthor} = 0;
+ }
+ if ($tagname eq 'dd')
+ {
+ $self->{isTranslator} = 0;
+ }
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} eq '1')
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ $self->{isBook} = 0;
+ if ($self->{inside}->{a})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isBook} = 1;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ }
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+
+ }
+ else
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} eq '1')
+ {
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|\s*$||;
+ if ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 2;
+ }
+ if ($self->{isTranslator} eq '1')
+ {
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|\s*$||;
+ if ($self->{curInfo}->{translator} eq '')
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{translator} .= ", ".$origtext;
+ }
+ $self->{isTranslator} = 2;
+ }
+ if ($self->{isFormat} eq '1')
+ {
+ $origtext =~ s|okładka: ||m;
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ if ($self->{isDescription} eq '1')
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0;
+ }
+
+ if ($self->{isISBN} eq '1')
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isEdition} eq '1')
+ {
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ if ($self->{isPublication} eq '1')
+ {
+ $origtext =~ s|(\S*)\s*(\S{4})|$2|;
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isSerie} eq '1')
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+ $self->{actorsCounter} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|gms;
+ $html =~ s|<li class="tytul">(.*)</li>\s*<li>|<li class="tytul">$1</li><li class="wydawca">|gm;
+ }
+ else
+ {
+ $html =~ s|</?strong>||gi;
+ $html =~ s|</?i>||gi;
+ $html =~ s|</?br>||gi;
+ $html =~ s|<dfn>(.*?)</dfn>||gs;
+
+ $html =~ s|<dt>ISBN:</dt><dd>(.*)</dd>|<div id="wrgISBN">$1</div>|;
+ $html =~ s|<dt>Liczba stron:</dt><dd>(.*)</dd>|<div id="wrgPAGES">$1</div>|;
+ $html =~ s|<dt>Seria:</dt>\s*<dd>(.*)</dd>|<div id="wrgSERIA">$1</div>|m;
+ $html =~ s|<dt>Wydanie:</dt><dd>(.*)</dd>|<div id="wrgEDITI">$1</div>|;
+ $html =~ s|<dt>Wydawnictwo:</dt>\s*<dd>\s*(.*)\s*,*\s*(.*)\s*</dd>|<div id="wrgPUBLI">$1</div><div id="wrgPDATE">$2</div>|m;
+ $html =~ s|<dt>TÅ‚umaczenie:\s*</dt>\s*<dd>|<dd id="wrgTRANS">|m;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.merlin.com.pl/frontend/browse/search/1.html?phrase=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.merlin.com.pl/';
+ }
+
+ sub getName
+ {
+ return "Merlin";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm b/lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm
new file mode 100644
index 0000000..6bc22eb
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCNUKat.pm
@@ -0,0 +1,447 @@
+package GCPlugins::GCbooks::GCbooksNUKat;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+my $searchURL = "";
+my $searchISBN = "";
+
+{
+ package GCPlugins::GCbooks::GCPluginNUKat;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'title') #od razu mamy wynik
+ {
+ $self->{isBook} = 7;
+ }
+
+ if (($tagname eq 'tr') && ($attr->{class} eq 'intrRow'))
+ {
+ $self->{isBook} = 1;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrRowCell1') && ($self->{isBook} == 1))
+ {
+ $self->{isUrl} = 2;
+ }
+ if (($tagname eq 'a') && ($self->{isUrl} == 2) && ($origtext =~ /.*function=CARDSCR.*/))
+ {
+ $self->{isUrl} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{url} =~ s|skin=portal&||;
+ $self->{isUrl} = 0;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrAutor') && ($self->{isBook} == 1))
+ {
+ $self->{isAuthor} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrTytul') && ($self->{isBook} == 1))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'intrWydaw') && ($self->{isBook} == 1))
+ {
+ $self->{isPublication} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgTITLE'))
+ {
+ $self->{isTitle} = 1;
+ $self->{isAuthor} = 1;
+ $self->{isTranslator} = 1;
+ $self->{isArtist} = 1;
+ $self->{isISBN} = 2;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgPAGES'))
+ {
+ $self->{isPage} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgSERIA'))
+ {
+ $self->{isSerie} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgPUBLI'))
+ {
+ $self->{isPublisher} = 1;
+ $self->{isPublication} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgEDITI'))
+ {
+ $self->{isEdition} = 1;
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'wrgISBN') && ($self->{isISBN} == 2))
+ {
+ $self->{isISBN} = 1;
+ }
+
+ if (($tagname eq 'div') && ($attr->{class} eq 'prodFeatureSpec') && ($self->{isFormat} eq '2'))
+ {
+ $self->{isFormat} = 1;
+ }
+ }
+ }
+
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isBook} == 7) #od razu mamy wynik?
+ {
+ if ($origtext =~ /Pełny opis/)
+ {
+ $self->{isUrl} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $searchURL;
+ $self->{isUrl} = 0;
+ $self->{isBook} = 0;
+ }
+ }
+ if ($self->{isBook} == 1)
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+ if ($self->{isTitle} == 1)
+ {
+ $origtext =~ s|^\s*([^/]*)/?|$1|m;
+ $origtext =~ s|^\s*([^:]*):?|$1|m;
+ $origtext =~ s|\s*$||m;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor} == 1)
+ {
+ $origtext =~ s|\s*\/\s*(.*)\s*|$1|;
+ $origtext =~ s|^\s*([^\.]*)\.?|$1|m;
+ $origtext =~ s|([^\(]*)(\([^\)]*\))?|$1|;
+ $origtext =~ s|\s*$||m;
+ $origtext =~ s|([^,]*), (.*)|$2 $1|m;
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $origtext;
+ $self->{isAuthor} = 0;
+ }
+ if ($self->{isPublication} == 1)
+ {
+ $origtext =~ s|(.*)(\d{4})\D*|$2|s;
+ $origtext =~ s|^\s*([^\.]*)\.?|$1|m;
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublication} = 0;
+ $self->{isBook} = 0;
+ }
+ }
+
+ }
+ else
+ {
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ if ($self->{isFormat} eq '1')
+ {
+ $origtext =~ s|okładka: ||m;
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+
+
+
+ if ($self->{isISBN} eq '1')
+ {
+ my ($pom1, $pom2);
+ if ($self->{searchField} eq 'isbn')
+ {
+ $pom1 = $self->{searchISBN};
+ $pom2 = $origtext;
+ $pom2 =~ s|[^\dX]||g;
+ $pom1 =~ s|-||g;
+ $pom2 =~ s|-||g;
+ if ($pom1 eq $pom2)
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ else
+ {
+ $self->{isISBN} = 2;
+ }
+ }
+ else
+ {
+ $origtext =~ s|[^\dX]||g;
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ }
+ if ($self->{isTitle} eq '1')
+ {
+ my ($pom1, $pom2, $ti, $au, $tr, $il);
+ $origtext =~ m|([^/]*)/\s*([^;]*)(; )?([^;]*)(; )?([^;]*)$|;
+ $ti = $1;
+ $au = $2;
+ $pom1 = $4;
+ $pom2 = $6;
+ $ti =~ s|^\s*||;
+ $ti =~ s|\s*$||;
+ $self->{curInfo}->{title} = $ti;
+ $self->{isTitle} = 0;
+ $au =~ s| i |,|g;
+ $au =~ s|, |,|g;
+ $au =~ s|[\[\]]||g;
+ $au =~ s|tekst||g;
+ $au =~ s|^\s*||;
+ $au =~ s|\s*$||;
+ $au =~ s|(.*)(\.{1})|$1|;
+ $self->{curInfo}->{authors} = $au;
+ $self->{isAuthor} = 0;
+ $pom1 =~ s|[\[\]]||g;
+ $pom1 =~ m|(.*)(.{1})|;
+ if ($2 eq '.')
+ {
+ $pom1 = $1;
+ }
+ $pom2 =~ s|[\[\]]||g;
+ $pom2 =~ m|(.*)(.{1})|;
+ if ($2 eq '.')
+ {
+ $pom2 = $1;
+ }
+ if ($pom2 =~ /(przeł\.|przekł\.|tł\.|tłum\.)/)
+ {
+ $tr = $pom2;
+ }
+ if ($pom2 =~ /(il\.|oprac\. graf\.)/)
+ {
+ $il = $pom2;
+ }
+ if ($pom1 =~ /(przeł\.|przekł\.|tł\.|tłum\.)/)
+ {
+ $tr = $pom1;
+ }
+ if ($pom1 =~ /(il\.|oprac\. graf\.)/)
+ {
+ $il = $pom1;
+ }
+ $tr =~ s/(przeł\.|przekł\.|tł\.|tłum\.)//;
+ $tr =~ s|z \w+\.||;
+ $tr =~ s|^\s*||;
+ $tr =~ s|\s*$||;
+ $tr =~ s| i |,|g;
+ $tr =~ s|, |,|g;
+ $self->{curInfo}->{translator} = $tr;
+ $self->{isTranslator} = 0;
+ $il =~ s/(il\.|oprac\. graf\.)//;
+ $il =~ s|^\s*||;
+ $il =~ s|\s*$||;
+ $il =~ s| i |,|g;
+ $il =~ s|, |,|g;
+ $self->{curInfo}->{artist} = $il;
+ $self->{isArtist} = 0;
+ }
+ if ($self->{isPage} eq '1')
+ {
+ $origtext =~ s|(\d*)\D.*|$1|;
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ if ($self->{isEdition} eq '1')
+ {
+ $origtext =~ s|\D*(\d*)\D.*|$1|;
+ $self->{curInfo}->{edition} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ if ($self->{isPublisher} eq '1')
+ {
+ my $pom = $origtext;
+ $origtext =~ s|[^:]*:\s*(.*),.*|$1|;
+ $origtext =~ s|^\s*||;
+ $origtext =~ s|"(.*)"|$1|;
+ $self->{curInfo}->{publisher} = $origtext;
+ $pom =~ s|(.*)(\d{4})(\D*)|$2|;
+ $self->{curInfo}->{publication} = $pom;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ }
+ if ($self->{isSerie} eq '1')
+ {
+ $origtext =~ s|([^;]*)(;.*)|$1|;
+ $origtext =~ s|\s*$||;
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ };
+
+ $self->{isBook} = 0;
+ $self->{isUrl} = 0;
+ $self->{isEditor_Publication_Format_Lang} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isEdition} = 0;
+ $self->{isPage} = 0;
+ $self->{isLanguage} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isCover} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isArtist} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+ $self->{actorsCounter} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|gms;
+ $html =~ s|<img .*/book.gif">||g;
+ $html =~ s|<font.*</font>||g;
+ $html =~ s|<span class="highlight[^>]+>||g;
+ $html =~ s|</?span[^>]*>||g;
+ $html =~ s|<th[^>]*>Autor</th>\s*<td><a[^>]*>([^<]*)</a>|<td class="intrAutor">$1|gs;
+ $html =~ s|<th[^>]*>Tytuł</th>\s*<td><a[^>]*>([^<]*)</a>|<td class="intrTytul">$1|gs;
+ $html =~ s|<th[^>]*>Adres wyd.</th>\s*<td>|<td class="intrWydaw">|gs;
+ }
+ else
+ {
+ $html =~ s|</?strong>||gi;
+ $html =~ s|</?i>||gi;
+ $html =~ s|</?br>||gi;
+
+ $html =~ s|<th[^>]*>Tytuł</th>\s*<td>\s*<a[^>]*>([^<]*)</a>|<td class="wrgTITLE">$1|gs;
+ $html =~ s|<th[^>]*>Strefa serii</th>\s*<td>\s*<a[^>]*>([^<]*)</a>|<td class="wrgSERIA">$1|gs;
+ $html =~ s|<th[^>]*>Adres wydawniczy</th>\s*<td>|<td class="wrgPUBLI">|gs;
+ $html =~ s|<th[^>]*>Opis fizyczny</th>\s*<td>|<td class="wrgPAGES">|gs;
+ $html =~ s|<th[^>]*>Oznaczenie wydania</th>\s*<td>|<td class="wrgEDITI">|gs;
+ $html =~ s|<th[^>]*>ISBN</th>\s*<td>|<td class="wrgISBN">|gs;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $bubu;
+ if ($self->{searchField} eq 'isbn')
+ {
+ $bubu = "7";
+ $self->{searchISBN} = $word;
+ }
+ else
+ {
+ $bubu = "4";
+ $self->{searchISBN} = "";
+ }
+ $searchURL = "http://www.nukat.edu.pl/cgi-bin/gw_43_3/chameleon?host=193.0.118.2%2b1111%2bDEFAULT&search=KEYWORD&function=INITREQ&conf=.%2fchameleon.conf&lng=pl&u1=".$bubu."&t1=".$word;
+ return $searchURL;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.nukat.edu.pl/';
+ }
+
+ sub getName
+ {
+ return "NUKat";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "UTF-8";
+ #return "ISO-8859-2";
+ }
+
+ sub getAuthor
+ {
+ return 'WG';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm b/lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm
new file mode 100644
index 0000000..c878af9
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCNooSFere.pm
@@ -0,0 +1,462 @@
+package GCPlugins::GCbooks::GCNooSFere;
+
+###################################################
+#
+# Copyright 2005-2006 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginNooSFere;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ return if ( $self->{isFound} eq 2 );
+ if (($tagname eq 'td') && ($attr->{class} eq 'onglet_bleu'))
+ {
+ $self->{isFound} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m/editionslivre.asp\?numitem=/i) && !($attr->{href} =~ m/numediteur=/i) && !($attr->{href} =~ m/tri=/i))
+ {
+ $self->{isTitle} = 1 ;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/icarus/livres/auteur.asp\?NumAuteur=|i) && ($self->{isAuthor} eq 0))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|./editeur.asp\?numediteur=|i))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|./serie.asp\?NumSerie=|i))
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m/editionslivre.asp\?numitem=/i) && ($attr->{href} =~ m/numediteur=/i))
+ {
+
+ my $html = $self->loadPage( "http://www.noosfere.org/icarus/livres/" . $attr->{href}, 0, 1 );
+ my $found = index($html,"Fiche livre&nbsp;: les &eacute;ditions");
+ if ( $found >= 0 )
+ {
+
+ while (index($html,"./niourf.asp?numlivre="))
+ {
+ $found = index($html,"./niourf.asp?numlivre=");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('./niourf.asp?numlivre='),length($html)- $found -length('./niourf.asp?numlivre='));
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{saveTitle};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{saveAuthor};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.noosfere.org/icarus/livres/niourf.asp?numlivre=" . substr($html, 0, index($html,"\""));
+ }
+ else
+ {
+ last;
+ }
+
+ }
+ }
+ else
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{saveTitle};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{saveAuthor};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.noosfere.org/icarus/livres/" . $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'h1')
+ {
+ $self->{isTitle} = 1 ;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|./niourf.asp\?numlivre=|i))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $self->{saveTitle};
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $self->{saveAuthor};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.noosfere.org/icarus/livres/" . $attr->{href};
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'onglet_biblio1'))
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif (($tagname eq 'table') && ($attr->{class} eq 'piedpage'))
+ {
+ $self->{isAuthor} = 0 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'mytpf') && ($attr->{id} eq 'TPFENDCOMMENTTPF'))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{class} eq 'TitreNiourf'))
+ {
+ $self->{isAnalyse} = 0 ;
+ $self->{isTitle} = 1 ;
+ $self->{isAuthor} = 0 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{class} eq 'AuteurNiourf'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/icarus/livres/auteur.asp\?NumAuteur=|i) && ($self->{isAuthor} eq 1))
+ {
+ $self->{isAuthor} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|actu_mois.asp\?|i))
+ {
+ $self->{isPublication} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|editeur.asp\?numediteur=|i) && ($self->{curInfo}->{publisher} eq ''))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|collection.asp\?NumCollection=|i) && ($self->{curInfo}->{serie} eq ''))
+ {
+ $self->{isSerie} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ m|/icarus/livres/auteur.asp\?NumAuteur=|i) && ($self->{isTranslator} eq 1))
+ {
+ $self->{isTranslator} = 2 ;
+ }
+ elsif ($tagname eq 'br')
+ {
+ $self->{isAnalyseTrans} = 1 ;
+ }
+ elsif (($tagname eq 'font') && ($attr->{style} eq 'font-size:12px;') && ($self->{isAnalyse} eq 0))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{name} eq 'couverture'))
+ {
+ $self->{curInfo}->{cover} = "http://www.noosfere.org/icarus/livres/" . $attr->{src} ;
+ }
+ elsif (($tagname eq 'mytpf') && ($attr->{id} eq 'TPFSTARTCOMMENTTPF'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ $self->{saveTitle} = $origtext;
+ $self->{saveAuthor} = '';
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if (($self->{saveAuthor} eq '') && ($origtext ne ''))
+ {
+ $self->{saveAuthor} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{saveAuthor} .= ', ';
+ $self->{saveAuthor} .= $origtext;
+ }
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{edition} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isFound} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($origtext eq 'Fiche livre')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ $self->{isFound} = 2 ;
+ }
+ else
+ {
+ $self->{isFound} = 0 ;
+ }
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//g;
+ if ($self->{isTitle} eq '1')
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAnalyse} eq 1)
+ {
+ my $found = index($origtext," pages");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{pages} = substr($origtext, 0, $found);
+ }
+ $found = index($origtext,"ISBN : ");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{isbn} = substr($origtext, $found +length('ISBN : '),length($origtext)- $found -length('ISBN : '));
+ }
+
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif ($self->{isAnalyseTrans})
+ {
+ $self->{isTranslator} = 1 if ($origtext =~ m/Traduction/i);
+
+ $self->{isAnalyseTrans} = 0 ;
+ }
+ elsif ($self->{isAuthor} eq 2)
+ {
+ if (($self->{curInfo}->{authors} eq '') && ($origtext ne ''))
+ {
+ $self->{curInfo}->{authors} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{curInfo}->{authors} .= ', ';
+ $self->{curInfo}->{authors} .= $origtext;
+ }
+ $self->{isAuthor} = 1 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isSerie})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{isSerie} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isTranslator} eq 2)
+ {
+ $self->{curInfo}->{translator} = $origtext;
+ $self->{isTranslator} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ if ($origtext =~ m/Pas de texte sur la quatri.me de couverture\./i)
+ {
+ }
+ else
+ {
+ $self->{curInfo}->{description} .= $origtext ."\n";
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 1,
+ serie => 1,
+ };
+
+ $self->{saveTitle} = '';
+ $self->{saveAuthor} = '';
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isSerie} = 0;
+ $self->{isDescription} = 0;
+ $self->{isTranslator} = 0;
+ $self->{isAnalyseTrans} = 0;
+ $self->{isAnalyse} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"Id=\"R");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found +length('Id="R'),length($html)- $found -length('Id="R'));
+ my $found2 = index($html2,"<TD class=\"noocell_fs15\" valign=\"top\">");
+ if ( $found2 >= 0 )
+ {
+ $html2 = substr($html2, $found2 +length('<TD class="noocell_fs15" valign="top">'),length($html2)- $found2 -length('<TD class="noocell_fs15" valign="top">'));
+ }
+
+ $found2 = index($html2,"</TD>");
+ if ( $found2 >= 0 )
+ {
+ $html2 = substr($html2, 0, $found2);
+ }
+
+ $html2 =~ s|<li>|\n* |gi;
+ $html2 =~ s|<br>|\n|gi;
+ $html2 =~ s|<br />|\n|gi;
+ $html2 =~ s|<b>||gi;
+ $html2 =~ s|</b>||gi;
+ $html2 =~ s|<i>||gi;
+ $html2 =~ s|</i>||gi;
+ $html2 =~ s|<p>|\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|</h4>||gi;
+ $html2 =~ s|\x{92}|'|g;
+ $html2 =~ s|&#146;|'|gi;
+ $html2 =~ s|&#149;|*|gi;
+ $html2 =~ s|&#156;|oe|gi;
+ $html2 =~ s|&#133;|...|gi;
+ $html2 =~ s|\x{85}|...|gi;
+ $html2 =~ s|\x{8C}|OE|gi;
+ $html2 =~ s|\x{9C}|oe|gi;
+
+ $html = substr($html, 0, $found) . "><mytpf id=\"TPFSTARTCOMMENTTPF\">" . $html2 ."</mytpf><mytpf id=\"TPFENDCOMMENTTPF\"></mytpf>";
+
+ }
+
+ $html =~ s|<b><p>||gmi;
+ $html =~ s|<br><br>|<br>|gmi;
+ $html =~ s|<br><|<|gmi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.noosfere.org/icarus/livres/cyborg_livre.asp?mini=1000&maxi=3000&mode=Idem&EtOuParution=NS&isbn=". $word;
+ }
+ else
+ {
+ return "http://www.noosfere.org/icarus/livres/cyborg_livre.asp?mini=1000&maxi=3000&mode=Idem&EtOuParution=NS&titre=". $word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.noosfere.org/';
+ }
+
+ sub getName
+ {
+ return "nooSFere";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm b/lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm
new file mode 100644
index 0000000..54dd119
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCSaraiva.pm
@@ -0,0 +1,303 @@
+package GCPlugins::GCbooks::GCSaraiva;
+
+###################################################
+#
+# Plugin for a brazilian bookstore named "Saraiva".
+# Code written by Guilherme "nirev" Nogueira.
+# guilherme at nirev dot org
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCPluginSaraiva;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && ($attr->{class} eq 'hsliceLista'))
+ {
+ $self->{isResult} = 1;
+ $self->{linkCount} = 0;
+ $self->{itemIdx}++;
+ }
+ if (($tagname eq 'span') && ($attr->{class} eq 'entry-title'))
+ {
+ $self->{isTitle} = 1;
+ }
+ if (($tagname eq 'h2') && ($attr->{class} eq 'titulo_autor'))
+ {
+ $self->{isAuthor} = 1;
+ }
+ if (($tagname eq 'a') && $self->{isResult} && $self->{linkCount} == 0 )
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{linkCount}++;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'entry-content'))
+ {
+ $self->{isResult} = 0;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'img') && ($attr->{id} eq 'imgProd'))
+ {
+ my $imgid = $attr->{src};
+ $imgid =~ s/(.)*pro_id=//;
+ $imgid =~ s/&.*$//;
+ $self->{curInfo}->{cover} = 'http://www.livrariasaraiva.com.br/imagem/imagem.dll?tam=2&pro_id='.$imgid;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'aba1'))
+ {
+ $self->{isDescription} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'aba2'))
+ {
+ $self->{divInfo} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'produtosAbasMenus'))
+ {
+ $self->{divInfo} = 0;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'tituloprod'))
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} eq 'javascript:PesquisaAutor();'))
+ {
+ $self->{isAuthor} = 1;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} eq 'javascript:PesquisaMarca();'))
+ {
+ $self->{isPublisher} = 1;
+ }
+ elsif (($tagname eq 'font'))
+ {
+ $self->{isAnalyse} = 1;
+ }
+ elsif (($tagname eq 'b') && $self->{divInfo} == 1)
+ {
+ $self->{isAnalyse} = 1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ my $texto = $origtext;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $texto;
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isAuthor})
+ {
+ my $texto = $origtext;
+ $texto =~ s/<br>//;
+ my @dados = split(' / ', $texto);
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $dados[0];
+ $self->{isAuthor} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{isAuthor})
+ {
+ my @authors = split(';', $origtext);
+ my $authors = '';
+ my $tam = @authors;
+ my $count = 0;
+ for($count = 0; $count < $tam; $count++)
+ {
+ $authors[$count] =~ s/^\s*//gi;
+ $authors[$count] =~ s/\s*$//gi;
+ my @names = split(', ', $authors[$count]);
+ $authors .= ',' if ($count);
+ $authors .= $names[1].' '.$names[0];
+
+ }
+ $self->{curInfo}->{authors} = $authors;
+ $self->{isAuthor} = 0;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0;
+ }
+ elsif ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} = $origtext;
+ $self->{curInfo}->{description} =~ s/^\s*//;
+ $self->{curInfo}->{description} =~ s/\s+/ /;
+ $self->{isDescription} = 0;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isISBN} = 1 if ($origtext =~ m/I\.S\.B\.N/i);
+ $self->{isFormat} = 1 if ($origtext =~ m/Acabamento/i);
+ $self->{isPublication} = 1 if ($origtext =~ m/Edição/i);
+ $self->{isPage} = 1 if ($origtext =~ m/Número de Paginas/i);
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isISBN})
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{isISBN} = 0;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isFormat} = 0;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{isPublication} = 0;
+ }
+ elsif ($self->{isPage})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPage} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 0,
+ edition => 0,
+ serie => 0,
+ };
+
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isAnalyse} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isPublication} = 0;
+ $self->{isPage} = 0;
+ $self->{isISBN} = 0;
+ $self->{isFormat} = 0;
+ $self->{isDescription} = 0;
+ $self->{isResult} = 0;
+ $self->{linkCount} = 0;
+ $self->{divInfo} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ my $inicio_res = index($html,'<div id="esquerdaPesquisa" style="display:none;">esquerdaPesquisa</div>');
+ if ( $inicio_res >= 0 )
+ {
+ $html = substr($html, $inicio_res);
+ }
+ my $fim_res = index($html,'<div id="direitaPesquisa" style="display:none;">direitaPesquisa</div>');
+ if ( $fim_res >= 0 )
+ {
+ $html = substr($html, 0, $fim_res);
+ }
+ $html = '' if ($inicio_res < 0);
+ }
+ else
+ {
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s|\s+|\+|;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.livrariasaraiva.com.br/pesquisaweb/pesquisaweb.dll/pesquisa?ORDEMN2=E&ESTRUTN1=0301&PALAVRASN1=".$word;
+ }
+ else
+ {
+ return "http://www.livrariasaraiva.com.br/pesquisaweb/pesquisaweb.dll/pesquisa?ORDEMN2=E&ESTRUTN1=0301&PALAVRASN1=".$word;
+ }
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.livrariasaraiva.com.br".$url;
+ }
+
+ sub getName
+ {
+ return "Saraiva";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'nirev';
+ }
+
+ sub getLang
+ {
+ return 'PT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm b/lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm
new file mode 100644
index 0000000..ee556dc
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCbooksAdlibrisCommon.pm
@@ -0,0 +1,331 @@
+package GCPlugins::GCbooks::GCbooksAdlibrisCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+
+{
+ package GCPlugins::GCbooks::GCbooksAdlibrisPluginsBase;
+
+ use base qw(GCPlugins::GCbooks::GCbooksPluginsBase);
+ use URI::Escape;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ( (($tagname eq 'div') && ($attr->{class} eq 'productTitleFormat'))
+ || (($tagname eq 'a') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_linkProductTitle'))
+ )
+ {
+ $self->{isFound} = 1 ;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ }
+ elsif (($tagname eq 'a') && ($attr->{id} =~ m/_hlkTitle/i) && ($self->{isFound} eq '0'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.adlibris.com/" . $self->{isLang} . "/" . $attr->{href};
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} =~ m/ctl00_main_frame_ctrlsearchhit_rptSearchHit_ctl/i) && ($attr->{id} =~ m/_Label2/i) && ($self->{isFound} eq '0'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} =~ m/ctl00_main_frame_ctrlsearchhit_rptSearchHit_ctl/i) && ($attr->{id} =~ m/_Label4/i) && ($self->{isFound} eq '0'))
+ {
+ $self->{isFormat} = 1 ;
+ }
+ }
+ else
+ {
+ if (($tagname eq 'h1'))
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif (($tagname eq 'li') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_liISBN13'))
+ {
+ $self->{isbnLevel} = 1 ;
+ }
+ elsif ($self->{isbnLevel} > 0)
+ {
+ if ($self->{isbnLevel} < 5)
+ {
+ $self->{isbnLevel}++ ;
+ }
+ else
+ {
+ $self->{isISBN} = 1 ;
+ $self->{isbnLevel} = 0 ;
+ }
+ }
+ elsif (($tagname eq 'a') && (($attr->{id} eq 'ctl00_main_frame_ctrlproduct_rptAuthor_ctl00_linkAuthor')) || ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_rptAuthor_ctl01_linkAuthor'))
+ {
+ $self->{isAuthor} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_linkPublisher'))
+ {
+ $self->{isPublisher} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblPublished'))
+ {
+ $self->{isPublication} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblPages'))
+ {
+ $self->{isPages} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblLanguage'))
+ {
+ $self->{isLanguage} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_lblFormat'))
+ {
+ $self->{isReliure} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescription'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'ctl00_main_frame_ctrlproduct_imgProduct_ProductImageNotLinked') && !($attr->{src} =~ m/\/noimage./i))
+ {
+ $self->{curInfo}->{cover} = $attr->{src} ;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{isFound} = 0 ;
+ $self->{inside}->{$tagname}--;
+ if (($self->{isDescription}) && ($tagname eq 'div'))
+ {
+ $self->{isDescription} = 0;
+ $self->{curInfo}->{description} =~ s/^Beskrivning://g ;
+ $self->{curInfo}->{description} =~ s/^Kuvaus://g ;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ my @array = split(/&/,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ my @nom_prenom = split(/,/,$element);
+ # Enleve les blancs en debut de chaine
+ $nom_prenom[0] =~ s/^\s+//;
+ $nom_prenom[1] =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $nom_prenom[0] =~ s/\s$+//;
+ $nom_prenom[1] =~ s/\s$+//;
+ if ($self->{itemsList}[$self->{itemIdx}]->{authors} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} = $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{authors} .= ", " . $nom_prenom[1] ." " . $nom_prenom[0];
+ }
+ }
+
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isFormat})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{format} = $origtext;
+ $self->{isFormat} = 0 ;
+ }
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0 ;
+ }
+ elsif ($self->{isAuthor})
+ {
+ $self->{curInfo}->{authors} .= $origtext;
+ $self->{curInfo}->{authors} .= ",";
+ $self->{isAuthor} = 0 ;
+ }
+ elsif ($self->{isISBN})
+ {
+ $self->{curInfo}->{isbn} = $origtext;
+ $self->{curInfo}->{isbn} =~ s/\s//g;
+ $self->{isISBN} = 0 ;
+ }
+ elsif ($self->{isPublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{isPublisher} = 0 ;
+ }
+ elsif ($self->{isPublication})
+ {
+ $self->{curInfo}->{publication} = $origtext;
+ $self->{curInfo}->{publication} =~ s/(\d\d\d\d)(\d\d)/01\/$2\/$1/g;
+ $self->{isPublication} = 0 ;
+ }
+ elsif ($self->{isPages})
+ {
+ $self->{curInfo}->{pages} = $origtext;
+ $self->{isPages} = 0 ;
+ }
+ elsif ($self->{isLanguage})
+ {
+ $self->{curInfo}->{language} = $origtext;
+ $self->{isLanguage} = 0 ;
+ }
+ elsif ($self->{isReliure})
+ {
+ $self->{curInfo}->{format} = $origtext;
+ $self->{isReliure} = 0 ;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext ;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ authors => 1,
+ publication => 0,
+ format => 1,
+ edition => 0,
+ };
+
+ $self->{isLang} = 'se';
+ $self->{isFound} = 0;
+ $self->{isTitle} = 0;
+ $self->{isAuthor} = 0;
+ $self->{isFormat} = 0;
+ $self->{isPublisher} = 0;
+ $self->{isISBN} = 0;
+ $self->{isPublicationAndPages} = 0;
+ $self->{isLangAndReliure} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<li>|\n* |g;
+ $html =~ s|<br>|\n|g;
+ $html =~ s|<br />|\n|g;
+ $html =~ s|<p>|\n|g;
+ $html =~ s|<b>||g;
+ $html =~ s|</b>||g;
+ $html =~ s|<i>||g;
+ $html =~ s|</i>||g;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'isbn')
+ {
+ return "http://www.adlibris.com/" . $self->{isLang} . "/searchresult.aspx?isbn=" . $word. "&amp%3BfromProduct=true";
+ }
+ else
+ {
+ return "http://www.adlibris.com/" . $self->{isLang} . "/searchresult.aspx?title=" . $word. "&amp%3BfromProduct=true";
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Adlibris";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'SW';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm b/lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm
new file mode 100644
index 0000000..bc75766
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCbooksAmazonCommon.pm
@@ -0,0 +1,65 @@
+package GCPlugins::GCbooks::GCbooksAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCbooks::GCbooksCommon;
+use GCPlugins::GCstar::GCAmazonCommon;
+
+{
+ package GCPlugins::GCbooks::GCbooksAmazonPluginsBase;
+
+ use base ('GCPlugins::GCbooks::GCbooksPluginsBase', 'GCPlugins::GCstar::GCPluginAmazonCommon');
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{codeField} = 'isbn';
+
+ return $self;
+ }
+
+ sub isEAN
+ {
+ my ($self, $value) = @_;
+
+ return $value =~ /^978/;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getEanField
+ {
+ return 'isbn';
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm b/lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm
new file mode 100644
index 0000000..a74e35a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCbooks/GCbooksCommon.pm
@@ -0,0 +1,61 @@
+package GCPlugins::GCbooks::GCbooksCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCbooks::GCbooksPluginsBase;
+
+ use base qw(GCPluginParser);
+ use HTML::Entities;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ $self->{searchType} = 'books';
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub getEanField
+ {
+ my $self = shift;
+ my $fields = $self->getSearchFieldsArray;
+ return 'isbn'
+ if $fields->[0] eq 'isbn';
+ return undef;
+ }
+
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm b/lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm
new file mode 100644
index 0000000..457194a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCbedetheque.pm
@@ -0,0 +1,398 @@
+package GCPlugins::GCcomics::GCbedetheque;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcomics::GCcomicsCommon;
+
+{
+
+ package GCPlugins::GCcomics::GCPluginbedetheque;
+
+ use LWP::Simple qw($ua);
+
+ use base qw(GCPlugins::GCcomics::GCcomicsPluginsBase);
+ sub getSearchUrl
+ {
+ my ( $self, $word ) = @_;
+ if ($self->{searchField} eq 'series')
+ {
+ return "http://www.bedetheque.com/index.php?R=1&RechSerie=$word";
+ }
+ elsif ($self->{searchField} eq 'writer')
+ {
+ return "http://www.bedetheque.com/index.php?R=1&RechAuteur=$word";
+ }
+ else
+ {
+ return '';
+ }
+
+ #return "http://www.bedetheque.com/index.php?R=1&RechTexte=$word";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series', 'writer'];
+ }
+
+ sub getItemUrl
+ {
+ my ( $self, $url ) = @_;
+ my @array = split( /#/, $url );
+ $self->{site_internal_id} = $array[1];
+
+ return $url if $url =~ /^http:/;
+ return "http://www.bedetheque.com/" . $url;
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "Bedetheque";
+ }
+
+ sub getAuthor
+ {
+ return 'Mckmonster';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless( $self, $class );
+
+ $self->{hasField} = {
+ series => 1,
+ title => 1,
+ volume => 1,
+ };
+
+ $self->{isResultsTable} = 0;
+ $self->{isCover} = 0;
+ $self->{itemIdx} = 0;
+ $self->{last_cover} = "";
+ $self->{site_internal_id} = "";
+ $self->{serie} = "";
+ $self->{synopsis} = "";
+ $self->{current_field} = "";
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ( $self, $html ) = @_;
+
+ $self->{parsingEnded} = 0;
+ $html =~ s/\s+/ /g;
+ $html =~ s/\r?\n//g;
+
+ if ( $self->{parsingList} )
+ {
+ if ( $html =~ m/(\d+\salbum\(s\).+)/ ) {
+
+ #keep only albums, no series or objects
+ $html = $1;
+ $self->{alternative} = 0;
+ } elsif ( $html =~ m/(<div id="albums_table">.+)/ ) {
+ $html = $1;
+ $self->{alternative} = 1;
+ }
+ }
+ else
+ {
+ $html =~ m/(<div class="box main reeditions">.+)/;
+
+ #$html =~ m/(<div class="album.+)/;
+ $html = $1;
+ $self->{isResultsTable} = 0;
+ $self->{parsingEnded} = 0;
+ $self->{isCover} = 0;
+ $self->{itemIdx}++;;
+ }
+
+ return $html;
+ }
+
+ sub start
+ {
+ my ( $self, $tagname, $attr, $attrseq, $origtext ) = @_;
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )
+ {
+ if ( !defined ($self->{alternative}) || (!$self->{alternative}) )
+ {
+ if ( ( $tagname eq "a" ) && ( $attr->{href} =~ m/album-/ ) )
+ {
+ $self->{isCollection} = 1;
+ $self->{itemIdx}++;
+
+ my $searchUrl = substr($attr->{href},0,index($attr->{href},".")).substr($attr->{href},index($attr->{href},"."));
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $searchUrl;
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $attr->{title};
+
+ #$self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ # "http://www.bedetheque.com/" . $attr->{href};
+ }
+ elsif ( $tagname eq "i" )
+ {
+ $self->{isSerie} = 1;
+ }
+ } else {
+ if ( ( $tagname eq "table" ) && ( $attr->{id} eq "albums_serie" ) ) {
+ $self->{inTable} = 1;
+ }
+ elsif ( ($self->{inTable}) && ( $tagname eq "td" ) && ( $attr->{class} eq "num" ) ) {
+ $self->{itemIdx}++;
+ $self->{isVolume} = 1;
+ }
+ elsif ( ($self->{inTable}) && ( $tagname eq "a" ) && ( $attr->{href} =~ m/serie-/ ) ) {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isTitle} = 1;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( $tagname eq "br" ) && ( $self->{startSynopsis} ) ) {
+
+ # This is a stop! for br ;-) and complementary of the p in the end section
+ # should be ( ( $tagname eq "p" ) || ( $tagname eq "br" ) )
+ $self->{isSynopsis} = 0;
+ $self->{startSynopsis} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ( $tagname eq "title")
+ {
+ $self->{isIssue} = 1;
+ $self->{isTitle} = 1;
+ }
+
+ if ( ( $self->{isCover} == 0 ) && ( $tagname eq "a" ) && ( $attr->{href} =~ m/Couvertures\/.*\.[jJ][pP][gG]/ ) )
+ {
+ $self->{curInfo}->{image} = 'http://www.bedetheque.com/' . $attr->{href};
+ $self->{isCover} = 1;
+ }
+ elsif ( ( $tagname eq "div") && ( $attr->{class} eq "titre" ) ) {
+ $self->{isVolume} = 1;
+ }
+ elsif ( ( $tagname eq "ul") && ( $attr->{class} eq "infos" ) ) {
+ $self->{isResultsTable} = 1;
+ }
+ elsif ( ( $self->{isResultsTable} ) && ( $tagname eq "label" ) ) {
+ $self->{current_field} = '';
+ $self->{openlabel} = 1;
+ }
+ elsif ( ( $tagname eq "div" ) && ( $attr->{class} eq "title" ) && ( !defined( $self->{curInfo}->{title} ) || ( $self->{curInfo}->{title} =~ /^$/ ) ) ) {
+ $self->{isTitle} = 1;
+ }
+ elsif ( ( $tagname eq "span" ) && ( $attr->{class} eq "type" ) ) {
+ $self->{isSerie} = 1;
+ }
+ elsif ( $tagname eq "em" ) {
+ $self->{isSynopsis} = 1;
+ }
+ elsif ( ( $tagname eq "a" ) && ( $attr->{class} eq "titre eo" ) ) {
+ if ( $attr->{title} =~ m/.+\s-(\d+)-\s.+/ ) {
+ $self->{curInfo}->{volume} = $1;
+ }
+ }
+ }
+ }
+
+ sub text
+ {
+ my ( $self, $origtext ) = @_;
+
+ return if ( $origtext eq " " );
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )
+ {
+ if ( !defined ($self->{alternative}) || (!$self->{alternative}) ) {
+ if ( $self->{isSerie} == 1)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $origtext;
+ $self->{isSerie} = 0;
+ }
+ else
+ {
+ if ($self->{isCollection} == 1)
+ {
+
+ #sometimes the field is "-vol-title", sometimes "--vol-title"
+ $origtext =~ s/-+/-/;
+ if ( $origtext =~ m/(.+)\s-(\d+)-\s(.+)/ ) {
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $2;
+ } elsif ( $origtext =~ /-/ ){
+ my @fields = split( /-/, $origtext );
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $fields[0];
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $fields[1];
+ }
+ $self->{isCollection} = 0;
+ }
+ }
+ } else {
+ if ( ( $self->{inTable} ) && ( $self->{isTitle} ) ) {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ } elsif ( ( $self->{inTable} ) && ( $self->{isVolume} ) ) {
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $origtext;
+ }
+ }
+ }
+ else
+ {
+ if ( $self->{isResultsTable} == 1 )
+ {
+ $origtext=~s/:\s+/:/;
+ my %td_fields_map = (
+ "Identifiant :" => '',
+ "Scénario :" => 'writer',
+ "Dessin :" => 'illustrator',
+ "Couleurs :" => 'colourist',
+ "Dépot légal :" => 'publishdate',
+ "Achevé impr. :" => 'printdate ',
+ "Estimation :" => 'cost',
+ "Editeur :" => 'publisher',
+ "Collection : " => 'collection',
+ "Taille :" => 'format',
+ "ISBN :" => 'isbn',
+ "Planches :" => 'numberboards'
+ );
+
+ if ( ( $self->{openlabel} ) && ( exists $td_fields_map{$origtext} ) ) {
+ $self->{current_field} = $td_fields_map{$origtext};
+ }
+ elsif ( defined ( $self->{current_field} ) && ( $self->{current_field} !~ /^$/ ) )
+ {
+ $origtext=~s/&nbsp;/ /g;
+ $origtext=~s/\s+$//g;
+ $self->{curInfo}->{$self->{current_field}} = $origtext;
+ $self->{current_field} = "";
+ }
+ }
+ elsif ( $self->{isVolume} )
+ {
+ $self->{curInfo}->{volume} = $origtext;
+ $self->{isVolume} = 0 ;
+ }
+
+ if ( $self->{isTitle} )
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ( $self->{isSerie} ) {
+ $self->{curInfo}->{series} = $origtext;
+ $self->{curInfo}->{series} =~s/^\s+//;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( ( $origtext =~ /Résumé de l'album :/ ) || ( $origtext =~ /Résumé de la série :/ ) ) ) {
+ $self->{startSynopsis} = 1;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( $self->{startSynopsis} ) ) {
+ $self->{curInfo}->{synopsis} .= " ".$origtext;
+ $self->{curInfo}->{synopsis} =~ s/^(\s)*//;
+ $self->{curInfo}->{synopsis} =~ s/(\s)*$//;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ( $self, $tagname ) = @_;
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )
+ {
+ if ( !defined ($self->{alternative}) || (!$self->{alternative}) ) {
+ if ( ( $tagname eq "i" ) && $self->{isCollection} == 1)
+ {
+
+ #end of collection, next field is title
+ $self->{isTitle} = 1;
+ $self->{isCollection} = 0;
+ }
+ } else {
+ if ( ( $self->{inTable} ) && ( $tagname eq "a" ) ) {
+ $self->{isTitle} = 0;
+ } elsif ( ( $self->{inTable} ) && ( $tagname eq "td" ) ) {
+ $self->{isVolume} = 0;
+ }
+ }
+ }
+ else
+ {
+ if ( ( $tagname eq "ul" ) && $self->{isResultsTable} == 1 )
+ {
+ $self->{isIssue} = 0;
+ $self->{isResultsTable} = 0;
+ }
+ elsif ( ( $self->{isResultsTable} ) && ( $tagname eq "label" ) ) {
+ $self->{openlabel} = 0;
+ }
+ elsif ( ( $self->{isTitle} ) && ( ( $tagname eq "div" ) || ( $tagname eq "h1" ) ) ) {
+ $self->{isTitle} = 0;
+ }
+ elsif ( ( $self->{isSerie} ) && ( $tagname eq "a" ) ) {
+ $self->{isSerie} = 0;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( $tagname eq "em" ) && ( !$self->{startSynopsis} ) ) {
+ $self->{isSynopsis} = 0;
+ $self->{startSynopsis} = 0;
+ }
+ elsif ( ( $self->{isSynopsis} ) && ( ( $tagname eq "p" ) || ( $tagname eq "br" ) ) && ( $self->{startSynopsis} ) ) {
+ $self->{isSynopsis} = 0;
+ $self->{startSynopsis} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ }
+ }
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm b/lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm
new file mode 100644
index 0000000..80b299b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCcomicbookdb.pm
@@ -0,0 +1,546 @@
+package GCPlugins::GCcomics::GCcomicbookdb;
+
+###################################################
+#
+# Copyright 2005-2012 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcomics::GCcomicsCommon;
+
+{
+
+ package GCPlugins::GCcomics::GCPlugincomicbookdb;
+
+ use LWP::Simple qw($ua);
+ use HTTP::Cookies;
+
+ use base qw(GCPlugins::GCcomics::GCcomicsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ if ($self->{pass} == 1)
+ {
+ # First pass, searching for series name
+ if ($tagname eq "h2")
+ {
+ $self->{isAtResults} = 1;
+ }
+ if ( ($tagname eq "a")
+ && ($self->{isAtResults})
+ && !($attr->{href} =~ m/ebay\.com/))
+ {
+ $self->{isCollection} = 1;
+ $self->{itemIdx}++;
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{nextUrl} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ }
+ else
+ {
+ # Second pass, or fetching item info
+ if ($self->{parsingList})
+ {
+
+ if ( ($tagname eq "tbody")
+ && ($self->{isResultsTable})
+ && ($self->{isSpecialIssue} == 1))
+ {
+ $self->{isSpecialIssue} = 2;
+ }
+ # Parsing issue list
+ if (($tagname eq "a") && ($self->{isResultsTable}))
+ {
+ if ($attr->{href} =~ m/javascript/)
+ {
+ # Multiple editions of the one issue, need to be
+ # handled differently
+ $self->{isSpecialIssue} = 1;
+ }
+ elsif ($attr->{href} =~ m/storyarc.php/)
+ {
+ # Prevent story arcs from populating lists
+ }
+ elsif ($self->{isSpecialIssue} == 1)
+ {
+ $self->{resultsTableColumn}++;
+ if ($self->{resultsTableColumn} == 1)
+ {
+ $self->{isSpecialIssueNo} = 1;
+ $self->{isIssue} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ elsif ($self->{resultsTableColumn} == 2)
+ {
+ $self->{isTitle} = 1;
+ $self->{isSpecialTitle} = 1;
+ }
+ }
+ elsif ($self->{isSpecialIssue} == 2)
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ $self->{isTitle} = 1;
+ }
+ else
+ {
+ $self->{resultsTableColumn}++;
+ if ($self->{resultsTableColumn} == 1)
+ {
+ $self->{isIssue} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ elsif ($self->{resultsTableColumn} == 2)
+ {
+ $self->{isTitle} = 1;
+ }
+ }
+ }
+ }
+ else
+ {
+ # Fetching item info
+ if ( ($tagname eq "span")
+ && ((index $attr->{class}, "page_headline") > -1))
+ {
+ $self->{insideHeadline} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($self->{insideHeadline})
+ && ($attr->{href} =~ m/title.php/))
+ {
+ $self->{insideName} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($self->{insideHeadline})
+ && ($attr->{href} =~ m/issue_number.php/))
+ {
+ $self->{insideNumber} = 1;
+ }
+ elsif (($tagname eq "a") && ($self->{nextisWriters}))
+ {
+ $self->{insideWriters} = 1;
+ $self->{insidePencillers} = 0;
+ $self->{insideColorists} = 0;
+ }
+ elsif (($tagname eq "a") && ($self->{nextisPencillers}))
+ {
+ $self->{insideWriters} = 0;
+ $self->{insidePencillers} = 1;
+ $self->{insideColorists} = 0;
+ }
+ elsif (($tagname eq "a") && ($self->{nextisColorists}))
+ {
+ $self->{insideWriters} = 0;
+ $self->{insidePencillers} = 0;
+ $self->{insideColorists} = 1;
+ }
+ elsif (($tagname eq "a") && ($attr->{href} =~ /imprint.php/))
+ {
+ $self->{insidePublisher} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($attr->{href} =~ /publisher.php/)
+ && (!$self->{curInfo}->{publisher}))
+ {
+ $self->{insidePublisher} = 1;
+ }
+ elsif (($tagname eq "a") && ($attr->{href} =~ /coverdate.php/))
+ {
+ $self->{insideCoverDate} = 1;
+ }
+ if ( ($tagname eq "span")
+ && ((index $attr->{class}, "test") > -1)
+ && ((index $attr->{class}, "page_subheadline") > -1))
+ {
+ $self->{insideSubHeadline} = 1;
+ }
+ elsif (($tagname eq "a")
+ && ($attr->{href} =~ /^graphics\/comic_graphics\//))
+ {
+ $self->{curInfo}->{image} =
+ "http://www.comicbookdb.com/" . $attr->{href};
+ }
+ elsif (($tagname eq "img")
+ && ($attr->{src} =~ /^graphics\/comic_graphics\//)
+ && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} =
+ "http://www.comicbookdb.com/" . $attr->{src};
+ }
+
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{isResultsTable})
+ {
+ if ($tagname eq "table")
+ {
+ $self->{isResultsTable} = 0;
+ }
+ elsif ($tagname eq "tr")
+ {
+ $self->{resultsTableColumn} = 0;
+ }
+ }
+
+ if ($tagname eq "tbody")
+ {
+ $self->{isSpecialIssue} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideHeadline} = 0;
+ $self->{insideSubHeadline} = 0;
+ $self->{insideNumber} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{isAtResults} = 0;
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 0;
+ $self->{insideWriters} = 0;
+ $self->{insidePencillers} = 0;
+ $self->{insideColorists} = 0;
+ }
+ elsif ($tagname eq "a")
+ {
+ $self->{insidePublisher} = 0;
+ $self->{insideCoverDate} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($origtext eq " ");
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isCollection})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{series} = $origtext;
+ $self->{isCollection} = 0;
+ }
+ if ($origtext eq "Cover Date")
+ {
+ $self->{isResultsTable} = 1;
+ }
+ if ($self->{isIssue})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} = $origtext;
+ $self->{isIssue} = 0;
+ }
+ if ($self->{isSpecialIssueNo})
+ {
+ $self->{specialIssueNo} = $origtext;
+ $self->{isSpecialIssueNo} = 0;
+ }
+ if ($self->{isTitle})
+ {
+ if ($self->{isSpecialIssue} == 2)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{volume} =
+ $self->{specialIssueNo};
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =
+ $self->{specialTitle} . $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ $self->{isTitle} = 0;
+ }
+ if ($self->{isSpecialTitle})
+ {
+ $self->{specialTitle} = $origtext;
+ $self->{isSpecialTitle} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{series} = $origtext;
+ #$self->{curInfo}->{series} =~ s/(\s\([0-9]*\))$//;
+ $self->{insideName} = 0;
+ }
+ elsif (($self->{insideNumber}) && ($origtext =~ /^\s*#(\d+)/))
+ {
+ # volume where #XX is in <A HREF... tag, '-' is not
+ $self->{curInfo}->{volume} = $1;
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /-\s#(\d+)/))
+ {
+ # volume where #XX isn't in <A HREF... tag
+ $self->{curInfo}->{volume} = $1;
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /-\s*TPB/))
+ {
+ # Trade paperback
+ $self->{curInfo}->{series} .= " TPB";
+
+ # Get volume number. Default to 1.
+ if ($origtext =~ /vol\. (\d+)/)
+ {
+ $self->{curInfo}->{volume} = $1;
+ }
+ else
+ {
+ $self->{curInfo}->{volume} = 1;
+ }
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /vol\. (\d+)/))
+ {
+ $self->{curInfo}->{volume} = $1;
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideHeadline}) && ($origtext =~ /-\s*Annual\s*(\d+)/))
+ {
+ # Annual volume where #XX isn't in <A HREF... tag
+ $self->{curInfo}->{volume} = $1;
+ $self->{curInfo}->{series} .= " Annual";
+ $self->{insideNumber} = 0;
+ }
+ elsif (($self->{insideSubHeadline}) && ($origtext =~ /\"(.*)\"/))
+ {
+ $self->{curInfo}->{title} = $1;
+
+ # Get printing or other note if present
+ if ($origtext =~ /\((.*)\)/)
+ {
+ $self->{curInfo}->{title} .= " (" . $1 . ")";
+ }
+ }
+ elsif ($self->{insidePublisher})
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{insidePublisher} = 0;
+ }
+ elsif ($origtext eq "Writer(s):")
+ {
+ $self->{nextisWriters} = 1;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 0;
+ }
+ elsif ($origtext eq "Penciller(s):")
+ {
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 1;
+ $self->{nextisColorists} = 0;
+ }
+ elsif ($origtext eq "Colorist(s):")
+ {
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 1;
+ }
+ elsif (($origtext eq "Letterer(s):")
+ || ($origtext eq "Inker(s):")
+ || ($origtext eq "Editor(s):")
+ || ($origtext eq "Cover Artist(s):")
+ || ($origtext eq "Characters:")
+ || ($origtext eq "Groups:"))
+ {
+ $self->{nextisWriters} = 0;
+ $self->{nextisPencillers} = 0;
+ $self->{nextisColorists} = 0;
+ }
+ elsif ($self->{insideWriters})
+ {
+ if ($self->{curInfo}->{writer} eq "")
+ {
+ $self->{curInfo}->{writer} = $origtext;
+ }
+ elsif ((index $self->{curInfo}->{writer}, $origtext) == -1)
+ {
+ $self->{curInfo}->{writer} .= ", ";
+ $self->{curInfo}->{writer} .= $origtext;
+ }
+
+ $self->{insideWriters} = 0;
+ }
+ elsif ($self->{insidePencillers})
+ {
+ if ($self->{curInfo}->{illustrator} eq "")
+ {
+ $self->{curInfo}->{illustrator} = $origtext;
+ }
+ elsif ((index $self->{curInfo}->{illustrator}, $origtext) == -1)
+ {
+ $self->{curInfo}->{illustrator} .= ", ";
+ $self->{curInfo}->{illustrator} .= $origtext;
+ }
+
+ $self->{insidePencillers} = 0;
+ }
+ elsif ($self->{insideColorists})
+ {
+ if ($self->{curInfo}->{colourist} eq "")
+ {
+ $self->{curInfo}->{colourist} = $origtext;
+ }
+ elsif ((index $self->{curInfo}->{colourist}, $origtext) == -1)
+ {
+ $self->{curInfo}->{colourist} .= ", ";
+ $self->{curInfo}->{colourist} .= $origtext;
+ }
+
+ $self->{insideColorists} = 0;
+ }
+ elsif ($origtext eq "Synopsis: ")
+ {
+ $self->{nextisSynopsis} = 1;
+ }
+ elsif ($self->{nextisSynopsis})
+ {
+ if ($origtext !~ /None entered./)
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{curInfo}->{synopsis} =~ s/^(\s)*//;
+ $self->{curInfo}->{synopsis} =~ s/(\s)*$//;
+ }
+ $self->{nextisSynopsis} = 0;
+ }
+ elsif ($self->{insideCoverDate})
+ {
+ $self->{curInfo}->{printdate} = $origtext;
+ $self->{curInfo}->{printdate} =~ s/^(\s)*//;
+
+ # Translate date string to date
+ $self->{curInfo}->{printdate} =
+ GCUtils::strToTime($self->{curInfo}->{printdate}, "%B %Y");
+ $self->{curInfo}->{publishdate} = $self->{curInfo}->{printdate};
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{ua}->cookie_jar(HTTP::Cookies->new);
+
+ bless($self, $class);
+
+ $self->{isResultsTable} = 0;
+ $self->{itemIdx} = 0;
+ $self->{resultsTableColumn} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ if ($self->{pass} == 1)
+ {
+ $self->{hasField} = {series => 1,};
+ }
+ else
+ {
+ $self->{hasField} = {
+ title => 1,
+ volume => 1,
+ };
+ }
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s/\+%28\d{4}%29$//; # strip year from end of $word (title)
+
+ # Grab the home page first, or the pages fetched are blank
+ # (who knows why... must be something funky with the website)
+ my $response = $ua->get('http://www.comicbookdb.com/');
+
+ return
+ "http://www.comicbookdb.com/search.php?form_search=$word&form_searchtype=Title";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url =~ /^http:/;
+
+ return "http://www.comicbookdb.com" . $url;
+ }
+
+ sub getNumberPasses
+ {
+ return 2;
+ }
+
+ sub getName
+ {
+ return "Comic Book DB";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm b/lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm
new file mode 100644
index 0000000..3b1229c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCcomicsCommon.pm
@@ -0,0 +1,49 @@
+package GCPlugins::GCcomics::GCcomicsCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCcomics::GCcomicsPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['series'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm b/lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm
new file mode 100644
index 0000000..d05d0c8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCcomics/GCmangasanctuary.pm
@@ -0,0 +1,503 @@
+package GCPlugins::GCcomics::GCmangasanctuary;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcomics::GCcomicsCommon;
+
+{
+
+ package GCPlugins::GCcomics::GCPluginmangasanctuary;
+
+ use LWP::Simple qw($ua);
+
+ use base qw(GCPlugins::GCcomics::GCcomicsPluginsBase);
+
+ sub start
+ {
+ my ( $self, $tagname, $attr, $attrseq, $origtext ) = @_;
+ if ( $self->{parsingList} )# partie en rapport à la page de résultats
+ {
+
+ #The interesting part to parse looks like this :
+ #<li class="row1"><a href="/manhwa-rebirth-vol-2-simple-s1397-p682.html">Rebirth #2</a> <span>Manhwa</span></li>
+ if ( $tagname eq "a" )
+ {
+ $self->{isDebut} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = "http://www.manga-sanctuary.com" . $attr->{href};
+ $attr->{href} =~ m/\/(.*?)-.*-vol-\d+-(.*?)-s\d+-p\d+.html/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{type} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{format} = $2;
+ }
+ }
+ else# partie en rapport à la page de l'élément
+ {
+
+ #Commencer par récupérer l'image
+ #<a target="_blank" href="/couvertures/big/rebirth1gd.jpg"><img src="/couvertures/rebirth1gd.jpg"></a>
+ if ( ( $tagname eq "a" ) && ( $attr->{href} =~ m/couvertures.*\.[jJ][pP][gG]/ ) )
+ {
+ my $response = $ua->get("http://www.manga-sanctuary.com" . $attr->{href});
+ if ($response->content_type =~ m/text\/html/) #la grande image n'existe pas
+ {
+ $self->{downloadThumbnail} = 1;
+ }
+ else#la grande image existe
+ {
+ $self->{curInfo}->{image} = "http://www.manga-sanctuary.com" . $attr->{href};
+ }
+ }
+ if ( ( $tagname eq "img" ) && ( $attr->{src} =~ m/couvertures.*\.[jJ][pP][gG]/ ) && ($self->{downloadThumbnail} == 1) )
+ {
+ $self->{curInfo}->{image} = "http://www.manga-sanctuary.com" . $attr->{src};
+ $self->{downloadThumbnail} =0;
+ }
+ #Code général détection dt et dd
+ if ( $tagname eq "dt")
+ {
+ $self->{tagDTdetected} =1;
+ }elsif ( $tagname eq "dd")
+ {
+ $self->{tagDDdetected} =1;
+ }elsif ( $tagname eq "h3")
+ {
+ $self->{tagH3detected} =1;
+ }elsif ( $tagname eq "p")
+ {
+ $self->{tagPdetected} =1;
+ }elsif ( $tagname eq "a")
+ {
+ $self->{tagAdetected} =1;
+ }
+ #Code pour différencier les types de titres (original /français)
+ if ( ( $tagname eq "img") && ( $attr->{src} =~ m/\/design\/img\/flags/ ) && ($self->{titleDetected} == 1) )
+ {
+ $attr->{src} =~ m/\/(\d*)\.png$/;
+ if ($1 == 77)
+ {
+ $self->{titreFrancais} = 1;
+ }
+ else
+ {
+ $self->{titreFrancais} = 0;
+ }
+ }
+ #Code pour récupérer la notation
+ #<ul id="notation">\nStaff MS:<img src="/design/img/9.gif" title="8.5/10"/></ul>
+ if ( ( $tagname eq "ul") && ( $attr->{id} =~ m/notation/ ) )
+ {
+ $self->{notationDetected} = 1;
+ }elsif ( ( $tagname eq "img") && ( $self->{notationDetected} == 1 ) )
+ {
+ $attr->{title} =~ m/^(\d*\.?\d*)\/10/;
+ $self->{curInfo}->{rating} = $1;
+ $self->{notationDetected} = 0;
+
+ #Récupération du format dans l'adresse de la page.
+ #http://www.manga-sanctuary.com/manga-duds-hunt-vol-1-simple-s1169-p1477.html
+ #Peut être fait dès que webPage est renseigné, placé ici pour être sûr de n'être lancé qu'une seule fois.
+ $self->{curInfo}->{webPage} =~ m/vol-\d+-(.*?)-s\d+-p\d+\.html/;
+ $self->{curInfo}->{format} = $1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ( $self, $tagname ) = @_;
+ if ( $self->{parsingList} )# partie en rapport à la page de résultats
+ {
+ if ( ( $tagname eq "a" ) && $self->{isFin} == 1 )
+ {
+ #end of collection, next field is title
+ $self->{isFin} = 0;
+ }
+ }
+ else# partie en rapport à la page de l'élément
+ {
+ #Code général détection dt et dd
+ if ( $tagname eq "dt")
+ {
+ $self->{tagDTdetected} =0;
+ }elsif ( $tagname eq "dd")
+ {
+ $self->{tagDDdetected} =0;
+ #RAZ en cas de champ vide
+ $self->{titleDetected} =0;
+ $self->{titreFrancais} = 1;
+ $self->{publisherDetected} =0;
+ $self->{collectionDetected} =0;
+ $self->{publishdateDetected} =0;
+ $self->{costDetected} =0;
+ $self->{typeDetected} =0;
+ $self->{categoryDetected} =0;
+ $self->{genresDetected} =0;
+ $self->{scenaristeDetected} =0;
+ $self->{dessinateurDetected} =0;
+ }elsif ( $tagname eq "div")#Le code à récupérer pour un titre h3 donné se trouve après la balise <\h3> donc on ne peut pas l'utiliser.
+ {
+ $self->{tagH3detected} =0;
+ }elsif ( $tagname eq "p")
+ {
+ $self->{tagPdetected} =0;
+ #RAZ en cas de champ vide
+ $self->{synopsisDetected} =0;
+ $self->{critiquesDetected} =0;
+ $self->{reactionsDetected} =0;
+ }elsif ( $tagname eq "a")
+ {
+ $self->{tagAdetected} =0;
+ }elsif ( $tagname eq "ul" )
+ {
+ $self->{notationDetected} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ( $self, $origtext ) = @_;
+
+ return if ( $origtext eq " " );
+
+ return if ( $self->{parsingEnded} );
+
+ if ( $self->{parsingList} )# partie en rapport à la page de résultats
+ {
+ if ( $self->{isDebut} )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isDebut} = 0;
+ $self->{isFin} = 1;
+ }
+ }
+ else# partie en rapport à la page de l'élément
+ {
+
+ if ( $self->{tagDTdetected} == 1 )
+ {
+ #Title
+ #<dt><label>Titre <img src="/design/img/flags/112.png"></label></dt><dd>&#37507;&#22818; Last Order </dd><dt><label>Titre <img src="/design/img/flags/77.png"></label></dt><dd>Gunnm Last Order</dd>
+ if ($origtext =~ m/^Titre/)
+ {
+ $self->{titleDetected} =1;
+ }
+ #Volume
+ #<dt><label>Volume:</label></dt>\n<dd>1/23</dd>
+ elsif ($origtext =~ m/^Volume/)
+ {
+ $self->{volumeDetected} =1;
+ }
+ #Publisher
+ #<dt><label>Editeur:</label></dt>\n<dd><a href="http://www.manga-sanctuary.com/bdd/editeurs/6-glenat.html" title="Glénat">Glénat</a></dd>
+ elsif ($origtext =~ m/^Editeur/)
+ {
+ $self->{publisherDetected} =1;
+ }
+ #collection
+ #<dt><label>Label:</label></dt>\n<dd>Kana Shonen</dd>
+ elsif ($origtext =~ m/^Label/)
+ {
+ $self->{collectionDetected} =1;
+ }
+ #PublishDate
+ #<dt><label>Date de sortie:</label></dt>\n<dd>31/10/2002</dd>
+ elsif ($origtext =~ m/^Date de sortie/)
+ {
+ $self->{publishdateDetected} =1;
+ }
+ #cost
+ #<dt><label>Prix:</label></dt>\n<dd>6.5 EUR</dd>
+ elsif ($origtext =~ m/^Prix/)
+ {
+ $self->{costDetected} =1;
+ }
+ #type
+ #<dt><label>Type:</label></dt>\n<dd>Manga</dd>
+ elsif ($origtext =~ m/^Type/)
+ {
+ $self->{typeDetected} =1;
+ }
+ #category
+ #<dt><label>Catégorie:</label></dt>\n<dd>Seinen</dd>
+ elsif ($origtext =~ m/^Catégorie/)
+ {
+ $self->{categoryDetected} =1;
+ }
+ #Genres [NOTE: pas d'accès aux tags alors je le mets dans synopsis]
+ #<dt><label>Genres:</label></dt>\n<dd>Action, SF</dd>
+ elsif ($origtext =~ m/^Genres/)
+ {
+ $self->{genresDetected} =1;
+ }
+ #scenariste [de la fiche série]
+ #<dt><label>Scénariste</label></dt>
+ elsif ($origtext =~ m/^Scénariste/)
+ {
+ $self->{scenaristeDetected} =1;
+ }
+ #dessinateur [de la fiche série]
+ #<dt><label>Dessinateur</label></dt>
+ elsif ($origtext =~ m/^Dessinateur/)
+ {
+ $self->{dessinateurDetected} =1;
+ }
+ }
+
+ if ( $self->{tagDDdetected} == 1 )
+ {
+ if ($self->{titleDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ if ($self->{titreFrancais} == 1)
+ {
+ #$self->{curInfo}->{title} = $1; #Je désactive le titre car c'est le même que la série
+ $self->{curInfo}->{series} = $1;
+ }
+ else
+ {
+ $self->{curInfo}->{synopsis} .= "Titre original :".$1."\n";
+ }
+ $self->{titleDetected} = 0;
+ }
+ elsif ($self->{volumeDetected} == 1)
+ {
+ $origtext =~ m/^(\d*)\//;
+ $self->{curInfo}->{volume} = $1;
+ $self->{volumeDetected} =0;
+ }
+ elsif ($self->{publisherDetected} == 1)
+ {
+ $self->{curInfo}->{publisher} = $origtext;
+ $self->{publisherDetected} =0;
+ }
+ elsif ($self->{collectionDetected} == 1)
+ {
+ $self->{curInfo}->{collection} = $origtext;
+ $self->{collectionDetected} =0;
+ }
+ elsif ($self->{publishdateDetected} == 1)
+ {
+ $self->{curInfo}->{publishdate} = $origtext;
+ $self->{publishdateDetected} =0;
+ }
+ elsif ($self->{costDetected} == 1)
+ {
+ $origtext =~ m/^\s*(\d*\.\d*)/;
+ $self->{curInfo}->{cost} = $1;
+ $self->{costDetected} =0;
+ }
+ elsif ($self->{typeDetected} == 1)
+ {
+ $self->{curInfo}->{type} = $origtext;
+ $self->{typeDetected} =0;
+ }
+ elsif ($self->{categoryDetected} == 1)
+ {
+ $self->{curInfo}->{category} = $origtext;
+ $self->{categoryDetected} =0;
+ }
+ elsif ($self->{genresDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ $self->{curInfo}->{synopsis} .= "Genres : ".$1."\n\n";
+ $self->{genresDetected} =0;
+ }
+ }
+ if ( $self->{tagH3detected} == 1 )
+ {
+ #Code détection synopsis
+ # <h3><span>Synopsis</span></h3>
+ if ($origtext =~ m/^Synopsis/)
+ {
+ $self->{synopsisDetected} =1;
+ $self->{curInfo}->{synopsis} .= "Synopsis :\n"
+ }
+ #Code détection critiques
+ #<h3>Critiques du staff</h3>
+ elsif ($origtext =~ m/^Critiques du staff/)
+ {
+ $self->{critiquesDetected} =1;
+ $self->{curInfo}->{synopsis} .= "\n\nCritiques du staff :\n";
+ }
+ #Réactions désactivées car pas super intéressant
+ # #Code détection reactions
+ # #<h3>Réactions</h3>
+ # elsif ($origtext =~ m/^Réactions/)
+ # {
+ # $self->{reactionsDetected} =1;
+ # $self->{curInfo}->{synopsis} .= "\n\nRéactions :\n";
+ # }
+ }
+ if ( $self->{tagPdetected} == 1 )
+ {
+ if ($self->{synopsisDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ $self->{curInfo}->{synopsis} .= $1."\n";
+ $self->{genresDetected} =0;
+ }elsif ($self->{critiquesDetected} == 1)
+ {
+ $origtext =~ m/^\s*(.*?)\s*$/;
+ $self->{curInfo}->{synopsis} .= $1."\n";
+ $self->{genresDetected} =0;
+ }
+ #Réactions désactivées car pas super intéressant
+ # elsif ($self->{reactionsDetected} == 1)
+ # {
+ # $origtext =~ m/^\s*(.*?)\s*$/;
+ # $self->{curInfo}->{synopsis} .= $1."\n";
+ # $self->{genresDetected} =0;
+ # }
+ }
+ if ( $self->{tagAdetected} == 1 )
+ {
+ if ($self->{scenaristeDetected} == 1)
+ {
+ $self->{curInfo}->{writer} = $origtext;
+ $self->{scenaristeDetected} =0;
+ }
+ elsif ($self->{dessinateurDetected} == 1)
+ {
+ $self->{curInfo}->{illustrator} = $origtext;
+ $self->{dessinateurDetected} =0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless( $self, $class );
+#pour la recherche:
+# $self->{hasField} = {
+# series => 1,
+# title => 1,
+# volume => 1,
+# };
+ $self->{hasField} = {
+ title => 1,
+ type => 1,
+ format => 1,
+ };
+
+
+
+ $self->{itemIdx} = 0;
+ $self->{downloadThumbnail} = 0;
+ $self->{tagDTdetected} =0;
+ $self->{tagDDdetected} =0;
+ $self->{tagH3detected} =0;
+ $self->{tagPdetected} =0;
+ $self->{titleDetected} =0;
+ $self->{titreFrancais} = 1;#défaut francais
+ $self->{publisherDetected} =0;
+ $self->{collectionDetected} =0;
+ $self->{publishdateDetected} =0;
+ $self->{costDetected} =0;
+ $self->{typeDetected} =0;
+ $self->{categoryDetected} =0;
+ $self->{genresDetected} =0;
+ $self->{synopsisDetected} =0;
+ $self->{critiquesDetected} =0;
+ $self->{reactionsDetected} =0;
+ $self->{scenaristeDetected} =0;
+ $self->{dessinateurDetected} =0;
+ $self->{notationDetected} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ( $self, $html ) = @_;
+
+ if ( $self->{parsingList} ) # partie en rapport à la page de résultats
+ {
+ #keep only Volumes
+ $html =~ m/<h3>Volumes\s\(\d+\)<\/h3>\s*(.*?)\s*<h3>Critiques/s;
+ $html = $1;
+ }
+ else # partie en rapport à la page de l'élément
+ {
+ $html =~ m/<div id="contenu">\s*(<ul id="menu_fiche">\s*<li><a href="(http:\/\/www.manga-sanctuary.com.*?)">.*?)\s*<h3><span>Mes actions<\/span><\/h3>/s;
+ $html = $1;
+
+ #récupération des infos de la fiche série
+ my $response = $ua->get($2);
+ $response->content =~ m/<h3><span>Staff<\/span><\/h3>\s*(.*?<\/dl>)/s;
+
+ $html .= "\n\n <fiche série>\n\n".$1;
+
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ( $self, $word ) = @_;
+ $word =~ s/\+/ /g;
+ return ('http://www.manga-sanctuary.com/recherche/tout/', ['keywords' => $word]);
+
+ }
+
+ sub getItemUrl
+ {
+ my ( $self, $url ) = @_;
+ #Je fais le pari que cette partie n'est pas utilisée
+ # my @array = split( /#/, $url );
+ # $self->{site_internal_id} = $array[1];
+
+ return $url if $url =~ /^http:/;
+ return "http://www.manga-sanctuary.com" . $url;
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "Manga-Sanctuary";
+ }
+
+ sub getAuthor
+ {
+ return 'Biggriffon';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm b/lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm
new file mode 100644
index 0000000..604fdc4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAlapage.pm
@@ -0,0 +1,267 @@
+package GCPlugins::GCfilms::GCAlapage;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAlapage;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{class} eq "tx12noirbold")
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} eq "acteurs")
+ {
+ $self->{isActors} = 1;
+ }
+ elsif ($attr->{class} eq "realisateur")
+ {
+ $self->{isDirector} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /^\/resize\.php\?ref=([0-9]*)/)
+ {
+ $self->{curInfo}->{image} =
+ "http://imgdata.echo.fr/disque_l?v$1r.jpg";
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideName} = 1 if $attr->{style} eq "color:#414B55;";
+ $self->{insideActors} = 1 if $attr->{class} eq "tx11gris";
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideSynopsis} = 1 if $attr->{align} eq "justify";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"actors"} .=
+ $self->{itemsList}[ $self->{itemIdx} ]->{"actors"}
+ ? ', ' . $self->capWord($origtext)
+ : $self->capWord($origtext);
+ $self->{isActors} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"director"} =
+ $self->capWord($origtext);
+ $self->{isDirector} = 0;
+ }
+
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $self->capWord($origtext);
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $origtext =~ s/avec : (.*) - (?:[^-]* )?DVD/$1/;
+ $origtext =~ s/ - /, /g;
+ $self->{curInfo}->{actors} = $self->capWord($origtext)
+ if !$self->{curInfo}->{actors};
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\[br\]/\n/g;
+ $self->{curInfo}->{synopsis} .= $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($origtext =~ m/R.*alisateur :/)
+ {
+ $origtext =~ s/R.*alisateur(?: :)?(.*)/$1/;
+ $origtext =~ s/ - /, /g;
+ $self->{curInfo}->{director} = $self->capWord($origtext)
+ if !$self->{curInfo}->{director};
+ }
+ elsif ($origtext =~ m/Genre :/)
+ {
+ $origtext =~ s/Genre :(.*)/$1/;
+ $origtext = $self->capWord($origtext);
+ $origtext =~ s/ \/ /,/g;
+ $origtext =~ s/,Video//g;
+ $self->{curInfo}->{genre} = $origtext if !$self->{curInfo}->{genre};
+ }
+ elsif ($origtext =~ m/Année du film :/)
+ {
+ $origtext =~ s/Année du film :(.*)/$1/;
+ $self->{curInfo}->{date} = $origtext if !$self->{curInfo}->{date};
+ }
+ elsif ($origtext =~ m/Durée du film/)
+ {
+ $origtext =~ s/Durée du film(.*)/$1/;
+ $self->{curInfo}->{time} = $origtext if !$self->{curInfo}->{time};
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #Fix for character-encoding:
+ $html =~ s/Â’/'/g;
+ $html =~ s/Â…/\.\.\./g;
+ #'
+
+#<<< keep perltidy away from these lines
+ $html =~ s/<br>/\[br\]/gi;
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/<u>|<\/u>|<b>|<\/b>|<i>|<\/i>//gi;
+ $html =~ s/<SPAN class="(?:tx12gris6|tx12noir)">([^<]*)<\/SPAN>/$1/gi;
+ $html =~ s|<A href="/-/Liste/DVD/mot_real_nomprenom=.*?\?id=[0-9]*&donnee_appel=ALAPAGE" class="roll">([^<]*)</A>|<div class="realisateur">$1</div>|gi;
+ $html =~ s|<A href="/-/Liste/DVD/mot_art_nomprenom=.*?\?id=[0-9]*&donnee_appel=ALAPAGE" class="roll">([^<]*)</A>|<div class="acteurs">$1</div>|gi;
+ $html =~ s/<A href="http\:\/\/www\.alapage\.com\/-\/Liste\/DVD\/mot_(?:art_nomprenom|real_nomprenom|gen_libelle)=[^\/]*\/\?id=[0-9]*&donnee_appel=ALAPAGE[^"]*?" class="roll">([^<]*)<\/A>/$1/gi;
+ $html =~ s|<A .*?mot_gen_libelle=.*?>(.*?)</A>|$1|gi;
+ $html =~ s/<TD valign="top" class="tx12noir[^"]*">([^<]*)<\/TD>[^<]*<TD>([^<]*)<\/TD>/<td>$1 $2<\/td>/gi;
+ $html =~ s/<td class="tx12grisbold" align="center" bgcolor="\#E6E6E8">([^<]*)<\/td>[^<]*<TD width="2"><IMG src="\/turbo\/templates\/img\/pix\.gif" width="2" height="25" border="0" alt=""><\/TD>[^<]*<td class="tx10noir" align="center" bgcolor="\#F4F4F6" colspan="3">([0-9]* mn)<\/td>/<td>$1 $2<\/td>/gi;
+#>>>
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://alapage.com/mx/?type=41&tp=L&fulltext=" . $word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://alapage.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Alapage.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm b/lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm
new file mode 100644
index 0000000..e8117c5
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAllmovie.pm
@@ -0,0 +1,431 @@
+package GCPlugins::GCfilms::GCAllmovie;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAllmovie;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq "a") && ($self->{isFilm}))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{isFilm} = 0;
+ }
+ if ($tagname eq "td")
+ {
+ if ($attr->{style} =~ m/284px/)
+ {
+ $self->{isFilm} = 1;
+ }
+ elsif ($attr->{style} =~ m/70px/)
+ {
+ $self->{isYear} = 1;
+ }
+ elsif ($attr->{style} =~ m/190px/)
+ {
+ $self->{isDirector} = 1;
+ }
+ }
+ elsif ($tagname eq "tr")
+ {
+ $self->{isFound} = 1;
+ }
+ elsif ($tagname eq "title")
+ {
+ $self->{insideHTMLtitle} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq "span") && ($attr->{class} eq "title"))
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif (
+ ($tagname eq "div")
+ && ( ($attr->{id} eq "left-sidebar-title")
+ || ($attr->{id} eq "left-sidebar-title-small"))
+ )
+ {
+ $self->{insideLeftSidebarTitle} = 1;
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/sql=B/)
+ {
+ $self->{insideActors} = 1;
+ }
+ elsif ($self->{insideDirectorList})
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($self->{insideYearRuntime})
+ {
+ $self->{insideYear} = 1;
+ $self->{insideYearRuntime} = 0;
+ }
+ elsif ($self->{insideCountriesRating})
+ {
+ $self->{insideCountry} = 1;
+ $self->{insideCountriesRating} = 0;
+ }
+ elsif ($self->{nextIsSeries})
+ {
+ $self->{insideSeries} = 1;
+ $self->{nextIsSeries} = 0;
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /http\:\/\/image\.allmusic\.com/)
+ {
+ $self->{curInfo}->{image} = ($attr->{src});
+ }
+ elsif ($self->{insideRatingStars})
+ {
+ $attr->{title} =~ /([\d\.]+) Stars/;
+ $self->{curInfo}->{ratingpress} = $1 * 2;
+ $self->{insideRatingStars} = 0;
+ }
+ }
+ elsif ($tagname eq "li")
+ {
+ if ($self->{insideGenreList})
+ {
+ $self->{insideGenre} = 1;
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ( ($self->{insideAKA})
+ && ($attr->{class} =~ m/formed-sub/))
+ {
+ $self->{insideOtherTitles} = 1;
+ }
+ elsif ($self->{nextIsRating})
+ {
+ $self->{insideRating} = 1;
+ $self->{nextIsRating} = 0;
+ }
+ elsif ($self->{nextIsRuntime})
+ {
+ $self->{insideTime} = 1;
+ $self->{nextIsRuntime} = 0;
+ }
+ elsif ($attr->{colspan} == 2)
+ {
+ if ($attr->{class} eq "large-list-title")
+ {
+ }
+ else
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ elsif ($attr->{class} eq "rating-stars")
+ {
+ $self->{insideRatingStars} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "td")
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ if ($tagname eq "div")
+ {
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ if ($tagname eq "table")
+ {
+ $self->{insideGenreList} = 0;
+ $self->{insideAKA} = 0;
+ $self->{curInfo}->{original} =~ s/(, )$//;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if ((length($origtext) == 0) || ($origtext eq " "));
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if (($self->{insideHTMLtitle}))
+ {
+ if ($origtext !~ m/Results/)
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ $self->{insideHTMLtitle} = 0;
+ }
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext
+ if $origtext =~ m/^[0-9]{4}?/;
+ $self->{isYear} = 0;
+ }
+ if ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ if ($self->{isInfo})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ m|\(([0-9]*)(/I+)?\)|;
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideLeftSidebarTitle})
+ {
+ if ($origtext eq "Genres")
+ {
+ $self->{insideGenreList} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "Director")
+ {
+ $self->{insideDirectorList} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "Year")
+ {
+ $self->{insideYearRuntime} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "Countries")
+ {
+ $self->{insideCountriesRating} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ elsif ($origtext eq "AKA")
+ {
+ $self->{insideAKA} = 1;
+ $self->{insideLeftSidebarTitle} = 0;
+ }
+ }
+ elsif ($origtext =~ /Is part of the series:$/)
+ {
+ $self->{nextIsSeries} = 1;
+ }
+ if ($self->{insideActors})
+ {
+ $self->{curInfo}->{actors} .= $origtext . ', '
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{insideActors} = 0;
+ }
+
+ if ($self->{insideYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideYear} = 0;
+ $self->{nextIsRuntime} = 1;
+ }
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $self->{curInfo}->{genre} .= $self->capWord($origtext) . ',';
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ $self->{insideDirectorList} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideCountry})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideCountry} = 0;
+ $self->{nextIsRating} = 1;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{curInfo}->{time} =~ s/.[0-9]*?://;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideRating})
+ {
+ $self->{curInfo}->{age} = 1
+ if ($origtext eq 'Unrated') || ($origtext eq 'Open');
+ $self->{curInfo}->{age} = 2
+ if ($origtext eq 'G') || ($origtext eq 'Approved');
+ $self->{curInfo}->{age} = 5
+ if ($origtext eq 'PG') || ($origtext eq 'M') || ($origtext eq 'GP');
+ $self->{curInfo}->{age} = 13 if $origtext eq 'PG13';
+ $self->{curInfo}->{age} = 17 if $origtext eq 'R';
+ $self->{curInfo}->{age} = 18
+ if ($origtext eq 'NC17') || ($origtext eq 'X');
+ $self->{insideRating} = 0;
+ }
+ elsif ($self->{insideOtherTitles})
+ {
+ $self->{tempOriginal} = $origtext;
+ $self->{tempOriginal} =~ s/\s*$//;
+ $self->{tempOriginal} =~ s/^\s*//;
+
+ $self->{curInfo}->{original} .= $self->{tempOriginal} . ', ';
+ $self->{insideOtherTitles} = 0;
+ }
+ elsif ($self->{insideSeries})
+ {
+ $self->{curInfo}->{serie} = $origtext;
+ $self->{curInfo}->{serie} =~ s/( \[.*\])//;
+ $self->{insideSeries} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $wordFiltered = $word;
+
+ # Allmovie doesn't return correct results if searching with a prefix like 'the'
+ $wordFiltered =~ s/^(the|a)?[+\s]+[^ a-zA-Z0-9]*\s*//i;
+# return ('http://allmovie.com/search/all', ['q' => $wordFiltered,'submit' => 'SEARCH']);
+ return ('http://allmovie.com/search/all/' . $wordFiltered);
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url =~ /^http:/;
+ return "http://allmovie.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Allmovie";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm b/lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm
new file mode 100644
index 0000000..db37774
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAllocine.pm
@@ -0,0 +1,403 @@
+package GCPlugins::GCfilms::GCAllocine;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAllocine;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{insideResults} eq 1)
+ {
+ if ( ($tagname eq "a")
+ && ($attr->{href} =~ /^\/film\/fichefilm_gen_cfilm=/)
+ && ($self->{isMovie} eq 0))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 0;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($tagname eq "td") && ($self->{isMovie} eq 1))
+ {
+ $self->{isMovie} = 2;
+ }
+ elsif (($tagname eq "a") && ($self->{isMovie} eq 2))
+ {
+ $self->{isMovie} = 3;
+ }
+ elsif (($tagname eq "br") && ($self->{isMovie} eq 3))
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/^\s*//;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/\s*$//;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =~ s/\s+/ /g;
+ $self->{isMovie} = 4;
+ }
+ elsif (($tagname eq "span")
+ && ($attr->{class} eq "fs11")
+ && ($self->{isMovie} eq 4))
+ {
+ $self->{isInfo} = 1;
+ $self->{isMovie} = 0;
+ }
+ elsif (($tagname eq "br") && ($self->{isInfo} eq 1))
+ {
+ $self->{isInfo} = 2;
+ }
+ elsif (($tagname eq "br") && ($self->{isInfo} eq 2))
+ {
+ $self->{isInfo} = 3;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "div") && ($attr->{class} eq "poster"))
+ {
+ $self->{insidePicture} = 1;
+ }
+ elsif (($tagname eq "img") && ($self->{insidePicture} eq 1))
+ {
+ my $src = $attr->{src};
+ if (!$self->{curInfo}->{image})
+ {
+ if ($src =~ /r_160_240/)
+ {
+ $self->{curInfo}->{image} = $src;
+ }
+ else
+ {
+ $self->{curInfo}->{image} = "empty";
+ }
+ }
+ }
+ elsif ($tagname eq "h1")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif (($tagname eq "span") && ($self->{insideDate} eq 1))
+ {
+ $self->{insideDate} = 2;
+ }
+ elsif (($tagname eq "span") && ($attr->{itemprop} eq "duration"))
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif (($tagname eq "span") && ($self->{insideDirector} eq 1))
+ {
+ $self->{insideDirector} = 2;
+ }
+ elsif (($tagname eq "a") && ($self->{insideActor} eq 1))
+ {
+ $self->{insideActor} = 2;
+ }
+ elsif (($tagname eq "span") && ($self->{insideGenre} eq 1))
+ {
+ $self->{insideGenre} = 2;
+ }
+ elsif (($tagname eq "span") && ($self->{insideCountry} eq 1))
+ {
+ $self->{insideCountry} = 2;
+ }
+ elsif (($tagname eq "span") && ($attr->{class} eq "note") && ($self->{insidePressRating} eq 1))
+ {
+ $self->{insidePressRating} = 2;
+ }
+ elsif (($tagname eq "div") && ($attr->{class} eq "breaker"))
+ {
+ $self->{insidePressRating} = 0;
+ }
+ elsif (($tagname eq "p") && ($attr->{itemprop} eq "description"))
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif (($tagname eq "td") && ($self->{insideOriginal} eq 1))
+ {
+ $self->{insideOriginal} = 2;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "li")
+ {
+ $self->{insideDirector} = 0;
+ $self->{insideActor} = 0;
+ $self->{insideGenre} = 0;
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideCountry} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideActor} = 0;
+ }
+ elsif ($tagname eq "th")
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($tagname eq "table")
+ {
+ $self->{insideResults} = 0;
+ }
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if (($origtext =~ m/(\d+) r..?sultats? trouv..?s? dans les titres de films/) && ($1 > 0))
+ {
+ $self->{insideResults} = 1;
+ }
+ if ($self->{isMovie} eq 3)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} .= $origtext;
+ }
+ if ($self->{isInfo} eq 1)
+ {
+ if ($origtext =~ /\s*([0-9]{4})/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ }
+ }
+ elsif ($self->{isInfo} eq 2)
+ {
+ if ($origtext =~ /^\s*de (.*)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $1;
+ }
+ }
+ elsif ($self->{isInfo} eq 3)
+ {
+ if ( ($origtext =~ m/^\s*avec (.*)/)
+ && (!$self->{itemsList}[ $self->{itemIdx} ]->{actors}))
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $1;
+ }
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ my ($self, $origtext) = @_;
+ $origtext =~ s/[\r\n]//g;
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+
+ if ($self->{insideTitle} eq 1)
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif (($self->{insideDate} eq 2) && (length($origtext) > 1))
+ {
+ $self->{curInfo}->{date} = $origtext
+ if !($origtext =~ /inconnu/);
+ $self->{insideDate} = 0;
+ }
+ elsif (($origtext =~ /^Date de sortie/)
+ && (!$self->{curInfo}->{date}))
+ {
+ $self->{insideDate} = 1;
+ }
+ elsif (($origtext =~ /^Date de reprise/)
+ && (!$self->{curInfo}->{date}))
+ {
+ $self->{insideDate} = 1;
+ }
+ elsif ($self->{insideTime} eq 1)
+ {
+ $origtext =~ /(\d+)h\s*(\d+)m/;
+ my $time = ($1*60) + $2;
+ $self->{curInfo}->{time} = $time." m.";
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDirector} eq 2)
+ {
+ $origtext = ", " if $origtext =~ m/^,/;
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($origtext =~ /^R..?alis..? par/)
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($self->{insideActor} eq 2)
+ {
+ $origtext =~ s/plus//;
+ $origtext = "," if $origtext =~ m/^,/;
+ $self->{curInfo}->{actors} .= $origtext;
+ }
+ elsif ($origtext =~ /^Avec/)
+ {
+ $self->{insideActor} = 1;
+ }
+ elsif ($self->{insideGenre} eq 2)
+ {
+ $origtext = "," if $origtext =~ m/^,/;
+ $self->{curInfo}->{genre} .= $origtext;
+ }
+ elsif ($origtext =~ /^[\s\n]*Genre/)
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif ($self->{insideCountry} eq 2)
+ {
+ $origtext = "," if $origtext =~ m/^,/;
+ $self->{curInfo}->{country} .= $origtext;
+ }
+ elsif ($origtext =~ /Nationalité/)
+ {
+ $self->{insideCountry} = 1;
+ }
+ elsif ($origtext =~ /^Presse$/)
+ {
+ $self->{insidePressRating} = 1;
+ }
+ elsif ($self->{insidePressRating} eq 2)
+ {
+ $origtext =~ s/,/./;
+ $self->{curInfo}->{ratingpress} .= $origtext * 2;
+ }
+ elsif ($origtext =~ /^Interdit aux moins de (\d+) ans/)
+ {
+ $self->{curInfo}->{age} = $1;
+ }
+ elsif ($self->{insideSynopsis} eq 1)
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideOriginal} eq 2)
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif ($origtext =~ /^Titre original/)
+ {
+ $self->{insideOriginal} = 1;
+ }
+
+
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{insideResults} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+ $self->{actorsCounter} = 0;
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # f=3 ?
+ # return "http://www.allocine.fr/recherche/?q=$word&f=3&rub=1";
+ return "http://www.allocine.fr/recherche/1/?q=$word";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.allocine.fr" . $url;
+ }
+
+ sub getName
+ {
+ return "Allocine.fr";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ # return "UTF-8"; # For 1.5.0 Win32
+ return "ISO-8859-1"; # For 1.5.0 Win32 with /lib/gcstar/GCPlugins/ ver.1.5.9svn
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm b/lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm
new file mode 100644
index 0000000..75c6854
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAlpacineES.pm
@@ -0,0 +1,435 @@
+package GCPlugins::GCfilms::GCAlpacineES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAlpacineES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ # Código para procesar el resultado de la busqueda
+ if ($self->{parsingList}){
+ # Guardamos la fecha.
+ if ($self->{inside}->{li} && $self->{insideInfos}){
+ $origtext =~ /. \(([0-9]{4})\)/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $origtext;
+ }
+ # Guardamos el título
+ if ($self->{inside}->{a} && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ }
+ }
+
+ else{
+ # Eliminamos espacios iniciales, espacios dobles y espacios finales del texto
+ $origtext =~ s/^\s*|\s{2,}|\s*$//g;
+ # Estamos procesando el titulo
+ if ($self->{insideTitle})
+ {
+ # Obtenemos titulo y fecha
+ $origtext =~ /(.*) \(([0-9]{4})\)/;
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ $self->{insideTitle} = 0;
+ return;
+ }
+
+ # Si existe el hipervinculo "Ampliar" cambiamos la imagen por la ampliada
+ if ($self->{inside}->{a} && $origtext eq "Ampliar"){
+ $self->{curInfo}->{image} =~ /(http:\/\/img.alpacine.com\/carteles\/.*)-[0-9]*(\.jpg)/;
+ $self->{curInfo}->{image} = $1 . $2;
+ return;
+ }
+ # Estamos en la puntuación real
+ if($self->{insideRating}){
+ $self->{curInfo}->{ratingpress} = int( $origtext + 0.5 );
+ $self->{insideRating} = 0;
+ }
+ # No hay puntuación real, asignamos 0 por defecto
+ if($self->{inside}->{div}){
+ if($origtext =~ /Esperando \d votos/){
+ $self->{curInfo}->{ratingpress} = 0;
+ }
+ }
+ # Procesamos el titulo original
+ if ($self->{isOrigTit} eq 1) {
+ $self->{isOrigTit} = 0;
+ $self->{curInfo}->{original} = $origtext;
+ return;
+ }
+ # Procesamos los generos (gen, gen, gen, gen...)
+ if ($self->{isGenres} eq 1) {
+ if($origtext ne ""){
+ # hacemos uso de sus propias comas
+ $self->{curInfo}->{genre} .= $origtext;
+ }
+ else{
+ $self->{isGenres} = 0;
+ }
+ return;
+ }
+ # Procesamos el país
+ if ($self->{isCountry} eq 1) {
+ $self->{isCountry} = 0;
+ $self->{curInfo}->{country} = $origtext;
+ return;
+ }
+ # Procesamos la duración
+ if ($self->{isTime} eq 1) {
+ $self->{isTime} = 0;
+ $self->{curInfo}->{time} = $origtext;
+ return;
+ }
+ # Procesamos los directores
+ if ($self->{isDirector} eq 1) {
+ if($origtext ne ""){
+ if($self->{curInfo}->{director} eq ""){
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ else{
+ $self->{curInfo}->{director} .= ", $origtext";
+ }
+ }
+ else{
+ $self->{isDirector} = 0;
+ }
+ return;
+ }
+ # Actores
+ if ($self->{isActors} eq 1) {
+ if($origtext ne ""){
+ if($self->{curInfo}->{actors} eq ""){
+ $self->{curInfo}->{actors} .= $origtext;
+ }
+ else{
+ $self->{curInfo}->{actors} .= ", $origtext";
+ }
+ }
+ else{
+ $self->{isActors} = 0;
+ }
+ return;
+ }
+ # Procesamos la Sinopsis
+ if ($self->{isSynopsis} eq 1) {
+ $self->{isSynopsis} = 0;
+ $self->{curInfo}->{synopsis} = $origtext;
+ return;
+ }
+ # Procesamos los premios
+ if ($self->{isAwards} eq 1) {
+ $self->{isAwards} = 0;
+ $self->{curInfo}->{synopsis} = $self->{curInfo}->{synopsis}. "\n\nPremios:\n\t".$origtext;
+ $self->{insideInfos} = 0;
+ return;
+ }
+
+ # Condiciones para procesar los campos en el siguiente ciclo
+ if($self->{insideInfos}){
+ $self->{isOrigTit} = 1 if $origtext eq "Título original:";
+ $self->{isGenres} = 1 if $origtext eq "Género:";
+ $self->{isCountry} = 1 if $origtext eq "País:";
+ $self->{isTime} = 1 if $origtext eq "Duración:";
+ $self->{isDirector} = 1 if $origtext eq "Dirección:";
+ $self->{isActors} = 1 if $origtext eq "Interpretación:";
+ $self->{isSynopsis} = 1 if $origtext eq "Sinopsis:";
+ $self->{isAwards} = 1 if $origtext eq "Premios:";
+ }
+ }
+ }
+
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ # Código para procesar el resultado de la busqueda
+ #if ($self->{parsingList}){
+ #}
+ # Código para procesar la información de la pelicula seleccionada
+ #else {
+ #}
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ # Código para procesar el resultado de la busqueda para generar el listado
+ if ($self->{parsingList})
+ {
+ # Comprobamos si estamos dentro de un título utilizando el atributo class
+ if( ($tagname eq "li" ) && ($attr->{class} ne "mas" )){
+ $self->{itemIdx}++;
+ $self->{insideInfos} = 1 ;
+ return;
+ }
+ if( ($tagname eq "li" ) && ($attr->{class} eq "mas" )){
+ $self->{insideInfos} = 0;
+ return;
+ }
+ # Si estamos en un título y encontramos una tag a, es un enlace a ficha
+ if ($tagname eq "a" && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.alpacine.com".$attr->{href};
+ return;
+ }
+ }
+ # Código para procesar la información de la pelicula seleccionada
+ else {
+ if ($tagname eq "h1"){
+ $self->{insideTitle} = 1;
+ return;
+ }
+ # Si estamos dentro de una imagen y el src es el del thumb lo asignamos como imagen
+ if ($tagname eq "img")
+ {
+ # Extraemos la dirección de la imagen thumb
+ if ($attr->{src} =~ /http:\/\/img.alpacine.com\/carteles\/.*\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ return;
+ }
+
+ if ($tagname eq "div" && $attr->{class} eq "voto"){
+ $self->{insideRating} = 1;
+ return;
+ }
+
+ if( $tagname eq "div" && $attr->{class} eq "datos" ){
+ $self->{insideInfos} = 1 ;
+ return;
+ }
+ }
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Anulamos el html si coincide con el patron de no resultados
+ if($html =~ /^.*No hay resultados para.*$/s){
+ $html = "";
+ return $html;
+ }
+
+ # Recorta el código del listado de resultados, quedandose solo con la parte que nos interesa del html
+ # el modificador s/.../$1/s trata el flujo como una sola cadena y reemplaza todo el cuerpo con la parte que nos interesa
+ if($html =~ s/^.*<div class="titulo">Pel.culas <span class="resultados">\([0-9]* resultado[s]?\)<\/span><\/div><ul>(<li><a.*<\/a> \([0-9]*\)<\/li>).*$/$1/s){
+ return $html;
+ }
+
+ # Recorta el código de la ficha, quedandose solo con la parte que nos interesa del html
+ # Comprobamos si la pelicula contiene o no premios y nos quedamos con lo que corresponda
+ if($html =~ /^.*<div class="titulo">Premios:.*más\.\.\.<\/a><\/div><\/div>.*$/s){
+ $html =~ s/^.*<div id="titulo">(.*<\/div><\/div>.*\n.*<div class="datox"><div class="titulo">Premios:.*)más\.\.\.<\/a><\/div><\/div>.*$/$1/s;
+ }
+ else{
+ $html =~ s/^.*<div id="titulo">(.*<\/div><\/div>)\n\n\t\t\t\t\n\n\t\t\t\t<hr \/>.*$/$1/s;
+ }
+ return $html;
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ #sub changeUrl
+ #{
+ # my ($self, $url) = @_;
+ # return $url;
+ #}
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ #sub getExtra
+ #{
+ # return 'Extra';
+ #}
+
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return "ES";
+ }
+
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return "DoVerMan";
+ }
+
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return 'Alpacine';
+ }
+
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ #sub getCharset
+ #{
+ # my $self = shift;
+ # # Charset de la web
+ # return "UTF-8";
+ #}
+
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ # Hack para evitar problemas con acentos
+ $word =~ s/%E1/a/g;
+ $word =~ s/%E9/e/g;
+ $word =~ s/%ED/i/g;
+ $word =~ s/%F3/o/g;
+ $word =~ s/%FA/u/g;
+ $word =~ s/%C1/A/g;
+ $word =~ s/%C9/E/g;
+ $word =~ s/%CD/I/g;
+ $word =~ s/%D3/O/g;
+ $word =~ s/%DA/U/g;
+
+ return "http://www.alpacine.com/buscar/?buscar=" . $word;
+
+ }
+
+
+ # Constructor
+ sub new
+ {
+ # Inicialización
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ # Campos que devuelve el plugin (1 si, 0 no). Son los que apareceran
+ # en el listado de resultados
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ # Indica si estamos procesando información útil
+ $self->{insideInfos} = 0;
+
+ # Indican el estado del procesado del listado de resultados
+ $self->{insideRating} = 0;
+ $self->{insideTitle} = 0;
+
+ $self->{isOrigTit} = 0;
+ $self->{isGenres} = 0;
+ $self->{isCountry} = 0;
+ $self->{isTime} = 0;
+ $self->{isDirector} = 0;
+ $self->{isActors} = 0;
+ $self->{isSynopsis} = 0;
+ $self->{isAwards} = 0;
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm
new file mode 100644
index 0000000..8692a1b
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazon.pm
@@ -0,0 +1,281 @@
+package GCPlugins::GCfilms::GCAmazon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazon;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'input')
+ {
+ $self->{beginParsing} = 1
+ if $attr->{src} =~ /go-button-search/;
+ }
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'srtitle')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'publication')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1;
+ }
+ if ($tagname eq 'a')
+ {
+ my $urlId;
+ if ($urlId = $self->isItemUrl($attr->{href}))
+ {
+ $self->{isTitle} = 2 if $self->{isTitle} eq '1';
+ return if $self->{alreadyRetrieved}->{$urlId};
+ $self->{alreadyRetrieved}->{$urlId} = 1;
+ $self->{currentRetrieved} = $urlId;
+ my $url = $attr->{href};
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "img") && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'content'))
+ {
+ $self->{insideContent} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescriptionWrapper'))
+ {
+ $self->{insideSynopsis} = 1
+ if (!$self->{curInfo}->{synopsis});
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'emptyClear'))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif (($tagname eq "span") && ($self->{insideAge}) && ($attr->{class} =~ /medSprite/))
+ {
+ $attr->{class} =~ s/\s*$//;
+ $self->{curInfo}->{age} = 2 if ($attr->{class} =~ m/G$/);
+ $self->{curInfo}->{age} = 5 if ($attr->{class} =~ m/PG$/);
+ $self->{curInfo}->{age} = 13 if ($attr->{class} =~ m/PG13$/);
+ $self->{curInfo}->{age} = 18 if ($attr->{class} =~ m/R$/);
+ $self->{insideAge} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "li")
+ {
+ $self->{insideActors} = 0;
+ $self->{insideDirector} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if GCPlugins::GCstar::GCPluginAmazonCommon::text(@_);
+ return if length($origtext) < 2;
+ return if ($self->{parsingEnded});
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ return;
+ }
+ elsif ($self->{isPublication})
+ {
+ $origtext =~ m/([0-9]{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ $self->{isPublication} = 0;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{isActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}/ /g;
+
+ if ($self->{insideNameAndDate})
+ {
+ if ($origtext =~ m/(.*) \(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ }
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\s+,/,/;
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext];
+ $self->{actorsCounter}++;
+ }
+ }
+ elsif (($self->{insideDirector}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} .= ", "
+ if $self->{curInfo}->{director};
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $origtext =~ s/\s*$//;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+ elsif (($self->{insideSynopsis}) && ($origtext ne ''))
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Actors:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Directors:/;
+ $self->{insideTime} = 1 if $origtext =~ /Run Time:/;
+ $self->{insideGenre} = 1 if $origtext =~ /Genre:/;
+ $self->{insideAge} = 1 if $origtext =~ /Rating:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'com';
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ $html =~ s|~(.*?)<span class="bindingBlock">\(<span class="binding">(.*?)</span>( - .*?[0-9]{4})?\)</span>|<actors>$1</actors><format>$2</format><publication>$3</publication>|gsm;
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+ $html =~ s|<a href="[^"]*search-alias=dvd&field-keywords=[^"]*">(.*?)</a>|$1|gm;
+ }
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 0;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (US)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm
new file mode 100644
index 0000000..fab2b9f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazonDE.pm
@@ -0,0 +1,291 @@
+package GCPlugins::GCfilms::GCAmazonDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazonDE;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'input')
+ {
+ $self->{beginParsing} = 1
+ if $attr->{src} =~ /go-button-search/;
+ }
+ return if ! $self->{beginParsing};
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'srtitle')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'publication')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1;
+ }
+ if ($tagname eq 'a')
+ {
+ my $urlId;
+ if ($urlId = $self->isItemUrl($attr->{href}))
+ {
+ $self->{isTitle} = 2 if $self->{isTitle} eq '1';
+ return if $self->{alreadyRetrieved}->{$urlId};
+ $self->{alreadyRetrieved}->{$urlId} = 1;
+ $self->{currentRetrieved} = $urlId;
+ my $url = $attr->{href};
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "img") && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'content'))
+ {
+ $self->{insideContent} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescriptionWrapper'))
+ {
+ $self->{insideSynopsis} = 1
+ if (!$self->{curInfo}->{synopsis});
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'emptyClear'))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "li")
+ {
+ $self->{insideActors} = 0;
+ $self->{insideDirector} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if GCPlugins::GCstar::GCPluginAmazonCommon::text(@_);
+ return if length($origtext) < 2;
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ return;
+ }
+ elsif ($self->{isPublication})
+ {
+ $origtext =~ m/([0-9]{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ $self->{isPublication} = 0;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{isActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ if ($self->{insideNameAndDate})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\s+,/,/;
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext];
+ $self->{actorsCounter}++;
+ }
+ }
+ elsif (($self->{insideDirector}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} .= ", "
+ if $self->{curInfo}->{director};
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/\-$//;
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif (($self->{insideSynopsis}) && ($origtext ne ''))
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideAudio})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{audio} = $origtext;
+ $self->{insideAudio} = 0;
+ }
+ elsif ($self->{insideSubTitle})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{subt} = $origtext;
+ $self->{insideSubTitle} = 0;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Darsteller:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Regisseur\(e\):/;
+ $self->{insideDate} = 1 if $origtext =~ /Erscheinungstermin:/;
+ $self->{insideTime} = 1 if $origtext =~ /Spieldauer:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'de';
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ $html =~ s|~(.*?)<span class="bindingBlock">\(<span class="binding">(.*?)</span>( - .*?[0-9]{4})?\)</span>|<actors>$1</actors><format>$2</format><publication>$3</publication>|gsm;
+
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+ $html =~ s|<a href="[^"]*search-alias=dvd&field-keywords=[^"]*">(.*?)</a>|$1|gm;
+ #"
+ $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd-de&field-(?:actor|director|keywords)=[^\/]*\/[-0-9]*">([^<]*)<\/a>/$1/gm;
+ }
+
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 1;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (DE)";
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm
new file mode 100644
index 0000000..cbb6674
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazonFR.pm
@@ -0,0 +1,304 @@
+package GCPlugins::GCfilms::GCAmazonFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazonFR;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'input')
+ {
+ $self->{beginParsing} = 1
+ if $attr->{src} =~ /go-button-search/;
+ }
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'srtitle')
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'publication')
+ {
+ $self->{isPublication} = 1;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1;
+ }
+ if ($tagname eq 'a')
+ {
+ my $urlId;
+ if ($urlId = $self->isItemUrl($attr->{href}))
+ {
+ $self->{isTitle} = 2 if $self->{isTitle} eq '1';
+ return if $self->{alreadyRetrieved}->{$urlId};
+ $self->{alreadyRetrieved}->{$urlId} = 1;
+ $self->{currentRetrieved} = $urlId;
+ my $url = $attr->{href};
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if (($tagname eq "img") && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'content'))
+ {
+ $self->{insideContent} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'productDescriptionWrapper'))
+ {
+ $self->{insideSynopsis} = 1
+ if (!$self->{curInfo}->{synopsis});
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'emptyClear'))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ elsif (($tagname eq "span") && ($self->{insideAge}) && ($attr->{class} =~ /medSprite/))
+ {
+ $attr->{class} =~ s/\s*$//;
+ $self->{curInfo}->{age} = 2 if ($attr->{class} =~ m/G$/);
+ $self->{curInfo}->{age} = 5 if ($attr->{class} =~ m/PG$/);
+ $self->{curInfo}->{age} = 13 if ($attr->{class} =~ m/PG13$/);
+ $self->{curInfo}->{age} = 18 if ($attr->{class} =~ m/R$/);
+ $self->{insideAge} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($tagname eq "li")
+ {
+ $self->{insideActors} = 0;
+ $self->{insideDirector} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if (($self->{inside}->{title})
+ && ($origtext !~ /^Amazon.fr/))
+ {
+ $self->{parsingEnded} = 1;
+ }
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isTitle} = 0;
+ return;
+ }
+ elsif ($self->{isPublication})
+ {
+ $origtext =~ m/([0-9]{4})/;
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ $self->{isPublication} = 0;
+ return;
+ }
+ elsif ($self->{isActors})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{isActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideNameAndDate})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\s+,/,/;
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext];
+ $self->{actorsCounter}++;
+ }
+ }
+ elsif (($self->{insideDirector}) && ($origtext !~ /^,/))
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} .= ", "
+ if $self->{curInfo}->{director};
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $origtext =~ s/\-$//;
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif (($self->{insideSynopsis}) && ($origtext ne ''))
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideAudio})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{audio} = $origtext;
+ $self->{insideAudio} = 0;
+ }
+ elsif ($self->{insideSubTitle})
+ {
+ $origtext =~ s/^\s//;
+ $self->{curInfo}->{subt} = $origtext;
+ $self->{insideSubTitle} = 0;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Acteurs\s*:/;
+ $self->{insideDirector} = 1 if $origtext =~ /R.alisateurs?\s*:/;
+ $self->{insideDate} = 1 if $origtext =~ /Date de sortie/;
+ $self->{insideTime} = 1 if $origtext =~ /Dur.e\s*:/;
+ $self->{insideAudio} = 1 if $origtext =~ /Langue\s*:/;
+ $self->{insideSubTitle} = 1 if $origtext =~ /Sous-titres\s*:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'fr';
+
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ $html =~ s|~(.*?)<span class="bindingBlock">\(<span class="binding">(.*?)</span>( - .*?[0-9]{4})?\)</span>|<actors>$1</actors><format>$2</format><publication>$3</publication>|gsm;
+
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+# $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd-fr&field-(?:actor|director|keywords)=[^\/]*\/[-0-9]*">([^<]*)<\/a>/$1/gm;
+ $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd-fr&field-(?:actor|director|keywords)=[^\/]*">([^<]*)<\/a>/$1/gm;
+ #"
+ }
+
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 1;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (FR)";
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm b/lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm
new file mode 100644
index 0000000..096bb08
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAmazonUK.pm
@@ -0,0 +1,264 @@
+package GCPlugins::GCfilms::GCAmazonUK;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+# Edited 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAmazonUK;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsAmazonPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($self->{itemIdx} < 0)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($self->{beginParsing} eq 0) && ($tagname eq 'div') && ($attr->{id} eq 'Results'))
+ {
+ $self->{beginParsing} = 1;
+ }
+ if (($self->{beginParsing}) && ($tagname eq 'table') && ($attr->{class} eq 'pagnTable'))
+ {
+ $self->{beginParsing} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ return if ! $self->{beginParsing};
+ if ($tagname eq 'a')
+ {
+ if (($self->{isItem}) && ($self->{isUrl}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'dataColumn'))
+ {
+ $self->{isItem} = 1 ;
+ $self->{isUrl} = 1 ;
+ $self->{isName} = 1 ;
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if (!$self->{curInfo}->{image})
+ {
+ $self->{curInfo}->{image} = $self->extractImage($attr);
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideNameAndDate} = 1 if $attr->{id} eq "btAsinTitle";
+ }
+ elsif (($tagname eq "div") && ($attr->{class} eq "productDescriptionWrapper"))
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if (($tagname eq 'li') && ($self->{insideActors}))
+ {
+ $self->{insideActors} = 0;
+ }
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if GCPlugins::GCstar::GCPluginAmazonCommon::text(@_);
+ return if length($origtext) < 2;
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ return if ! $self->{beginParsing};
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isName} = 0;
+ $self->{isItem} = 0;
+ $self->{inActors} = 1;
+ }
+ elsif ($self->{inActors} && $self->{inside}->{td})
+ {
+ $origtext =~ s/^\W*//;
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{actors};
+ $self->{inActors} = 0;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideNameAndDate})
+ {
+ (my $year = $origtext) =~ s/.*\[([0-9]{4})\].*/$1/ ;
+ (my $title = $origtext) =~ s/^([^\[]*).*$/$1/ ;
+ $self->{curInfo}->{title} = $title;
+ $self->{curInfo}->{origtitle} = $title;
+ $self->{curInfo}->{date} = $year;
+ $self->{insideNameAndDate} = 0;
+ }
+ elsif (($self->{insideActors}) && $self->{inside}->{a})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{actors} .= $origtext.', ';
+ }
+ elsif ($self->{insideAge})
+ {
+ $origtext =~ m/([0-9]{1,2})/;
+ $self->{curInfo}->{age} = $1;
+ $self->{insideAge} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/,.$//;
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s//;
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext if ! $self->{hasSynopsis};
+ $self->{isSynopsis} = 0;
+ $self->{hasSynopsis} = 1;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideActors} = 1 if $origtext =~ /Actors:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Directors:/;
+ $self->{insideAge} = 1 if $origtext =~ /Classification:/;
+ $self->{insideTime} = 1 if $origtext =~ /Run Time:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 1,
+ };
+
+ $self->{suffix} = 'co.uk';
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html = $self->SUPER::preProcess($html);
+ if ($self->{parsingList})
+ {
+ $self->{isItem} = 0;
+ }
+ else
+ {
+ $html =~ s/(<i>|<\/i>)//gim;
+ $html =~ s/<p>/\n/gim;
+ $html =~ s|</p>|\n|gim;
+ $html =~ s/(<ul>|<\/ul>)/\n/gim;
+ $html =~ s/<li>([^<])/- $1/gim;
+ $html =~ s|([^>])</li>|$1\n|gim;
+ $html =~ s|<br ?/?>|\n|gi;
+ $html =~ s|<a href="/gp/imdb/[^"]*">(.*?)</a>|$1|gm;
+ $html =~ s|<a href="[^"]*search-alias=dvd&field-keywords=[^"]*">(.*?)</a>|$1|gm;
+
+ $html =~ s/<a href="\/exec\/obidos\/search-handle-url\/index=dvd&field-(?:actor|director|keywords)=[^\/]*\/[-0-9]*">([^<]*)<\/a>/$1/gm;
+ }
+
+ $self->{parsingEnded} = 0;
+ $self->{alreadyRetrieved} = {};
+ $self->{beginParsing} = 0;
+
+ return $html;
+ }
+
+ sub getName
+ {
+ return "Amazon (UK)";
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & FiXx';
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm b/lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm
new file mode 100644
index 0000000..1c62e7c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAniDB.pm
@@ -0,0 +1,279 @@
+package GCPlugins::GCfilms::GCAniDB;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAniDB;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ m/animedb\.pl\?show=animeatt&aid=([0-9]*)/)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = "animedb\.pl\?show=anime&aid=" . $1;
+ }
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ m/animedb\.pl\?show=anime&aid=[0-9]*/)
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++ if ($self->{itemIdx} < 0) || ($attr->{href} ne $self->{itemsList}[$self->{itemIdx}]->{url});
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ $self->{isYear} = 1 if ($attr->{class} eq 'date year');
+ }
+ elsif ($tagname eq 'h1')
+ {
+ $self->{insideHeadline} = 1;
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ m/http\:\/\/img[0-9]\.anidb\.info\/pics\/anime\/[0-9]*\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src} if !$self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq 'p')
+ {
+ if ($attr->{class} eq 'desc')
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ elsif ($tagname eq 'th')
+ {
+ $self->{isField} = 1 if $attr->{class} eq 'field';
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ $self->{insideSynopsis} = 0 if $tagname eq 'p';
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{insideHeadline})
+ {
+ $self->{parsingEnded} = 1 if $origtext !~ m/Anime List - Search for:/;
+ $self->{insideHeadline} = 0;
+ }
+
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext
+ if ! $self->{itemsList}[$self->{itemIdx}]->{title};
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $origtext;# if $origtext =~ m/^ [0-9]{4}(-[0-9]{4})? $/;
+ $self->{isYear} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\s{2,}/ /g;
+ $self->{curInfo}->{synopsis} .= $origtext;
+ #$self->{curInfo}->{synopsis} =~ s|GCBRGC|<br>|g;
+ #$self->{curInfo}->{synopsis} =~ s/^\s*//;
+ $self->{insideSynopsis} = 0;
+ }
+# elsif ($self->{inside}->{div})
+# {
+# $self->{curInfo}->{title} = $1 if $origtext =~ m/Title: (.*) /;
+# if ($origtext =~ m/(?:Jap. Kanji|English): (.*) /)
+# {
+# $self->{curInfo}->{original} = $1;
+# }
+# $self->{curInfo}->{date} = $1 if $origtext =~ m/Year: (.*)/;
+# $self->{curInfo}->{director} = $1 if $origtext =~ m/Companies: (.*) /;
+# if ($origtext =~ m/Genre: (.*)/)
+# {
+# $self->{curInfo}->{genre} = $1;
+# $self->{curInfo}->{genre} =~ s/ - //;
+# }
+# }
+ elsif ($self->{isField})
+ {
+ $self->{isTitle} = 1 if $origtext eq 'Title';
+ $self->{isOrig} = 1 if $origtext =~ /kanji/i;
+ $self->{isYear} = 1 if $origtext eq 'Year';
+ $self->{isGenre} = 1 if $origtext eq 'Genre';
+ $self->{isField} = 0;
+ }
+ elsif ($self->{inside}->{td})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isOrig} = 0;
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{isGenre})
+ {
+ ($self->{curInfo}->{genre} = $origtext) =~ s/\s//g;
+ $self->{curInfo}->{genre} =~ s/-$//;
+ $self->{isGenre} = 0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+ $self->{isField} = 0;
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/<a href="animedb\.pl\?show=producer&prid=[0-9]*" title="[^"]*">([^<]*)<\/a>/$1/g;
+ $html =~ s/<a href="animedb\.pl\?show=genre" target="_blank">(Genre:)<\/a>/$1/g;
+ $html =~ s/<a href="animedb\.pl\?show=animelist&amp;genid=[^"]*" title="[^"]*">([^<]*)<\/a>/$1/g;
+ $html =~ s/ - <a href="animedb\.pl\?show=search&do\.search=1(&search\.anime.genre.[0-9]*=on){1,}" title="search for other animes with all of these genres">\[similar\]<\/a> //;
+ #$html =~ s/<td> ([^:]*): <\/td>\s*<td> ([^<]*) ?<\/td>/<div>$1: $2<\/div>/g;
+ $html =~ s/<br \/>/\n/g;
+ $html =~ s/<b>Awards:<\/b><br><a href="[^"]*" target="_blank"><img src="[^"]*" border=0 alt="[^"]*" title="[^"]*"><\/a> <hr>//g;
+
+ #Removed italic strings (useful for synopsis source)
+ $html =~ s|<i>(.*?)</i>|$1|g;
+ #Extract synopsis
+ #$html =~ s|<td>([^<]*?)</td>\s*?</tr>\s*?</table>\s*?<hr>|<div class="synopsis">$1</div>|ms;
+
+ #Remove Headline tag
+ $html =~ s/>\W*?<!-- headline -->/>/;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://anidb.info/perl-bin/animedb.pl?show=animelist&adb.search=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://anidb.info/perl-bin/' . $url;
+ }
+
+ sub getName
+ {
+ return 'AniDB';
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm b/lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm
new file mode 100644
index 0000000..45704d0
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAnimator.pm
@@ -0,0 +1,236 @@
+package GCPlugins::GCfilms::GCAnimator;
+
+###################################################
+#
+# Copyright 2005-2009 zserghei
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use Encode qw(encode);
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAnimator;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if ($url =~ m/\/db\/\?p\=show\_film/)
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "td" && $attr->{class} eq "FilmName")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif ($tagname eq "td" && $attr->{class} eq "FilmType")
+ {
+ $self->{insideTime} = 1;
+ $self->{insideDate} = 1;
+ }
+ elsif ($tagname eq "td" && $attr->{class} eq "FilmComments")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($tagname eq "img")
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if !$self->{curInfo}->{image}
+ && ($attr->{id} eq "SlideShow" || $attr->{width} =~ m/3\d{2}/);
+ $self->{curInfo}->{image} = "http://www.animator.ru/" . $self->{curInfo}->{image}
+ if $self->{curInfo}->{image} =~ m/^\//;
+ $self->{curInfo}->{image} = "http://www.animator.ru/db/" . $self->{curInfo}->{image}
+ if $self->{curInfo}->{image} =~ m/^\.\.\//;
+ $self->{insideImage} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ my ($title, $date);
+ if ($origtext =~ m/«(.*)»\s\(([0-9]*)\s.+\)/)
+ {
+ ($title, $date) = ($1, $2);
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $title;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $date;
+ }
+ else
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ $self->{isMovie} = 0;
+ return;
+ }
+ }
+ else
+ {
+ utf8::decode($origtext);
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ if ($self->{insideTitle})
+ {
+ $origtext =~ s/^\W//;
+ $origtext =~ s/\W$//;
+ $origtext = ucfirst(lc($origtext));
+ $self->{curInfo}->{title} = $origtext;
+ $self->{curInfo}->{genre} = "Мультфильм";
+ $self->{curInfo}->{audio} = "руÑÑкий";
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ if ($origtext =~ m/([0-9]+)\sг/)
+ {
+ $self->{curInfo}->{date} = $1;
+ if ($self->{curInfo}->{date} < 1992)
+ {
+ $self->{curInfo}->{country} = "СССР";
+ }
+ else
+ {
+ $self->{curInfo}->{country} = "РоÑÑиÑ";
+ }
+ $self->{insideDate} = 0;
+ }
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .=
+ $self->{curInfo}->{synopsis} ? "\n" . $origtext : $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ if ($self->{insideTime})
+ {
+ if ($origtext =~ m/,\s+([0-9]+)\s+мин/)
+ {
+ $self->{curInfo}->{time} = $1;
+ $self->{insideTime} = 0;
+ }
+ }
+ if ($self->{inside}->{td})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/режиÑÑер/;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Animator";
+ }
+
+ sub getAuthor
+ {
+ return 'zserghei';
+ }
+
+ sub getLang
+ {
+ return 'RU';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "KOI8-R";
+# return "Windows-1251";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.animator.ru/db/?p=search&text=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return "http://www.animator.ru/" . $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{parsingEnded} = 0;
+ $html =~ tr
+ {ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрÑтуфхцчшщъыьÑÑŽÑ}
+ {юабцдефгхийклмнопÑÑ€ÑтужвьызшÑщчъЮÐБЦДЕФГХИЙКЛМÐОПЯРСТУЖВЬЫЗШЭЩЧЪ};
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm b/lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm
new file mode 100644
index 0000000..9347637
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAnimeNfoA.pm
@@ -0,0 +1,266 @@
+package GCPlugins::GCfilms::GCAnimeNfoA;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginAnimeNfoA;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/animetitle,[0-9]*,[a-z]*,[a-z0-9_]*\.html/)
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($attr->{class} eq "anime_info")
+ {
+ $self->{couldBeYear} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'table')
+ {
+ if ($attr->{class} eq 'anime_info')
+ {
+ $self->{insideInfos} = 1;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{class} eq 'float')
+ {
+ $self->{curInfo}->{image} = 'http://www.animenfo.com/' . $attr->{src};
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ /animebygenre\.php\?genre=/)
+ {
+ $self->{insideGenre} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2) && ($origtext !~ /\d+$/);
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{couldBeYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext if $origtext =~ m/^[0-9]{4}$/;
+ $self->{couldBeYear} = 0;
+ return;
+ }
+ }
+ else
+ {
+ if ($self->{insideInfos})
+ {
+ if ($origtext eq "Title")
+ {
+ $self->{insideName} = 1;
+ }
+ elsif ($origtext eq "Japanese Title")
+ {
+ $self->{insideOrig} = 1;
+ }
+ elsif ($origtext eq "Total Episodes")
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif ($origtext eq "Year Published")
+ {
+ $self->{insideDate} = 1;
+ }
+ elsif ($origtext eq "Director")
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($origtext eq "User Rating")
+ {
+ $self->{insideRating} = 1;
+ }
+ elsif ($origtext =~ m/Description/)
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext if $origtext ne "Official Site";
+ $self->{insideOrig} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^(\d+)\s*(.*)/$1 episodes $2/;
+ $self->{curInfo}->{time} .= $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $self->{curInfo}->{genre} .= $origtext . ',';
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext if $origtext =~ m/[0-9]{4}/;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext if $origtext ne "US Distribution";
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideRating})
+ {
+ $origtext =~ m|([\d\.]+)/10\.0|;
+ $self->{curInfo}->{ratingpress} = int ($1 + 0.5);
+ $self->{insideRating} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext if !$self->{curInfo}->{synopsis};
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s/<br \/>/\n/g;
+ $html =~ s/<script language='JavaScript'>.*?<\/script>//g;
+ $html =~ s|<i>([^<]*)</i>|$1|g;
+ $html =~ s|\t||g;
+ $html =~ s/<a onMouseOut='[^']*' onMouseOver='[^']*' href='animebygenre\.php\?genre=[0-9]*'>([^<]*)<\/a>/$1/g;
+ $html =~ s/<a href='animebyyear\.php\?year=[0-9]{4}'>([0-9]{4})<\/a>/<font class='DefaultFont'>$1<\/font>/;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.animenfo.com/search.php?option=keywords&queryin=anime_titles&query=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.animenfo.com/' . $url;
+ }
+
+ sub getName
+ {
+ return "AnimeNfo Anime";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return ['orig'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm b/lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm
new file mode 100644
index 0000000..f4e3c77
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCAnimeka.pm
@@ -0,0 +1,295 @@
+package GCPlugins::GCfilms::GCAnimeka;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginAnimeka;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ if (($tagname eq 'form')
+ && ($attr->{name} eq 'form_note_serie')
+ && (! $self->{itemsList}[0]->{url}))
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $attr->{action};
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq "img")
+ && ($attr->{class} eq "rechercheindeximg")
+ && ($attr->{alt} eq "Animesindex"))
+ {
+ $self->{parsingEnded} = 1 if $attr->{src} !~ /rechercheindex\.gif/;
+ }
+
+ if ($tagname eq "a")
+ {
+ if (($attr->{href} =~ /^\/animes\/detail\//))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{class} eq "picture")
+ {
+ $self->{curInfo}->{image} = "http://animeka.com" . $attr->{src};
+ }
+ elsif (($attr->{class} eq "animeslegendimg")
+ && ($attr->{src} =~ /^\/_distiller\/show_flag\.php\?id=/))
+ {
+ if (!$self->{curInfo}->{country})
+ {
+ $self->{curInfo}->{country} = $attr->{alt};
+ }
+ elsif ($self->{curInfo}->{country} !~ $attr->{alt})
+ {
+ $self->{curInfo}->{country} .= ", " . $attr->{alt};
+ }
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideInfos} = 1 if $attr->{class} eq "animestxt";
+ $self->{insideName} = 1 if $attr->{class} eq "animestitle";
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideSynopsis} = 1 if $attr->{class} eq "synopsis";
+ $self->{insideAlternate} = 1 if $attr->{class} eq "alternate";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if ($self->{parsingEnded});
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{script})
+ {
+ if ($origtext =~ /document\.location\.href="(.*?)"/)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $1;
+ }
+ return;
+ }
+
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ $origtext =~ s/ : ([0-9]{4}) - [0-9]*\s*[A-Z]*/$1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{inside}->{u})
+ {
+ $self->{isYear} = 1 if $origtext =~ /Ann.e \/ nombre et format/;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideInfos})
+ {
+ $origtext =~ s/(.*), $/$1/;
+ if ($origtext =~ /TITRE ORIGINAL : (.*)/)
+ {
+ $self->{curInfo}->{original} = $1;
+ }
+ elsif ($origtext =~ /AUTEUR(?:S)? : (.*)/)
+ {
+ $self->{curInfo}->{director} = $self->capWord($1);
+ }
+ elsif (($origtext =~ /VOLUMES, TYPE . DUR.E : (.*)/)
+ || ($origtext =~ /TYPE . DUR.E : (.*)/))
+ {
+ $self->{curInfo}->{time} = $self->capWord($1);
+ }
+ elsif ($origtext =~ /ANN.E DE PRODUCTION : (.*)/)
+ {
+ $self->{curInfo}->{date} = $self->capWord($1);
+ }
+ elsif ($origtext =~ /GENRE(?:S)? :/)
+ {
+ $origtext =~ s/(?:, )|(?: & )/,/g;
+ $origtext =~ /GENRE(?:S)? : (.*)/;
+ $self->{curInfo}->{genre} = $self->capWord($1);
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideName})
+ {
+ if ($origtext =~ /(.*?)( \(([0-9]{4})\))?$/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $3;
+ }
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\[br\]/\n/g;
+ $origtext =~ s/\[endline\]//g;
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideAlternate})
+ {
+ $origtext =~ s/\[br\]/\n/g;
+ $origtext =~ s/\[endline\]//g;
+ $self->{curInfo}->{original} = $origtext if ! $self->{curInfo}->{original};
+ $self->{insideAlternate} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/&amp;/&/g;
+ $html =~ s/<b>|<\/b>//g;
+ $html =~ s/<i>|<\/i>//g;
+ $html =~ s/<br \/>/\[br\]/g;
+ $html =~ s/\n/\[endline\]/g;
+ $html =~ s/<span style="background:#CBD1DD;">([^<]*)<\/span>/$1/g;
+ $html =~ s/\[<a href="\/animes\/(?:studios|genres|pers)\/.*?\.html">([^<]*)<\/a>\] /$1, /g;
+ $html =~ s/<a href="\/avis\/index.html"[^>]*>([^<]*)<\/a>/$1/g;
+ $html =~ s/<td [^>]*>Synopsis<\/td><\/tr><tr><td [^>]*><table [^>]*><tr><td [^>]*>(.*?)<\/td><\/tr><\/table><\/td>/<div class="synopsis">$1<\/div>/;
+ $html =~ s/<td [^>]*>Titre alternatif<\/td><\/tr><tr><td [^>]*><table [^>]*><tr><td [^>]*>(.*?)<\/td><\/tr><\/table><\/td>/<div class="alternate">$1<\/div>/;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.animeka.com/search/index.html?req=$word&zone_series=1&go_search=1&cat=search";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.animeka.com" . $url;
+ }
+
+ sub getName
+ {
+ return "Animeka.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+ sub getCharset
+ {
+ return "ISO-8859-1";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm b/lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm
new file mode 100644
index 0000000..e05ce80
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCBeyazPerde.pm
@@ -0,0 +1,340 @@
+package GCPlugins::GCfilms::GCBeyazPerde;
+
+###################################################
+#
+# Copyright 2007-2009 Zuencap
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginBeyazPerde;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ /\/film\// && $attr->{class} eq "turuncucizgisiz_11_px")
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /^\/images\/film\//)
+ {
+ $self->{curInfo}->{image} = "http://beyazperde.mynet.com" . $attr->{src}
+ if !$self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($self->{insideSynopsis} == 1)
+ {
+ $self->{insideSynopsis} = 2;
+ }
+ }
+ elsif ($tagname eq "h1")
+ {
+ if ($attr->{class} eq "baslik_filmadi31")
+ {
+ $self->{insideTitle} = 1;
+ }
+ }
+ elsif ($tagname eq "h2")
+ {
+ if ($attr->{class} eq "baslik_filmadi32")
+ {
+ $self->{insideTitle} = 2;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if (!$self->{parsingList})
+ {
+ if ($tagname eq "table")
+ {
+ if ($self->{insideActors})
+ {
+ $self->{insideActors} = 0;
+ $self->{insideSynopsis} = 1;
+ }
+ $self->{insideTime} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($self->{insideSynopsis} == 2)
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie} == 0)
+ {
+ return;
+ }
+ elsif ($self->{isMovie} == 1)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ elsif ($self->{isMovie} == 2)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1 if $origtext =~ m/\(([0-9]*)\)/;
+ }
+ elsif ($self->{isMovie} == 5)
+ {
+ if ($origtext eq "Y:")
+ {
+ $self->{isMovie}++;
+ }
+ }
+ elsif ($self->{isMovie} == 7)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ }
+ elsif ($self->{isMovie} == 9)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $origtext;
+ $self->{isMovie} = -1;
+ }
+
+ $self->{isMovie}++;
+ return;
+ }
+ else
+ {
+ if ($self->{insideGenre} && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{genre} = $self->capWord($origtext);
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDirector} && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis} == 2)
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ }
+ elsif ($self->{insideTime})
+ {
+ if ($self->{insideTime} == 1)
+ {
+ if ($self->{inside}->{a})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideTime}++;
+ }
+ }
+ elsif ($self->{insideTime} == 2)
+ {
+ if ($self->{inside}->{a})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideTime}++;
+ }
+ }
+ elsif ($origtext =~ / dk\./)
+ {
+ $origtext =~ s/.*, (.*) dk\./$1 dk\./;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ }
+ elsif ($self->{insideActors})
+ {
+ if ($self->{inside}->{a})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{inside}->{font} && ($origtext =~ m/\((.*)\)/))
+ {
+ # As we incremented it above, we have one more chance here to add a role
+ # Without <= we would skip the role for last actor
+ push @{$self->{curInfo}->{actors}->[$self->{actorsCounter}-1]}, $1
+ if ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ }
+ }
+ elsif ($self->{insideOtherTitles})
+ {
+ if ($origtext =~ m/(.*?) \(International.*/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{insideOtherTitles} = 0;
+ }
+ }
+ elsif ($self->{insideTitle} == 1)
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideTitle} == 2)
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+
+ if ($self->{inside}->{span})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/Y\xf6netmen : /;
+ $self->{insideGenre} = 1 if $origtext eq "T\xfcr : ";
+ $self->{insideTime} = 1 if $origtext =~ m/Yapım/;
+ $self->{insideActors} = 1
+ if $origtext =~ m/Oyuncular/ || $origtext =~ m/Seslendirenler/;
+ if ($origtext =~ m{SinePuan:\s+(\d+\,\d+)\s+})
+ {
+ my $rating = $1;
+ $rating =~ s/,/./;
+ $self->{curInfo}->{ratingpress} = int($rating + 0.5);
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #Fix for character-encoding:
+ $html =~ s/\x85/\.\.\./g;
+ $html =~ s/\x92/'/g;
+ $html =~ s/\x93/“/g;
+ $html =~ s/\x94/â€/g;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://beyazperde.mynet.com/arama.asp?kat=film&keyword=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://beyazperde.mynet.com/';
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getName
+ {
+ return "Beyaz Perde";
+ }
+
+ sub getAuthor
+ {
+ return 'Zuencap';
+ }
+
+ sub getLang
+ {
+ return 'TR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "utf-8";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm b/lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm
new file mode 100644
index 0000000..e0aff39
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCartelesPeliculasES.pm
@@ -0,0 +1,351 @@
+package GCPlugins::GCfilms::GCCartelesPeliculasES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginCartelesPeliculasES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if length($origtext) < 2;
+
+ # Código para procesar el resultado de la busqueda
+ if ($self->{parsingList}){
+ # Guardamos el título
+ if ($self->{inside}->{h3} && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ }
+ return;
+ }
+ # Codigo para el contenido de la ficha
+ else{
+ # Eliminamos espacios iniciales, espacios dobles y espacios finales del texto
+ $origtext =~ s/^\s*|\s{2,}|\s*$//g;
+ # Estamos procesando el titulo
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ return;
+ }
+ # Estamos en la puntuación
+ if ($self->{inside}->{strong} && ($origtext =~ /[0-5],[0-5][0-5]/))
+ {
+ $self->{curInfo}->{rating} = ($origtext/5)*10;
+ return;
+ }
+
+ # Procesamos el titulo original
+ if ($self->{isOrigTit} eq 1) {
+ $self->{isOrigTit} = 0;
+ # Indicamos que en el siguiente paso hay que leer año,pais,duracion
+ $self->{isOther} = 1;
+ # Reemplazamos la primera , por # y después obtenemos el texto
+ $origtext =~ s/,/#/;
+ $origtext =~ s/#.*//;
+ $self->{curInfo}->{original} = $origtext;
+ return;
+ }
+ # Procesamos Año, pais, duracion
+ if ($self->{isOther} eq 1) {
+ # Comprobamos si tiene el formato de año, pais, duración
+ if($origtext =~ /^(.*), (.*), (.*)$/){
+ $self->{isOther} = 0;
+ $self->{curInfo}->{date} = $1;
+ $self->{curInfo}->{country} = $2;
+ $self->{curInfo}->{time} = $3;
+ }
+ return;
+ }
+ # Procesamos los directores
+ if ($self->{isDirector} eq 1) {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{isDirector} = 0;
+ return;
+ }
+ # Actores
+ if ($self->{isActors} eq 1) {
+ $self->{curInfo}->{actors} = $origtext;
+ $self->{isActors} = 0;
+ }
+ # sinopsis
+ if ($self->{isSynopsis} eq 1) {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+
+ # Condiciones para procesar los campos en el siguiente ciclo
+ if($self->{inside}->{p}){
+ $self->{isOrigTit} = 1 if $origtext eq "akas:";
+ $self->{isDirector} = 1 if $origtext eq "Director:";
+ $self->{isActors} = 1 if $origtext eq "Intérpretes:";
+ $self->{isSynopsis} = 1 if $origtext eq "Sinopsis:";
+ return;
+ }
+
+ }
+ }
+
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ # Código para procesar el resultado de la busqueda para generar el listado
+ if ($self->{parsingList})
+ {
+ # Comprobamos si estamos dentro del marcador que inicia la info de un titulo
+ if( ($tagname eq "h3" ) && ($attr->{class} eq "entry-title" )){
+ # Indicamos que tenemos que se puede leer la info e incrementamos el número de resultados
+ $self->{itemIdx}++;
+ $self->{insideInfos} = 1 ;
+ return;
+ }
+ # Si estamos en un título y encontramos una tag a, es un enlace a ficha
+ if ($tagname eq "a" && $self->{insideInfos}){
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ return;
+ }
+
+ if(($tagname eq "div") && ($attr->{class} eq "entry-summary" ) && $self->{insideInfos}){
+ $self->{insideInfos} = 0;
+ return;
+ }
+ }
+ # Código para procesar la información de la pelicula seleccionada
+ else {
+ if ($tagname eq "h1"){
+ $self->{insideTitle} = 1;
+ return;
+ }
+ # Si estamos dentro de una imagen y no se ha asignado ninguna, la asignamos
+ if (($tagname eq "img") & !$self->{curInfo}->{image})
+ {
+ # Imágenes en cmg:
+ # Thumb http://www.cartelespeliculas.com/galeria/albums/003/thumbs_23p47303003.jpg
+ # ./../../galeria/albums/005/thumbs_23p43025005.jpg
+ # Normal: http://www.cartelespeliculas.com/galeria/albums/003/23p47303003.jpg
+ # Extraemos la dirección de la imagen a partir del thumb
+ if ($attr->{src} =~ /\.\/\.\.\/\.\.\/(galeria\/albums\/[0-9]*\/)thumbs_(.*)$/)
+ {
+ $self->{curInfo}->{image} = "http://www.cartelespeliculas.com/". $1 .$2;
+ }
+ return;
+ }
+ }
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Anulamos el html si coincide con el patron de no resultados
+ if($html =~ /^.*Lo sentimos, no se ha encontrado.*$/s){
+ $html = "";
+ return $html;
+ }
+
+ # Recorta el código del listado de resultados, quedandose solo con la parte que nos interesa del html
+ # el modificador s/.../$1/s trata el flujo como una sola cadena y reemplaza todo el cuerpo con la parte que nos interesa
+ if($html =~ s/^.*<ul class="hfeed posts-default clearfix">(.*)\t<\/li>\n\t\t<\/ul>.*$/$1/s){
+ return $html;
+ }
+
+ # Recorta el código de la ficha, quedandose solo con la parte que nos interesa del html
+ if($html =~ s/^.*<div id="content" class="section">\n\n\n\n\t\t(.*)<\/li>\n<\/ul>\n<\/div>.*$/$1/s){
+ return $html;
+ }
+ return $html;
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ #sub changeUrl
+ #{
+ # my ($self, $url) = @_;
+ # return $url;
+ #}
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ #sub getExtra
+ #{
+ # return 'Extra';
+ #}
+
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return "ES";
+ }
+
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return "DoVerMan";
+ }
+
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "CartelesPeliculas";
+ }
+
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ #sub getCharset
+ #{
+ # my $self = shift;
+ # # Charset de la web
+ # return "UTF-8";
+ #}
+
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.cartelespeliculas.com/wp/?s=" . $word;
+ }
+
+
+ # Constructor
+ sub new
+ {
+ # Inicialización
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ # Campos que devuelve el plugin (1 si, 0 no). Son los que apareceran
+ # en el listado de resultados
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 0
+ };
+
+ # Indica si estamos procesando información útil
+ $self->{insideInfos} = 0;
+
+ # Indican el estado del procesado del listado de resultados
+ $self->{insideTitle} = 0;
+
+ # Indican el estado del procesado del listado de resultados (0 no procesar, 1 es el siguiente, 2 procesando)
+ $self->{isOther} = 0;
+ $self->{isTitle} = 0;
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 0;
+ $self->{isActors} = 0;
+ $self->{isSynopsis} = 0;
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm b/lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm
new file mode 100644
index 0000000..26ce915
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCinemaClock.pm
@@ -0,0 +1,271 @@
+package GCPlugins::GCfilms::GCCinemaClock;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginCinemaClock;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~
+/http\:\/\/www\.CinemaClock\.com\/aw\/crva\.aw\/p\.clock\/r\.que\/m\.Montreal\/j\.f\/i\./
+ )
+ {
+ my $url = $attr->{href};
+ $url =~ s/http\:\/\/www\.CinemaClock\.com(.*)/$1/;
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($self->{curInfo}->{image} !~ /^\/images\/dvd\//)
+ {
+ if ($attr->{src} =~ /^\/images\/dvd\/med\/(.*)\.gif/)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com/images/dvd/" . $1 . ".jpg";
+ }
+ elsif ($attr->{src} =~ /^\/images\/dvd\//)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com" . $attr->{src};
+ }
+ elsif ($attr->{src} =~ /^\/images\/posters\//)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com" . $attr->{src};
+ }
+ elsif ($attr->{src} =~ /^\/images\//)
+ {
+ $self->{curInfo}->{image} =
+ "http://www.cinemaclock.com" . $attr->{src}
+ if !$self->{curInfo}->{image};
+ }
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideInfos} = 1 if $attr->{class} eq "informations";
+ $self->{insideName} = 1 if $attr->{class} eq "movietitle";
+ }
+ elsif ($tagname eq "p")
+ {
+ $self->{insideSynopsis} = 1 if $attr->{style} eq "text-align: justify";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} =
+ $self->capWord($origtext);
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($origtext =~ /\(([0-9]{4})\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideInfos})
+ {
+ if ($origtext =~ /Ann.e\:.(.*)/)
+ {
+ $self->{curInfo}->{date} = $1;
+ }
+ elsif ($origtext =~ /Pays\:.(.*)/)
+ {
+ $self->{curInfo}->{country} = $1;
+ }
+ elsif ($origtext =~ /Genre\:.(.*)/)
+ {
+ $self->{curInfo}->{genre} = $self->capWord($1);
+ $self->{curInfo}->{genre} =~ s/, /,/g;
+ }
+ elsif ($origtext =~ /Dur.e\:.(.*)/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ elsif ($origtext =~ /R.alis..par\:.(.*)/)
+ {
+ $self->{curInfo}->{director} = $1;
+ }
+ elsif ($origtext =~ /En.vedette\:.(.*)/)
+ {
+ $self->{curInfo}->{actors} = $1;
+ }
+ elsif ($origtext =~ /Classement\:.(.*)/)
+ {
+ $self->{curInfo}->{age} = 2 if $origtext =~ /G/;
+ $self->{curInfo}->{age} = $1 if $origtext =~ /([0-9]+)/;
+ }
+ elsif ($origtext =~ /Guide.parental\:.(.*)/)
+ {
+ $self->{curInfo}->{age} = 5 if $self->{curInfo}->{age} == 2;
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideName})
+ {
+ $origtext =~ s/"//g;
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($origtext =~ /Version fran.aise de(.*)/)
+ {
+ $self->{curInfo}->{original} = $1;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ #<<< keep perltidy away
+ $html =~ s{<b>|</b>}{}g;
+ $html =~ s{<a href="/aw/cpea\.aw/p\.clock/r\.que/m\.Montreal/j\.f/i\.[0-9]*/a\.[^"]*">([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<span class=arialb2>([^<]*)</span></td>[^<]*<td><span class=arial2>([^<]*)</span>}
+ {/<div class="informations">$1$2</div>}g;
+ $html =~ s{<span class=movietitle>([^<]*)</span>}
+ {<div class="movietitle">$1</div>};
+ $html =~ s{<font color=[^>]*>|</font>|<span class=[^>]*>|</span>}
+ {}g;
+ #>>>
+
+# $html =~ s/<a href="\/aw\/cpea\.aw\/p\.clock\/r\.que\/m\.Montreal\/j\.f\/i\.[0-9]*\/a\.[^"]*">([^<]*)<\/a>/$1/g;
+# $html =~ s/<span class=arialb2>([^<]*)<\/span><\/td>[^<]*<td><span class=arial2>([^<]*)<\/span>/<div class="informations">$1$2<\/div>/g;
+# $html =~ s/<span class=movietitle>([^<]*)<\/span>/<div class="movietitle">$1<\/div>/;
+# $html =~ s/<font color=[^>]*>|<\/font>|<span class=[^>]*>|<\/span>//g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.cinemaclock.com/aw/csra.aw?"
+ . "p=clock&r=que&m=Montreal&j=f&key=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.cinemaclock.com" . $url;
+ }
+
+ sub getName
+ {
+ return "CinemaClock.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm b/lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm
new file mode 100644
index 0000000..c90c91a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCinemotions.pm
@@ -0,0 +1,284 @@
+package GCPlugins::GCfilms::GCCinemotions;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginCinemotions;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'a')
+ {
+ if (($attr->{href} =~ /^\/modules\/Films\/fiche\//)
+ && ($attr->{class} eq "link4"))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ elsif (($tagname eq 'img') && (($attr->{src} =~ /^\/data\/films\//)
+ || ($attr->{src} =~ /^\/modules\/Films\/img\/webpasdaffiche\.jpg/)))
+ {
+ $self->{isMovie} = 0;
+ $self->{itemIdx}--;
+ }
+ elsif ($tagname eq 'font')
+ {
+ if ($attr->{class} eq 'link4dtext')
+ {
+ $self->{isInfo}=1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ if (($attr->{src} =~ m|/data/films/|)
+ && ($attr->{src} !~ m|/data/films/[^_]*_[0-9]{4}_[0-9]*\.jpg|)
+ && ($attr->{width} == 150))
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{image} =~ s/\/h200\//\//;
+ }
+ }
+ }
+ elsif ($tagname eq 'font')
+ {
+ $self->{insideOrig} = 1 if $attr->{class} eq 'titrevo_film';
+ $self->{insideInfos} = 1 if ($attr->{face} eq 'arial')
+ && ($attr->{size} eq '2');
+ $self->{insideArtists} = 1 if ($attr->{face} eq 'verdana,geneva,arial')
+ && ($attr->{size} eq '2');
+ $self->{insideSynopsis} = 1 if ($attr->{class} eq 'link6')
+ && ($self->{inside}->{fieldset})
+ && (!$self->{curInfo}->{synopsis});
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{insideOrig} = 1 if $attr->{style} eq 'color: #333333; font-size:13px';
+ }
+ elsif ($tagname eq 'br')
+ {
+ if ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= "\n";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ $self->{insideSynopsis} = 0 if $tagname eq 'font';
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+ $origtext =~ s/\s{2,}//g;
+ $origtext =~ s/\n*//g if !$self->{insideSynopsis};
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ if (($self->{inside}->{h1}) || ($self->{inside}->{h2}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ }
+ elsif ($self->{isInfo})
+ {
+ if (($origtext =~ /([0-9]{4}) - [0-9]*h[0-9]*/)
+ || ($origtext =~ /([0-9]{4}) - [0-9]* mn/))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1;
+ }
+ elsif ($origtext =~ /^\s*R.alisation : (.*)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{director} =$1;
+ }
+ elsif ($origtext =~ /^\s*avec (.*)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{actors} = $1;
+ $self->{isInfo} = 0; #$html =~ s|<br\s*/>|\n|g;
+
+ }
+ }
+ }
+ else
+ {
+ if ($self->{inside}->{h1}
+ && !$self->{curInfo}->{title})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext
+ if !$self->{curInfo}->{original};
+ $self->{insideOrig} = 0;
+ }
+ if ($self->{insideInfos})
+ {
+ if ($origtext =~ /([0-9]{4})- (.*?)- ([^-]*)(?:- (.*))?/)
+ {
+ my $date = $1, my $nat = $2, my $type = $3, my $time = $4;
+ $nat =~ s|/|, |g;
+ $type =~ s|/|,|g;
+
+ $self->{curInfo}->{date} = $date;
+ $self->{curInfo}->{country} = $nat;
+ $self->{curInfo}->{genre} = $type;
+ $self->{curInfo}->{time} = $time;
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideArtists})
+ {
+ if ($origtext =~ /R.alisation\s*:\s*(.*)/)
+ {
+ $self->{curInfo}->{director} = $1 if !$self->{curInfo}->{director};
+ }
+ elsif ($origtext =~ /avec\s*:?\s*(.*)/i)
+ {
+ if (!$self->{curInfo}->{actors})
+ {
+ $self->{curInfo}->{actors} = $1;
+ $self->{curInfo}->{actors} =~ s/\s*\(([^\)]*)\)\s*/;$1/g;
+ }
+ }
+ $self->{insideArtists} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $html =~ s/<!--[^-]*-->//g;
+ $html =~ s/<b>|<\/b>//g;
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/\\'//g;
+ $html =~ s|<A HREF="/modules/Artistes/fiche/[0-9]*[^>]*>(.*?)</A>|$1|gi;
+ $html =~ s/<font class=link_news_2>([^<]*)<\/font>/$1/gi;
+ $html =~ s/<font class=link4dtext>([^<]*)<br>([^<]*)<\/TD>/<font class=link4dtext>$1 $2<\/font><\/TD>/gi;
+ $html =~ s|<h1>Oops\!</h1>||gi;
+
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.cinemotions.com/recherche/$word.html"
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.cinemotions.com' . $url;
+ }
+
+ sub getName
+ {
+ return 'Cinemotions.com';
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm b/lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm
new file mode 100644
index 0000000..ea84b45
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCsfd.pm
@@ -0,0 +1,699 @@
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCfilms::GCCsfd;
+
+###################################################
+#
+# Copyright 2005-2009 Tian
+# Copyright 2007,2011 Petr Gajdůšek <gajdusek.petr@centrum.cz>
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+#use warnings;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginCsfd;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchCharset
+ # Charset of search term
+ sub getSearchCharset
+ {
+ return 'UTF-8';
+ }
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.csfd.cz/hledat/?q=$word";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of a movie page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ $url = "http://www.csfd.cz" . $url if ($url !~ /^http:/);
+ return $url;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ #sub getCharset {
+ # my $self = shift;
+ #
+ # return "UTF-8";
+ #}
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "CSFD.cz";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Petr Gajdůšek';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'CS';
+ }
+
+ # hasSearchYear
+ # Used to hide year column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchYear
+ {
+ return 1;
+ }
+
+ # hasSearchDirector
+ # Used to hide director column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchDirector
+ {
+ return 1;
+ }
+
+ # hasSearchActors
+ # Used to hide actors column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchActors
+ {
+ return 1;
+ }
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+
+ return 'Žánr';
+ }
+
+ # changeUrl
+ # Can be used to change URL if movie URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{parsingEnded} = 0;
+ if ($self->{parsingList})
+ {
+ # Search results
+
+ # Initial values for search results parsing
+ # There are two movies list:
+ # First with detailed info (title, genre, origin country, year, directors, actors)
+ # Second with brief list of other movies (title, year)
+
+ # We are in brief list containing other movies without details
+ $self->{insideOtherMovies} = 0;
+ # Movie link; movie's details follow if not in brief list
+ $self->{isMovie} = 0;
+
+ ## Details:
+
+ # Movie's details will follow: Genre, origin, actors, directors, year
+ $self->{insideDetails} = 0;
+ # In movie's details after paragraph with Genre, origin and date
+ $self->{wasDetailsInfo} = 0;
+ # In movie's details: directors and actors
+ $self->{directors} = ();
+ $self->{directorsCounter} = 0;
+ $self->{actors} = ();
+ $self->{actorsCounter} = 0;
+ $self->{insideDirectors} = 0;
+ $self->{insideActors} = 0;
+
+ # Movie year
+ $self->{isYear} = 0;
+
+ ## Preprocess
+
+ # directors and actors
+ $html =~ s/\n\s*Režie:\s([^\n]*)/<div class="directors">$1<\/div>/g;
+ $html =~ s/\n\s*Hrají:\s([^\n].*)/<div class="actors">$1<\/div>/g;
+ # year
+ $html =~ s/<span class="film-year">\(([0-9]+)\)<\/span>/<span class="film-year">$1<\/span>/g;
+ }
+ else
+ {
+ # Movie page
+
+ # Initial values for search results parsing
+
+ # array containg other movie titles (not exported to GCStar)
+ $self->{titles} = ();
+ # in list containing other movie titles
+ $self->{isTitles} = 0;
+ # in the original title (title for same country as movie's origin)
+ $self->{isOrigTitle} = 0;
+ # original title (if not set during parsing it will be set to main title at the end)
+ $self->{origTitle} = undef;
+ $self->{titlesCounter} = 0;
+
+ $self->{insideGenre} = 0;
+
+ $self->{awaitingSynopsis} = 0;
+ $self->{insideSynopsis} = 0;
+
+ # inside details with country, date (year) and time (length)
+ $self->{insideInfo} = 0;
+
+ $self->{insideRating} = 0;
+
+ # User comments
+ # Each comment consists of commenter (user) and his comment
+
+ $self->{insideCommentAuthor} = 0;
+ $self->{awaitingComment} = 0;
+ $self->{insideComment} = 0;
+
+ # In directors and actors
+ $self->{insideDirectors} = 0;
+ $self->{insideActors} = 0;
+ $self->{directors} = ();
+ $self->{directorsCounter} = 0;
+ $self->{actors} = ();
+ $self->{actorsCounter} = 0;
+
+ ## Preprocess
+
+ # removee <br /> and <br>
+ $html =~ s/<br( \/)?>/\n/g;
+ ## Synopsis
+ # remove list bullet
+ $html =~ s/<img src="http:\/\/img.csfd.cz\/sites\/web\/images\/common\/li.gif"[^>]*>//g;
+ # remove hyperlink to user profile
+ $html =~ s/(&nbsp;<span class="source[^\(]*\()<a[^>]*>([^<]*)<\/a>/$1uživatel $2/g;
+ # remove <span></span> around synopsis source
+ $html =~ s/&nbsp;<span class="source[^\(]*\(([^\)]*)\)<\/span>/\n-- $1/g;
+ $html =~ s/<div data-truncate="570">([^<]*)<\/div>/$1/g;
+ }
+ return $html;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a movie information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{movieIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill (if available) following fields:
+ #
+ # $self->{movieList}[$self->{movieIdx}]->{title}
+ # $self->{movieList}[$self->{movieIdx}]->{url}
+ # $self->{movieList}[$self->{movieIdx}]->{actors}
+ # $self->{movieList}[$self->{movieIdx}]->{director}
+ # $self->{movieList}[$self->{movieIdx}]->{date}
+ # $self->{movieList}[$self->{movieIdx}]->{extra}
+
+ # When processing a movie page, you need to fill the fields (if available) in $self->{curInfo}. They are:
+ #
+ # $self->{curInfo}->{title}
+ # $self->{curInfo}->{director}
+ # $self->{curInfo}->{original} (Original title)
+ # $self->{curInfo}->{actors}
+ # $self->{curInfo}->{genre} (Comma separated list of movie type)
+ # $self->{curInfo}->{country} (Movie Nationality or country)
+ # $self->{curInfo}->{date}
+ # $self->{curInfo}->{time}
+ # $self->{curInfo}->{synopsis}
+ # $self->{curInfo}->{image}
+ # $self->{curInfo}->{audio}
+ # $self->{curInfo}->{subt}
+ # $self->{curInfo}->{age} 0 : No information
+ # 1 : Unrated
+ # 2 : All audience
+ # 5 : Parental Guidance
+ # >= 10 : Minimum age value
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+
+ # in brief list of other movies (without details)
+ if ($tagname eq "ul" and $attr->{class} eq "films others")
+ {
+ $self->{insideOtherMovies} = 1;
+ }
+
+ # in link to movie page
+ if ($tagname eq "a" and $attr->{href} =~ m/\/film\/[0-9]+-.*/)
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ $self->{insideDetails} = 1 if ($self->{insideOtherMovies} != 1);
+ $self->{wasDetailsInfo} = 0;
+ }
+
+ # directors and actors
+ if ($tagname eq "div")
+ {
+ $self->{insideDirectors} = 1 if ($attr->{class} eq "directors");
+ $self->{insideActors} = 1 if ($attr->{class} eq "actors");
+ }
+
+ # year
+ if ($tagname eq "span")
+ {
+ $self->{isYear} = 1 if ($attr->{class} eq "film-year");
+ }
+ }
+ else
+ {
+
+ # Synopsis
+ if ( $tagname eq "div"
+ and $attr->{class} eq "content"
+ and $self->{awaitingSynopsis})
+ {
+ $self->{insideSynopsis} = 1;
+ $self->{awaitingSynopsis} = 0;
+ }
+
+ # Poster
+ if ( $tagname eq "img"
+ and $attr->{src} =~ /^http:\/\/img\.csfd\.cz\/posters\//)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+
+ # Original name and other names
+ if ($tagname eq "ul" and $attr->{class} eq "names")
+ {
+ $self->{isTitles} = 1;
+ }
+
+ if ($tagname eq "img" and $self->{isTitles})
+ {
+ $self->{isOrigTitle} = 1 if ($attr->{alt} !~ /název$/);
+ $self->{isSKTitle} = 1 if ($attr->{alt} =~ /SK název$/);
+ }
+
+ # Genre
+ if ($tagname eq "p" and $attr->{class} eq "genre")
+ {
+ $self->{insideGenre} = 1;
+ }
+
+ # Info (country ,date, time = duration)
+ if ($tagname eq "p" and $attr->{class} eq "origin")
+ {
+ $self->{insideInfo} = 1;
+ }
+
+ # Rating
+ if ($tagname eq "h2" and $attr->{class} eq "average")
+ {
+ $self->{insideRating} = 1;
+ }
+
+ # Comments
+ if ($tagname eq "h5" and $attr->{class} eq "author")
+ {
+ $self->{insideCommentAuthor} = 1;
+ }
+ if ($self->{awaitingComment} and $tagname eq "p" and $attr->{class} eq "post")
+ {
+ $self->{awaitingComment} = 0;
+ $self->{insideComment} = 1;
+ }
+
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+
+ # movie details
+ $self->{insideDetails} = 0
+ if ($tagname eq "div")
+ and $self->{insideDetails};
+
+ # directors and actors
+ if ($tagname eq "div")
+ {
+ if ($self->{insideDirectors})
+ {
+ $self->{insideDirectors} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} =
+ join(', ', @{$self->{directors}});
+ $self->{directors} = ();
+ $self->{directorsCounter} = 0;
+ }
+ if ($self->{insideActors})
+ {
+ $self->{insideActors} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} =
+ join(', ', @{$self->{actors}});
+ $self->{actors} = ();
+ $self->{actorsCounter} = 0;
+ }
+ }
+ }
+ else
+ {
+
+ # Synopsis
+ $self->{insideSynopsis} = 0 if ($tagname eq "div");
+
+ # Titles
+ if ($tagname eq "ul" and $self->{isTitles})
+ {
+ $self->{isTitles} = 0;
+ }
+
+ if ( $tagname eq "body" )
+ {
+ $self->{curInfo}->{original} ||= $self->{curInfo}->{title};
+ }
+
+ # Actors
+ if ($tagname eq "div" and $self->{insideActors})
+ {
+ $self->{curInfo}->{actors} = join(', ', @{$self->{actors}});
+ $self->{insideActors} = 0;
+ }
+
+ # Directors
+ if ($tagname eq "div" and $self->{insideDirectors})
+ {
+ $self->{curInfo}->{director} = join(', ', @{$self->{directors}});
+ $self->{insideDirectors} = 0;
+ }
+
+ # Comment
+
+ $self->{insideCommentAuthor} = 0
+ if ($tagname eq "h5" and $self->{insideCommentAuthor});
+
+ if ($tagname eq "li" and $self->{isComment})
+ {
+ $self->{curInfo}->{comment} .= "\n";
+ $self->{isComment} = 0;
+ }
+
+ # Debug
+ if ($tagname eq "body" and $self->{debug})
+ {
+ use Data::Dumper;
+ print Dumper $self->{curInfo};
+ }
+ }
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+ $origtext =~ s/^\s+|\s+$//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{h1} && $origtext !~ m/Vyhledávání/i)
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+
+ # Movie title
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ return;
+ }
+
+ # Date (year)
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $origtext;
+ $self->{isYear} = 0;
+ }
+
+ # Extra movie info: genre, origin, date
+ elsif ( $self->{inside}->{p}
+ and $self->{insideDetails}
+ and $self->{wasDetailsInfo} == 0)
+ {
+ my @tmp = split(', ', $origtext);
+ my $pos = $#tmp;
+ my ($year, $country, $genre) = (undef, undef, undef);
+ $year = $tmp[$pos] if ($tmp[$pos] =~ /^\d+$/);
+ $pos--;
+ $country = $tmp[$pos] if ($pos >= 0);
+ $pos--;
+ $genre = $tmp[$pos] if ($pos >= 0);
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $year if (defined $year);
+ $self->{itemsList}[ $self->{itemIdx} ]->{country} = $country
+ if (defined $country);
+ $self->{itemsList}[ $self->{itemIdx} ]->{extra} = $genre
+ if (defined $genre);
+ $self->{wasDetailsInfo} = 1;
+ }
+
+ # Directors
+ elsif ($self->{inside}->{a} and $self->{insideDirectors})
+ {
+ push @{$self->{directors}}, $origtext;
+ $self->{directorsCounter}++;
+ }
+
+ # Actors
+ elsif ($self->{inside}->{a} and $self->{insideActors})
+ {
+ push @{$self->{actors}}, $origtext;
+ $self->{actorsCounter}++;
+ }
+ }
+ else
+ {
+
+ # Movie titles
+ if ($self->{inside}->{h1})
+ {
+ $self->{curInfo}->{title} = $origtext
+ if !$self->{curInfo}->{title};
+ }
+ if ($self->{inside}->{h3} and $self->{isTitles})
+ {
+ $self->{titlesCounter}++;
+ $self->{titles}[ $self->{titlesCounter} ] = $origtext;
+ if ($self->{isOrigTitle})
+ {
+ $self->{curInfo}->{original} ||= $origtext;
+ $self->{isOrigTitle} = 0;
+ }
+ if ($self->{isSKTitle} and $self->{lang} eq "SK")
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isSKTitle} = 0;
+ }
+ }
+
+ # Genre
+ if ($self->{insideGenre})
+ {
+ $origtext =~ s/ \/ /,/g;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+
+ # Extra movie info: country, date (year), time
+ if ($self->{insideInfo})
+ {
+ my ($country, $year, $time) = split(', ', $origtext);
+ $country =~ s/ \/ /,/g;
+
+ $self->{curInfo}->{country} = $country;
+ $self->{curInfo}->{date} = $year;
+ $self->{curInfo}->{time} = $time;
+
+ $self->{insideInfo} = 0;
+ }
+
+ # Directors and Actors
+ if ($self->{inside}->{h4})
+ {
+ $self->{insideDirectors} = 1 if ($origtext =~ /^Režie:/);
+ $self->{insideActors} = 1 if ($origtext =~ /^Hrají:/);
+ }
+
+ if ($self->{inside}->{a} and $self->{insideDirectors})
+ {
+ push @{$self->{directors}}, $origtext;
+ $self->{directorsCounter}++;
+ }
+ if ($self->{inside}->{a} and $self->{insideActors})
+ {
+ #push @{$self->{curInfo}->{actors}}, [$origtext]
+ # if ($self->{actorsCounter} <
+ # $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ #$self->{actorsCounter}++;
+ push @{$self->{actors}}, $origtext;
+ $self->{actorsCounter}++;
+ }
+
+ # Synopsis
+ if ($self->{inside}->{h3})
+ {
+ $self->{awaitingSynopsis} = 1 if ($origtext eq "Obsah");
+ }
+ if ($self->{inside}->{li} and $self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext . "\n\n\n";
+ }
+
+ # Rating
+ if ($self->{insideRating})
+ {
+ $origtext =~ s/([0-9]+)%/$1/;
+ $self->{curInfo}->{ratingpress} = int($origtext / 10 + .5)
+ if ($origtext ne "");
+ $self->{insideRating} = 0;
+ }
+
+ # Comments
+ if ($self->{inside}->{a} and $self->{insideCommentAuthor})
+ {
+ $self->{curInfo}->{comment} .= $origtext . " napsal(a):\n";
+ $self->{awaitingComment} = 1;
+ }
+ if ($self->{insideComment})
+ {
+ $self->{curInfo}->{comment} .= $origtext . "\n\n";
+ $self->{insideComment} = 0;
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # Do your init stuff here
+
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ country => 1
+ };
+
+ $self->{lang} = "CS";
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ $self->{debug} = ($ENV{GCS_DEBUG_PLUGIN_PHASE} > 0);
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm b/lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm
new file mode 100644
index 0000000..55c6692
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCCulturalia.pm
@@ -0,0 +1,241 @@
+package GCPlugins::GCfilms::GCCulturalia;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginCulturalia;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ /^\.\.\/art\/ver\.php\?art=/)
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /\.\.\/(imatges\/articulos\/[0-9]*-1\.jpg)/)
+ {
+ $self->{curInfo}->{image} = "http://www.culturalianet.com/" . $1;
+ }
+ }
+ elsif ($tagname eq "font")
+ {
+ $self->{insideName} = 1 if $attr->{class} eq "titulo2";
+ $self->{insideInfos} = 1 if $attr->{class} eq "titulo3";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ if ($origtext =~ /De ([^\(]*) \(([0-9]{4})\)/)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"director"} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $2;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ }
+ else
+ {
+ $origtext =~ s/\.$//;
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext if !$self->{itemsList}[$self->{itemIdx}]->{"title"};
+ }
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ $origtext =~ s/\n//g if !$self->{insideSynopsis};
+
+ if ($self->{insideName})
+ {
+ if ($origtext =~ /([^\(]*)\. \(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ }
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideInfos})
+ {
+ $origtext =~ s/ , //;
+ $origtext =~ s/(, )*$//;
+ if ($origtext =~ /Género\:(.*)/)
+ {
+ ($self->{curInfo}->{genre} = $1) =~ s/ \/ /,/g;
+ }
+ elsif ($origtext =~ /Nacionalidad\:(.*)/)
+ {
+ $self->{curInfo}->{country} = $1;
+ }
+ elsif ($origtext =~ /Director\:(.*)/)
+ {
+ $self->{curInfo}->{director} = $1;
+ }
+ elsif ($origtext =~ /Actores\:(.*)/)
+ {
+ $self->{curInfo}->{actors} = $1;
+ }
+ elsif ($origtext =~ /Sinopsis\:(.*)/)
+ {
+ ($self->{curInfo}->{synopsis} = $1) =~ s/, //;
+ }
+ elsif ($origtext =~ /Duración\:(.*)/)
+ {
+ ($self->{curInfo}->{time} = $1) =~ s/\.$//;
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($origtext =~ /^Sinopsis\:(.*)/)
+ {
+ ($self->{curInfo}->{synopsis} = $1) =~ s/, //;
+ $self->{curInfo}->{synopsis} =~ s/(, )*$//;
+ }
+ if ($self->{inside}->{i})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s{</?b>}{}g;
+ $html =~ s/<br>/, /g;
+ $html =~ s{<a href=\.\./art/ver_e\.php\?nombre=[0-9]*>([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<font class.=..titulo3.>([^<]*)</font>([^<]*)}
+ {<font class ='titulo3'>$1 $2</font>}g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.culturalianet.com/bus/resu.php?texto=$word&donde=1";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.culturalianet.com/bus/" . $url;
+ }
+
+ sub getName
+ {
+ return "CulturaliaNet";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "Windows-1252";
+ }
+
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm b/lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm
new file mode 100644
index 0000000..a32a7a8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDVDEmpire.pm
@@ -0,0 +1,427 @@
+package GCPlugins::GCfilms::GCDVDEmpire;
+
+###################################################
+#
+# Copyright 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginDVDEmpire;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start {
+ my ( $self, $tagname, $attr, $attrseq, $origtext ) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ( $self->{parsingList} ) {
+ if ( $self->{outOfMovieList} )
+ {
+ return;
+ }
+ elsif (( $self->{inMovieList} )
+ && ( $self->{inMovie} eq 0 )
+ && ( $tagname eq 'a' )
+ && ( $attr->{href} =~ /^(\/Exec\/v4_item.asp\?item_id=[0-9]*)$/ ) )
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{inMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (( $self->{inMovie} )
+ && ( $tagname eq 'img' )
+ && ( $attr->{src} =~ /(.*gen\/movies\/[0-9]*t.jpg)/ ) )
+ {
+ (my $image = $attr->{src}) =~ s/t.jpg$/h.jpg/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{image} = $image;
+ }
+ elsif (( $self->{inMovie} )
+ && ( $tagname eq 'a' )
+ && ( $attr->{href} =~ /cast_id/ ) )
+ {
+ $self->{isActors} = 1;
+ }
+ elsif (( $self->{inMovie} )
+ && ( $tagname eq 'td' )
+ && ( $attr->{bgcolor} eq '#D7DDE7' ) )
+ {
+ $self->{inMovie} = 0;
+ }
+ elsif (( $tagname eq 'div' )
+ && ( $attr->{id} eq 'Search_Container' ) )
+ {
+ $self->{inMovieList} = 1;
+ }
+ elsif ( ( $self->{inMovieList} )
+ && ( $tagname eq 'endsearch' ))
+ {
+ $self->{inMovieList} = 0;
+ $self->{outOfMovieList} = 1;
+ }
+ }
+ else {
+ if ( $self->{parsingEnded} )
+ {
+ if (!$self->{infoSet})
+ {
+ $self->{curInfo}->{image} = $self->{itemsList}[$self->{wantedIdx}]->{image};
+ $self->{curInfo}->{date} = $self->{itemsList}[$self->{wantedIdx}]->{date}; #"short text"
+ $self->{curInfo}->{time} = $self->{itemsList}[$self->{wantedIdx}]->{time}; #"short text"
+ $self->{curInfo}->{age} = $self->{itemsList}[$self->{wantedIdx}]->{age}; #"options"
+ ($self->{curInfo}->{backpic} = $self->{curInfo}->{image}) =~ s/h.jpg/b.jpg/; #"image"
+
+ $self->{infoSet} = 1;
+ }
+ return;
+ }
+ elsif ( ($tagname eq 'div')
+ && ($attr->{id} eq 'Search_Container') )
+ {
+ $self->{isContent} = 1;
+ }
+ elsif ( ( $self->{isContent} )
+ && ( $tagname eq 'div' ) )
+ {
+ $self->{inNonContentDiv} = 1;
+ }
+ elsif ( $self->{isContent})
+ {
+ if ( ($tagname eq 'td')
+ && ($attr->{class} eq 'fontxlarge') )
+ {
+ $self->{isTitle} = 1 ;
+ }
+ elsif ($tagname eq 'rating')
+ {
+ $self->{isRating} = 1 ;
+ }
+ elsif ($tagname eq 'actors')
+ {
+ $self->{isActors} = 1 ;
+ }
+ elsif ( ($self->{isActors})
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /v4_list_cast.asp/) )
+ {
+ $self->{isActor} = 1 ;
+ }
+ elsif ($tagname eq 'directors')
+ {
+ $self->{isDirectors} = 1 ;
+ }
+ elsif ( ($self->{isDirectors})
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /v4_list_cast.asp/) )
+ {
+ $self->{isDirector} = 1 ;
+ }
+ elsif ($tagname eq 'genres')
+ {
+ $self->{isGenres} = 1 ;
+ }
+ elsif ( ($self->{isGenres})
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /v2_category.asp/) )
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif ($tagname eq 'audio')
+ {
+ $self->{inAudio} = 1 ;
+ }
+ elsif ( ($self->{inAudio})
+ && ($tagname eq 'td') )
+ {
+ $self->{isAudio} = 1 ;
+ }
+ elsif ( ($self->{isTitle})
+ && ($tagname eq 'strong') )
+ {
+ $self->{isTitle} = 2 ;
+ }
+ elsif ( ($self->{startSynopsis})
+ && ($tagname eq 'td') )
+ {
+ $self->{isSynopsis} = 1 ;
+ }
+ elsif ( ($self->{isSynopsis})
+ && ($tagname eq 'br') )
+ {
+ $self->{synopsisLineBreak} = 1 ;
+ }
+ }
+ }
+ }
+
+ sub end {
+ my ( $self, $tagname ) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ( !$self->{parsingList} )
+ {
+ if ( $self->{parsingEnded} )
+ {
+ return;
+ }
+ if ($self->{isContent})
+ {
+ if ( ( $tagname eq 'div' )
+ && ( !$self->{inNonContentDiv} ) )
+ {
+ $self->{isContent} = 0;
+ $self->{parsingEnded} = 1;
+ }
+ elsif ( ( $tagname eq 'div' )
+ && ( $self->{inNonContentDiv} ) )
+ {
+ $self->{inNonContentDiv} = 0;
+ }
+ elsif ( ( $tagname eq 'table' )
+ && ( $self->{isSynopsis} ) )
+ {
+ $self->{startSynopsis} = 0;
+ $self->{SynopsisEnded} = 1;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ( ($self->{isActors} ) && ($tagname eq 'actors') )
+ {
+ $self->{isActors} = 0 ;
+ }
+ elsif ( ($self->{isGenres} ) && ($tagname eq 'genres') )
+ {
+ $self->{isGenres} = 0 ;
+ }
+ elsif ( ($self->{isDirectors} ) && ($tagname eq 'directors') )
+ {
+ $self->{isDirectors} = 0 ;
+ }
+ elsif ( ($self->{isAudio})
+ && ($tagname eq 'td') )
+ {
+ $self->{isAudio} = 0 ;
+ $self->{inAudio} = 0 ;
+ }
+ }
+ }
+
+ }
+
+ sub text {
+ my ( $self, $origtext ) = @_;
+
+ if ( $self->{parsingList} )
+ {
+ if ( ( $self->{inMovieList} ) && ( $self->{isMovie} ) )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ }
+ elsif ( ( $self->{inMovie} ) && ( $origtext =~ /([^~]*)~~~([0-9]*)mins.~~~Release Date:[^~]*~~~Prod Year: ([0-9]{4})/ ) )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 1
+ if ( $1 eq 'Unrated' ) || ( $1 eq 'Open' );
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 2
+ if ( $1 eq 'G' ) || ( $1 eq 'Approved' );
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 5
+ if ( $1 eq 'PG' ) || ( $1 eq 'M' ) || ( $1 eq 'GP' );
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 13
+ if $1 eq 'PG-13';
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 17
+ if $1 eq 'R';
+ $self->{itemsList}[ $self->{itemIdx} ]->{age} = 18
+ if ( $1 eq 'NC-17' ) || ( $1 eq 'X' );
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{time} = $2 . ' min';
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $3;
+ }
+ elsif ( ( $self->{inMovie} ) && ( $self->{isActors} ) )
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} .= $origtext . ', ';
+ $self->{isActors} = 0;
+ }
+ }
+ else {
+ $origtext =~ s/^\s*//;
+
+ return if !$origtext;
+ if ( $self->{parsingEnded} )
+ {
+ return;
+ }
+ if ($self->{isContent})
+ {
+ if ( $self->{isTitle} eq 2)
+ {
+ $self->{curInfo}->{title} = $origtext; #"short text"
+ $self->{curInfo}->{original} = $origtext; #"short text"
+ $self->{isTitle} = 0 ;
+ }
+ elsif ( $self->{isRating})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext * 2); #"number"
+ $self->{isRating} = 0 ;
+ }
+ elsif ( ( !$self->{SynopsisEnded} )
+ && ( $origtext eq 'Synopsis' ) )
+ {
+ $self->{startSynopsis} = 1 ;
+ }
+ elsif ( $self->{isSynopsis} )
+ {
+ $self->{curInfo}->{synopsis} .= "\n\n" if $self->{synopsisLineBreak};
+ $self->{curInfo}->{synopsis} .= $origtext ; #"long text"
+ $self->{curInfo}->{synopsis} .= " " if $self->{synopsisLineBreak};
+ $self->{synopsisLineBreak} = 0 ;
+ }
+ elsif ( $self->{isActor} )
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{isActor} = 0 ;
+ }
+ elsif ( $self->{isGenre} )
+ {
+ push @{$self->{curInfo}->{genre}}, [$origtext];
+ $self->{isGenre} = 0 ;
+ }
+ elsif ( $self->{isDirector} )
+ {
+ $self->{curInfo}->{director} .= $origtext; #"long text"
+ $self->{isDirector} = 0 ;
+ $self->{isDirectors} = 0 ;
+ }
+ elsif ( $self->{isAudio} )
+ {
+ (my $language = $origtext) =~ s/([^:]*):(.*)/$1/ ;
+ my $audio = $2 ;
+ $language =~ s/\s// ;
+ $audio =~ s/\r// ;
+ push @{$self->{curInfo}->{audio}}, [$language, $audio];
+ }
+ }
+ }
+ }
+
+ sub new {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless( $self, $class );
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ actors => 1,
+ age => 1,
+ time => 1,
+ image => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{inMovie} = 0;
+ $self->{isContent} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess {
+ my ( $self, $html ) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s/<\/nobr>[ ]*~[ ]*<nobr>/~~~/g ;
+ $html =~ s/<b>Phone #:<\/b>/<endsearch>here<\/endsearch>/g ;
+
+ }
+ else
+ {
+ $html =~ s/<b>([0-9\.]*)<\/b> out of <b>5<\/b>/<rating>$1<\/rating>/g ; #/
+ $html =~ s/<b>Actors:<\/b>/<actors>/g ;
+ $html =~ s/<b>Writers:<\/b>/<\/actors>/g ;
+ $html =~ s/<b>Directors:<\/b>(.*cast_id[^\/]*<\/a>)/<directors>$1<\/directors>/g ; #/
+ $html =~ s/<b>Genre<\/b>(.*cat_id[^\/]*<\/a>)/<genres>$1<\/genres>/g ; #/
+ $html =~ s/<b>Audio:<\/b>/<audio><\/audio>/g ;
+ $html =~ s/<font face='[^']*' size='[^']*' color='#FFFFFF'>i<\/font>/ /g ;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl {
+ my ( $self, $word ) = @_;
+
+ my $searchvalue = 32 ;
+ my $strictmatching = 0;
+ if ($strictmatching)
+ {
+ $searchvalue = 64 ;
+ }
+ return "http://www.dvdempire.com/Exec/v1_search_all.asp?string=$word&pp=5&search_refined=$searchvalue";
+ }
+
+ sub getItemUrl {
+ my ( $self, $url ) = @_;
+
+ return 'http://www.dvdempire.com/' . $url;
+ }
+
+ sub changeUrl {
+ my ( $self, $url ) = @_;
+
+ return $url;
+ }
+
+ sub getName {
+ return "DVDEmpire (EN)";
+ }
+
+ sub getCharset {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor {
+ return 'FiXx';
+ }
+
+ sub getLang {
+ return 'EN';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm b/lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm
new file mode 100644
index 0000000..d75c2f6
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDVDFr.pm
@@ -0,0 +1,374 @@
+package GCPlugins::GCfilms::GCDVDFr;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginDVDFr;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'dvd')
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ elsif ($tagname eq 'id')
+ {
+ $self->{isID} = 1;
+ }
+ elsif ($tagname eq 'fr')
+ {
+ $self->{isTitleFR} = 1;
+ }
+ elsif (($tagname eq 'star') && ($attr->{type} =~ /R.alisateur/))
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif ($tagname eq "media")
+ {
+ $self->{isMedia} = 1;
+ }
+ elsif ($tagname eq "edition")
+ {
+ $self->{isEdition} = 1;
+ }
+ }
+ else
+ {
+ if (($tagname eq "cover") || ($tagname eq "jaquette"))
+ {
+ $self->{insideImage} = 1;
+ }
+ elsif ($tagname eq "url")
+ {
+ $self->{insideURL} = 1;
+ }
+ elsif (($tagname eq "fr") || ($tagname eq "titres_fr"))
+ {
+ $self->{insideTitleFR} = 1;
+ }
+ elsif (($tagname eq "vo") || ($tagname eq "titres_vo"))
+ {
+ $self->{insideTitleVO} = 1;
+ }
+ elsif ($tagname eq "pays")
+ {
+ $self->{insideNat} = 1;
+ }
+ elsif ($tagname eq "annee")
+ {
+ $self->{insideYear} = 1;
+ }
+ elsif ($tagname eq "synopsis")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($tagname eq "duree")
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif ($tagname eq "realisateur")
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($tagname eq "star")
+ {
+ $self->{insideDirector} = 1 if $attr->{type} eq "Réalisateur";
+ $self->{insideActors} = 1
+ if (! $attr->{type}) || ($attr->{type} eq "Acteur");
+ }
+ elsif ($tagname eq "categorie")
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif ($tagname eq "rating")
+ {
+ $self->{curInfo}->{age} = 2 if $attr->{id} == 1;
+ $self->{curInfo}->{age} = 5 if $attr->{id} == 2;
+ $self->{curInfo}->{age} = 12 if $attr->{id} == 3;
+ $self->{curInfo}->{age} = 13 if $attr->{id} == 4;
+ $self->{curInfo}->{age} = 16 if $attr->{id} == 5;
+ $self->{curInfo}->{age} = 18 if $attr->{id} > 5;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if (length($origtext) < 2) && (! $self->{isID});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isID})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.dvdfr.com/api/dvd.php?id=$origtext";
+ $self->{isID} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"director"} .= $self->{itemsList}[$self->{itemIdx}]->{"director"} ? ", " . $origtext : $origtext
+ if ($self->{directorCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_DIRECTORS);
+ $self->{directorCounter}++;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{directorCounter} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isTitleFR})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{"title"} = $origtext;
+ $self->{isTitleFR} = 0;
+ }
+ elsif ($self->{isMedia})
+ {
+ $origtext = '' if $origtext !~ /\w/;
+ $self->{itemsList}[$self->{itemIdx}]->{"format"} = $origtext;
+ $self->{isMedia} = 0;
+ }
+ elsif ($self->{isEdition})
+ {
+ $origtext = '' if $origtext !~ /\w/;
+ $self->{itemsList}[$self->{itemIdx}]->{"extra"} = $origtext;
+ $self->{isEdition} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideImage})
+ {
+ if ($origtext =~ m|/microapp/jaquette.php\?id=([0-9]*)|)
+ {
+ my $dir = int($1 / 1000);
+ $self->{curInfo}->{image} = "http://dvdfr.com/images/dvd/cover_200x280/$dir/$1.jpg";
+ }
+ else
+ {
+ $self->{curInfo}->{image} = $origtext;
+ }
+ $self->{insideImage} = 0;
+ }
+ elsif ($self->{insideURL})
+ {
+ $self->{curInfo}->{$self->{urlField}} = $origtext;
+ $self->{insideURL} = 0;
+ }
+ elsif ($self->{insideTitleFR})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitleFR} = 0;
+ }
+ elsif ($self->{insideTitleVO})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideTitleVO} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} .= $self->{curInfo}->{country} ? ", " . $origtext : $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideYear} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{curInfo}->{synopsis} =~ s/\n/ /g;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} .= $self->{curInfo}->{director} ? ", " . $origtext : $origtext
+ if ($self->{directorCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_DIRECTORS);
+ $self->{directorCounter}++;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{curInfo}->{actors} .= $self->{curInfo}->{actors} ? ", " . $origtext : $origtext
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $self->{curInfo}->{genre} .= $self->{curInfo}->{genre} ? "," . $origtext : $origtext;
+ $self->{insideGenre} = 0;
+ }
+ elsif (($self->{inside}->{track}) && ($self->{inside}->{langue}))
+ {
+ if ($self->{curInfo}->{audio} !~ /(^|,)$origtext(,|$)/)
+ {
+ $self->{curInfo}->{audio} .= ',' if $self->{curInfo}->{audio};
+ $self->{curInfo}->{audio} .= $origtext;
+ }
+ }
+ elsif (($self->{inside}->{soustitrage}) && ($self->{inside}->{soustitre}))
+ {
+ if ($self->{curInfo}->{subt} !~ /(^|,)$origtext(,|$)/)
+ {
+ $self->{curInfo}->{subt} .= ',' if $self->{curInfo}->{subt};
+ $self->{curInfo}->{subt} .= $origtext;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 1,
+ actors => 0,
+ format => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{directorCounter} = 0;
+ $self->{actorsCounter} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word = 'ean:'.$word
+ if $word =~ /^[\dX]{8}[\dX]*$/;
+
+ return "http://www.dvdfr.com/api/search.php?title=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return "http://www.dvdfr.com/";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ $url =~ s/\/dvd\//\/api\//;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "DVDFr.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getExtra
+ {
+ return 'Edition';
+ }
+
+ sub getEanField
+ {
+ return 'title';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm b/lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm
new file mode 100644
index 0000000..4bb6456
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDVDPost.pm
@@ -0,0 +1,269 @@
+package GCPlugins::GCfilms::GCDVDPost;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginDVDPost;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if (($attr->{href} =~ /^product_info\.php\?products_id=/))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /http:\/\/images\.dvdpost\.be\/\/dvd/)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ elsif ($self->{insideAge})
+ {
+ (my $fileName = $attr->{src}) =~ s|.+/([^/]+)$|$1|;
+ $self->{curInfo}->{age} = 2 if $fileName eq 'all.gif';
+ $self->{curInfo}->{age} = 12 if $fileName eq '-12.gif';
+ $self->{curInfo}->{age} = 16 if $fileName eq '-16.gif';
+ $self->{insideAge} = 0;
+ }
+ }
+ elsif ($tagname eq "table")
+ {
+ if ( ($attr->{cellpadding} eq "0")
+ && ($attr->{cellspacing} eq "0")
+ && ($attr->{width} eq "100%")
+ && ($attr->{border} ne "0"))
+ {
+ $self->{insideSynopsisFather} = 1;
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($attr->{style} eq "text-align:right;font-size:9px;color:gray")
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif (($attr->{class} eq "boxText") && $attr->{align} eq "left")
+ {
+ if ($self->{insideSynopsisFather} == 1)
+ {
+ $self->{insideSynopsis} = 1;
+ $self->{insideSynopsisFather} = 0;
+ }
+ else
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\n*//g if !$self->{insideSynopsis};
+ $origtext =~ s/\s{2,}//g;
+
+ if ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $origtext =~ s/ ,/, /g;
+ $origtext =~ s/^(.*), /$1/;
+ $self->{curInfo}->{director} = $origtext if !$self->{curInfo}->{director};
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext . " min";
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $origtext =~ s/ ,/, /g;
+ $origtext =~ s/^(.*), /$1/;
+ $self->{curInfo}->{actors} = $origtext if !$self->{curInfo}->{actors};
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext if !$self->{curInfo}->{original};
+ $self->{insideOrig} = 0;
+ }
+ elsif ($self->{inside}->{b})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/R.alisateur/;
+ $self->{insideTime} = 1 if $origtext =~ m/Dur.e/;
+ $self->{insideActors} = 1 if $origtext =~ m/Acteurs/;
+ $self->{insideAge} = 1 if $origtext =~ m/Public/;
+ }
+ elsif ($self->{inside}->{table})
+ {
+ if ($origtext =~ /(.*) \( ([0-9]{4}) \)/)
+ {
+ $self->{curInfo}->{title} = $1 if !$self->{curInfo}->{title};
+ $self->{curInfo}->{date} = $2 if !$self->{curInfo}->{date};
+ }
+ elsif ($self->{insideGenre})
+ {
+ $origtext =~ s/\|/,/g;
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/<u>|<\/u>//g;
+ $html =~ s/<a href="directors\.php\?directors\_id=[0-9]*">([^<]*)<\/a>/$1/gi;
+ $html =~ s/<a href="actors\.php\?actors\_id=[0-9]*">([^<]*)<\/a>/$1/gi;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.dvdpost.be/advanced_search_result2.php?language=fr&keywords=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.dvdpost.be/" . $url . "&language=fr" unless $url eq '';
+ return "http://www.dvdpost.be/";
+ }
+
+ sub getName
+ {
+ return "DVDPost.be";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm b/lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm
new file mode 100644
index 0000000..d50ea4d
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDicshop.pm
@@ -0,0 +1,343 @@
+package GCPlugins::GCfilms::GCDicschop;
+
+###################################################
+#
+# Copyright 2005-2010 Tian, Michael Mayer
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginDicshop;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ return if $self->{parsingEnded};
+ if ($tagname eq 'div')
+ {
+ if ($attr->{class} eq 'ds_l_h')
+ {
+ $self->{isMovie} = 1;
+ }
+ elsif ($attr->{class} eq 'ds_l_b')
+ {
+ $self->{isMovie} = 0;
+ }
+ elsif ($attr->{class} eq 'settingSavePlusContainer')
+ {
+ $self->{parsingEnded} = 1;
+ }
+ }
+ elsif ($self->{isMovie} && ($tagname eq 'a'))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ }
+ else
+ {
+ return if $self->{parsingEnded};
+
+ if ($tagname eq 'div')
+ {
+ if ($attr->{class} eq "header_section hs_spec")
+ {
+ $self->{isInfo} = 1;
+ }
+ elsif ($attr->{class} eq "header_section hs_omdomme")
+ {
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($attr->{class} =~ m/right_cont_section/)
+ {
+ $self->{parsingEnded} = 1;
+ }
+ elsif (($attr->{class} =~ m/^item([12])$/) && $self->{isInfo})
+ {
+ $self->{isItem} = $1;
+ }
+ elsif ($attr->{class} =~ m/ds_produkt_left/)
+ {
+ $self->{isCover} = 1;
+ }
+ elsif ($attr->{class} =~ m/ds_omdomme_top/)
+ {
+ $self->{isRating} = 1;
+ }
+ elsif ($attr->{class} =~ m/ds_omdomme_cust/)
+ {
+ $self->{isRating} = 0;
+ }
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($self->{isCover} && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{image} =~ s|front_normal|front_large|;
+ $self->{curInfo}->{backpic} = $self->{curInfo}->{image};
+ $self->{curInfo}->{backpic} =~ s|front_large|back_large|;
+ }
+ }
+ elsif ($self->{isRating})
+ {
+ $self->{curInfo}->{ratingpress} += 2
+ if ($attr->{src} =~ m/rate_big_1.gif/);
+ $self->{curInfo}->{ratingpress} += 1
+ if ($attr->{src} =~ m/rate_big_05.gif/);
+ }
+ }
+ elsif ($tagname eq 'script')
+ {
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($tagname eq 'br')
+ {
+ $self->{curInfo}->{synopsis} .= "\n"
+ if ($self->{isSynopsis} && $self->{curInfo}->{synopsis});
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq 'div')
+ {
+ $self->{isCover} = 0;
+ }
+ elsif ($tagname eq 'p')
+ {
+ $self->{curInfo}->{synopsis} .= "\n"
+ if ($self->{isSynopsis} && $self->{curInfo}->{synopsis});
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ return if !$origtext;
+
+ if ($self->{parsingList})
+ {
+ # evaluate the search result page
+ if ($self->{isMovie})
+ {
+ if ($self->{inside}->{b})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ }
+ elsif ($self->{inside}->{div})
+ {
+ $origtext =~ /^.*?(\d{4}) +(med +([^-.]*))?/;
+ if ($1)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $3;
+ }
+ else
+ {
+ $origtext =~ /med +([^-.]*)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $1
+ if $1;
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} =~ s/ och/,/g;
+ $self->{isMovie} = 0;
+ }
+ }
+ }
+ else
+ {
+ return if $self->{parsingEnded};
+ # evaluate the film details page
+ if ($self->{inside}->{h3})
+ {
+ if ($origtext eq "Filmens handling")
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+ elsif ($self->{isSynopsis}) # important: elsif, not only if!
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{isItem} == 1)
+ {
+ $self->{key} = $origtext;
+ }
+ elsif ($self->{isItem} == 2)
+ {
+ if ( ($self->{key} eq "Grupp:")
+ or ($self->{key} eq "Genre:")
+ or ($self->{key} eq "Underkategori:"))
+ {
+ $origtext =~ s| *film$||i; # remove the trailing "film"
+ $origtext =~ s|/|,|i;
+ $self->{curInfo}->{genre} .= $origtext . ","
+ if (!($self->{curInfo}->{genre} =~ m/$origtext/));
+ }
+ elsif ($self->{key} eq "Speltid:")
+ {
+ $self->{curInfo}->{time} = $origtext;
+ }
+ elsif ($self->{key} eq "Svensk titel:")
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ($self->{key} eq "Originaltitel:")
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ elsif ($self->{key} eq "Produktionsland:")
+ {
+ if ($self->{curInfo}->{country}) {
+ $self->{curInfo}->{country} .= ", ";
+ }
+ $self->{curInfo}->{country} .= $origtext;
+ }
+ elsif ($self->{key} =~ m/Premi.*r:/)
+ {
+ $self->{curInfo}->{date} = $origtext;
+ }
+ elsif ($self->{key} eq "Regi:")
+ {
+ if ($self->{curInfo}->{director})
+ {
+ $self->{curInfo}->{director} .= ", ";
+ }
+ $self->{curInfo}->{director} = $origtext;
+ }
+ elsif ($self->{key} =~ m/despelare:$/)
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{key} =~ m/ldersgr.*ns:/)
+ {
+ $origtext =~ m/^(\d+) /;
+ $self->{curInfo}->{"age"} = $1;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 1,
+ age => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isRating} = 0;
+ $self->{isCover} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{isTitle} = 0;
+ $self->{isSynopsis} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.discshop.se/shop/search_solr.php?lang=&cont=ds&"
+ . "soktext=$word&subsite_set=movies&lang=se&subsite=bluray&&ref=";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.discshop.se/shop/' . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Discshop.se";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "Windows-1252";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'SV';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm b/lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm
new file mode 100644
index 0000000..e3e8563
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCDoubanfilm.pm
@@ -0,0 +1,255 @@
+package GCPlugins::GCfilms::GCDoubanfilm;
+
+###################################################
+#
+# Copyright 2005-2010 Bai Wensimi
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginDoubanfilm;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if (($page =~ /^bad imdb/) & ($page =~ /^The/));
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page =~ /feed>$/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ foreach my $ItemMovie( @{$xml->{'entry'}}){
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $ItemMovie->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $ItemMovie->{'title'};
+ foreach my $tmp_author (@{$ItemMovie->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'director'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=',';}
+ $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=$tmp_author->{'name'};
+ }
+ foreach my $check1(@{$ItemMovie->{'db:attribute'}}){
+ my $db_attr1=$check1->{'name'};
+ SWITCH1: {
+ $db_attr1 eq 'country' and $self->{itemsList}[ $self->{itemIdx} ]->{'country'}=$check1->{'content'} ,last SWITCH1;
+ $db_attr1 eq 'pubdate' and $self->{itemsList}[ $self->{itemIdx} ]->{'date'}=$check1->{'content'} ,last SWITCH1;
+ ;
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $xml->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $xml->{'title'};
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=$tmp_author->{'name'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=',';
+ }
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH: {
+ $db_attr eq 'country' and $self->{itemsList}[ $self->{itemIdx} ]->{country}=$check->{'content'} ,last;
+ $db_attr eq 'pubdate' and $self->{itemsList}[ $self->{itemIdx} ]->{date}=$check->{'content'} ,last;
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml =$xs->XMLin($page,
+ ForceArray => [ 'author' ],
+ KeyAttr => {'db:tag'=>'name','link'=>'rel'});
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'director'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'director'}.=',';}
+ $self->{curInfo}->{director}.=$tmp_author->{'name'};
+ }
+ $self->{curInfo}->{title}=$xml->{'title'};
+ $self->{curInfo}->{original}=$xml->{'title'};
+ $self->{curInfo}->{webPage}=$xml->{'link'}->{'alternate'}->{'href'};
+ $self->{curInfo}->{synopsis}=$xml->{'summary'};
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH2: {
+ $db_attr eq 'country' and $self->{curInfo}->{country}=$check->{'content'} ,last SWITCH2;
+ $db_attr eq 'pubdate' and $self->{curInfo}->{date}=$check->{'content'} ,last SWITCH2;
+ $db_attr eq 'cast' and { ($self->{curInfo}->{actors} ne '' ) and $self->{curInfo}->{actors}.=',' }, $self->{curInfo}->{actors}.=$check->{'content'} ,last SWITCH2;
+ ;
+ }
+ }
+
+ my $tmp_image=$xml->{'link'}->{'image'}->{'href'};
+ $tmp_image =~ s/spic/lpic/;
+ $self->{curInfo}->{image}=$tmp_image;
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ director => 1,
+ date => 1,
+ country => 1,
+ };
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ if ($self->{searchField} eq 'imdb')
+ {
+ return "http://api.douban.com/movie/subject/imdb/" .$word;
+ }
+ else
+ {
+ return "http://api.douban.com/movie/subjects?q=" .$word;
+ }
+
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "豆瓣";
+ }
+
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ country => 1,
+ };
+
+ }
+
+ sub getAuthor
+ {
+ return 'BW';
+ }
+
+ sub getLang
+ {
+ return 'ZH';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "UTF-8";
+ }
+ sub getSearchFieldsArray
+ {
+ return ['imdb', 'title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'ZH';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm
new file mode 100644
index 0000000..2774b36
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityEN.pm
@@ -0,0 +1,334 @@
+package GCPlugins::GCfilms::GCFilmAffinityEN;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+# Edited 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmAffinityEN;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ( ($tagname eq 'a')
+ && ($attr->{href} =~ /\/en\/.*\.php\?movie_id=([0-9]*)/))
+ {
+ $self->{hasUrl} = 'film' . $1 . '.html';
+ }
+ }
+ elsif (!$self->{isMovie}
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /^\/en\/(film.*)$/))
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($tagname eq 'span')
+ && ($attr->{style} eq 'font-size: 10px; color:#666666'))
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif (($tagname eq 'div')
+ && ($attr->{style} eq 'font-size: 10px'))
+ {
+ $self->{isActors} = 1;
+ }
+ }
+ else
+ {
+ if ( ($tagname eq 'span')
+ && ($attr->{style} eq 'color:#990000; font-size:16; font-weight: bold;'))
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ /^\/imgs\/countries/)
+ {
+ $self->{curInfo}->{country} = $attr->{title};
+ }
+ elsif ($attr->{src} =~ /pics.*filmaffinity\.com\/.*-full\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if not exists $self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ /pics.*filmaffinity\.com\/.*-large\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{style} =~ /font-size:22px; font-weight: bold;/)
+ {
+ $self->{isRating} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ($self->{hasUrl})
+ {
+ $self->{itemsList}[0]->{url} = $self->{hasUrl};
+ $self->{hasUrl} = 0;
+ }
+ return;
+ }
+ if ($self->{inside}->{title} && ($origtext !~ /^Search\s+for /))
+ {
+ $self->{parsingEnded} = 1;
+ $self->{hasUrl} = 0;
+ $self->{itemIdx} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+ return if $origtext !~ /\w/;
+ return if $origtext eq 'Add to lists';
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isTitle} = 1;
+ }
+ elsif ($self->{isTitle})
+ {
+ (my $year = $origtext) =~ s/\s*\(([0-9]{4})\)\s*/$1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $year;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $origtext;
+ $self->{isActors} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/^\s*//;
+
+ return if !$origtext;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isOrig} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{isTime} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ if ($self->{inside}->{a} && $origtext)
+ {
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{actors} .= $origtext . ', ';
+ }
+ }
+ elsif ($self->{isGenre})
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{curInfo}->{genre} =~ s/\s*\/\s*/,/g;
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($self->{isRating})
+ {
+ $origtext =~ s/,/\./; # replace comma
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ $self->{isRating} = 0;
+ }
+
+ if ($self->{inside}->{b})
+ {
+ if ($origtext eq 'ORIGINAL TITLE')
+ {
+ $self->{isOrig} = 1;
+ }
+ elsif ($origtext eq 'YEAR')
+ {
+ $self->{isDate} = 1;
+ }
+ elsif ($origtext eq 'RUNNING TIME')
+ {
+ $self->{isTime} = 1;
+ }
+ elsif ($origtext eq 'DIRECTOR')
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif ($origtext eq 'CAST')
+ {
+ $self->{isActors} = 1;
+ }
+ elsif ($origtext eq 'STUDIO/PRODUCER')
+ {
+ $self->{curInfo}->{actors} =~ s/, $//;
+ $self->{isActors} = 0;
+ }
+ elsif ($origtext eq 'GENRE')
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif ($origtext eq 'SYNOPSIS/PLOT')
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.filmaffinity.com/en/search.php?"
+ ."stext=$word&stype=title";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.filmaffinity.com/en/' . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Film affinity (EN)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & PIN edited by FiXx';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm
new file mode 100644
index 0000000..4c39ae5
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmAffinityES.pm
@@ -0,0 +1,334 @@
+package GCPlugins::GCfilms::GCFilmAffinityES;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+# Edited 2009 by FiXx
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmAffinityES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ( ($tagname eq 'a')
+ && ($attr->{href} =~ /\/es\/.*\.php\?movie_id=([0-9]*)/))
+ {
+ $self->{hasUrl} = 'film' . $1 . '.html';
+ }
+ }
+ elsif (!$self->{isMovie}
+ && ($tagname eq 'a')
+ && ($attr->{href} =~ /^\/es\/(film.*)$/))
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($tagname eq 'span')
+ && ($attr->{style} eq 'font-size: 10px; color:#666666'))
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif (($tagname eq 'div')
+ && ($attr->{style} eq 'font-size: 10px'))
+ {
+ $self->{isActors} = 1;
+ }
+ }
+ else
+ {
+ if ( ($tagname eq 'span')
+ && ($attr->{style} eq 'color:#990000; font-size:16; font-weight: bold;'))
+ {
+ $self->{isTitle} = 1;
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ /^\/imgs\/countries/)
+ {
+ $self->{curInfo}->{country} = $attr->{title};
+ }
+ elsif ($attr->{src} =~ /pics.*filmaffinity\.com\/.*-full\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if not exists $self->{curInfo}->{image};
+ }
+ }
+ elsif ($tagname eq 'a')
+ {
+ if ($attr->{href} =~ /pics.*filmaffinity\.com\/.*-large\.jpg/)
+ {
+ $self->{curInfo}->{image} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{style} =~ /font-size:22px; font-weight: bold;/)
+ {
+ $self->{isRating} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ($self->{hasUrl})
+ {
+ $self->{itemsList}[0]->{url} = $self->{hasUrl};
+ $self->{hasUrl} = 0;
+ }
+ return;
+ }
+ if ($self->{inside}->{title} && ($origtext !~ /^Búsqueda\s+de /))
+ {
+ $self->{parsingEnded} = 1;
+ $self->{hasUrl} = 0;
+ $self->{itemIdx} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+ return if $origtext !~ /\w/;
+ return if $origtext eq 'Añadir a listas';
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isTitle} = 1;
+ }
+ elsif ($self->{isTitle})
+ {
+ (my $year = $origtext) =~ s/\s*\(([0-9]{4})\)\s*/$1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $year;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $origtext;
+ $self->{isActors} = 0;
+ }
+ }
+ else
+ {
+ $origtext =~ s/^\s*//;
+
+ return if !$origtext;
+ if ($self->{isTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isTitle} = 0;
+ }
+ elsif ($self->{isOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isOrig} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{isTime} = 0;
+ }
+ elsif ($self->{isDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{isDirector} = 0;
+ }
+ elsif ($self->{isActors})
+ {
+ if ($self->{inside}->{a} && $origtext)
+ {
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{actors} .= $origtext . ', ';
+ }
+ }
+ elsif ($self->{isGenre})
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{curInfo}->{genre} =~ s/\s*\/\s*/,/g;
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($self->{isRating})
+ {
+ $origtext =~ s/,/\./; # replace comma
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ $self->{isRating} = 0;
+ }
+
+ if ($self->{inside}->{b})
+ {
+ if ($origtext eq 'TÃTULO ORIGINAL')
+ {
+ $self->{isOrig} = 1;
+ }
+ elsif ($origtext eq 'AÑO')
+ {
+ $self->{isDate} = 1;
+ }
+ elsif ($origtext eq 'DURACIÓN')
+ {
+ $self->{isTime} = 1;
+ }
+ elsif ($origtext eq 'DIRECTOR')
+ {
+ $self->{isDirector} = 1;
+ }
+ elsif ($origtext eq 'REPARTO')
+ {
+ $self->{isActors} = 1;
+ }
+ elsif ($origtext eq 'PRODUCTORA')
+ {
+ $self->{curInfo}->{actors} =~ s/, $//;
+ $self->{isActors} = 0;
+ }
+ elsif ($origtext eq 'GÉNERO')
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif ($origtext eq 'SINOPSIS')
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.filmaffinity.com/es/search.php?"
+ ."stext=$word&stype=title";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return 'http://www.filmaffinity.com/es/' . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return "Film affinity (ES)";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & PIN edited by FiXx';
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm
new file mode 100644
index 0000000..8a47dff
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmUP.pm
@@ -0,0 +1,252 @@
+package GCPlugins::GCfilms::GCFilmUP;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+#use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmUP;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $url;
+
+ $url =
+ "http://filmup.leonardo.it/cgi-bin/search.cgi?"
+ . "ps=10&fmt=long&q=$word"
+ . "&ul=%25%2Fsc_%25&x=52&y=7&m=all&wf=2221&wm=wrd&sy=0";
+
+ return $url;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return 'http://filmup.leonardo.it/';
+ }
+
+ sub getName
+ {
+ return "FilmUP";
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'a')
+ {
+ if ($self->{insideInfos})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $self->{lasUrl};
+ $self->{insideInfos} = 0;
+ }
+
+ $self->{lasUrl} = $attr->{href};
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ $self->{curInfo}->{image} = $self->getItemUrl . $attr->{src}
+ if $attr->{src} =~ /^locand\// && ($attr->{src} ne 'locand/no.gif');
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{dt} && $self->{inside}->{a})
+ {
+ if ($origtext =~ m/FilmUP - Scheda: (.*)/)
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $1;
+ $self->{insideInfos} = 1;
+ }
+ }
+ if ( $self->{inside}->{small}
+ && $self->{inside}->{table}
+ && $self->{insideInfos})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ /Anno: ([0-9]+)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $1
+ if $origtext =~ /Regia: (.*?)((Sito)|$)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} = $1
+ if $origtext =~ /Cast: (.*?)$/;
+ }
+ }
+ else
+ {
+ if ($self->{inside}->{h1})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ }
+ elsif ($self->{inside}->{td} && ($origtext !~ /^[\r\n]+$/))
+ {
+ $self->{insideTime} = 0 if $origtext =~ /Regia:/;
+ if ($self->{insideOriginal})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ if (!$self->{curInfo}->{genre})
+ {
+ $origtext =~ s|/|,|;
+ $self->{curInfo}->{genre} = $origtext;
+ }
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{curInfo}->{actors} = $origtext;
+ $self->{insideActors} = 0;
+ }
+
+ $self->{insideOriginal} = 1 if $origtext =~ /Titolo originale:/;
+ $self->{insideNat} = 1 if $origtext =~ /Nazione:/;
+ $self->{insideDate} = 1 if $origtext =~ /Anno:/;
+ $self->{insideGenre} = 1 if $origtext =~ /Genere:/;
+ $self->{insideTime} = 1 if $origtext =~ /Durata:/;
+ $self->{insideDirector} = 1 if $origtext =~ /Regia:/;
+ $self->{insideActors} = 1 if $origtext =~ /Cast:/;
+ }
+ if ($self->{inside}->{synopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s/\222/'/g;
+
+ $html =~ s{<font face="arial, helvetica" size="3">(.*?)</font>}
+ {<h1>$1</h1>}g;
+ $html =~ s{</table>.<br>.<font face="arial, helvetica" size="2">(.*?)</font>}
+ {</table><synopsis>$1</synopsis>}ms;
+ $html =~ s{<font face="arial, helvetica" size="2">Trama:(.*?)</font>}
+ {<synopsis>$1</synopsis>};
+ $html =~ s{Trama:<br>}{};
+ $html =~ s{<span .*?>|</span>} {}g;
+ $html =~ s{<a .*?href="\/?personaggi.*?>(.+?)</a>} {$1}g;
+
+ $html =~ s{<font .*?>|</font>} {}g;
+ $html =~ s{</?b>} {}g;
+
+ return $html;
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "Windows-1252";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm b/lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm
new file mode 100644
index 0000000..f7c18cd
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCFilmWeb.pm
@@ -0,0 +1,369 @@
+package GCPlugins::GCfilms::GCFilmWeb;
+
+###################################################
+#
+# Copyright 2005-2010 Tian, Michael Mayer
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginFilmWeb;
+
+ use LWP::Simple qw($ua);
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{parsingEnded})
+ {
+ if ( ($tagname eq 'input')
+ && ($attr->{name} eq 'id'))
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{title} = '';
+ $self->{itemsList}[0]->{url} =
+ 'http://www.filmweb.pl/Film?id=' . $attr->{value};
+ }
+ }
+
+ if ($tagname eq 'a')
+ {
+ if ($attr->{class} eq 'searchResultTitle')
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ elsif ($attr->{href} =~ m|/search/film\?countryIds=|)
+ {
+ $self->{isCountry} = 1;
+ }
+ }
+ elsif ($tagname eq 'span')
+ {
+ if ($attr->{class} eq 'searchResultDetails')
+ {
+ $self->{isYear} = 1;
+ }
+ }
+ }
+ else
+ {
+ return if ($self->{parsingEnded});
+
+ if ($tagname eq 'strong')
+ {
+ if ($attr->{class} eq "rating")
+ {
+ $self->{isRating} = 1;
+ }
+ }
+ elsif ($tagname eq 'div')
+ {
+ if ($attr->{class} eq "time")
+ {
+ $self->{isTime} = 1;
+ }
+ elsif ($attr->{class} eq "posterLightbox")
+ {
+ $self->{isImage} = 1;
+ }
+ elsif ($attr->{class} =~ /castListWrapper/)
+ {
+ $self->{isCast} = 1;
+ }
+ elsif ($attr->{class} =~ /additional-info/)
+ {
+ $self->{parsingEnded} = 1;
+ }
+ }
+ elsif ($tagname eq 'span')
+ {
+ if ($attr->{class} eq 'filmDescrBg')
+ {
+ $self->{isSynopsis} = 1;
+ }
+ }
+ elsif (($tagname eq 'a') && $self->{isImage})
+ {
+ # big image
+ $self->{curInfo}->{image} = $attr->{href};
+ }
+ elsif (($tagname eq 'img') && $self->{isImage})
+ {
+ # small image
+ $self->{curInfo}->{image} = $attr->{src}
+ if (!$self->{bigPics});
+ $self->{isImage} = 0;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "tr")
+ {
+ $self->{key} = "";
+ }
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ $origtext =~ s/^\s*//m;
+ $origtext =~ s/\s*$//m;
+
+ return if !$origtext;
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+
+ if ($self->{isMovie})
+ {
+ if ($self->{inside}->{a})
+ {
+ my $title;
+ my $original;
+ ($title, $original) = split (/\s*\/\s*/, $origtext, 2);
+ return if !$title;
+
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $title;
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $original;
+ $self->{isMovie} = 0;
+ }
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ /([0-9]{4})/;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{isCountry})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{country} .=
+ $self->{itemsList}[ $self->{itemIdx} ]->{country} ?
+ ", " . $origtext
+ : $origtext;
+ $self->{isCountry} = 0;
+ }
+ }
+ else
+ {
+
+ if ($self->{inside}->{title})
+ {
+ # content of title field is formatted like this:
+ # Obcy - 8. pasażer "Nostromo" / Alien (1979) - Filmweb
+ # or (if polish title and original title are identical):
+ # Batman (1989) - Filmweb
+ $origtext =~ m|(.*)\s+\((\d{4})\)\s+-\s+Filmweb|;
+ $self->{curInfo}->{date} = $2;
+ ($self->{curInfo}->{original},
+ $self->{curInfo}->{title}) = split (/\s+\/\s+/, $1, 2);
+ if (!$self->{curInfo}->{title})
+ {
+ $self->{curInfo}->{title} = $self->{curInfo}->{original};
+ }
+ }
+ elsif ($self->{isRating})
+ {
+ $origtext =~ s/,/\./;
+ $self->{curInfo}->{ratingpress} = int ($origtext + 0.5);
+ $self->{isRating} = 0;
+ }
+ elsif ($self->{isSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{isSynopsis} = 0;
+ }
+ elsif ($self->{inside}->{th})
+ {
+ $self->{key} = $origtext;
+ }
+ elsif ($self->{inside}->{td} && $self->{inside}->{a})
+ {
+ if ($self->{key} eq "reżyseria:")
+ {
+ $self->{curInfo}->{director} .=
+ $self->{curInfo}->{director} ? ", " . $origtext : $origtext;
+ }
+ if ($self->{key} eq "produkcja:")
+ {
+ $self->{curInfo}->{country} .=
+ $self->{curInfo}->{country} ? ", " . $origtext : $origtext;
+ }
+ if ($self->{key} eq "gatunek:")
+ {
+ $self->{curInfo}->{genre} .=
+ $self->{curInfo}->{genre} ? ", " . $origtext : $origtext;
+ }
+ }
+ elsif ($self->{isCast})
+ {
+ if ($self->{inside}->{h3})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{isRole} = 1;
+ }
+ else
+ {
+ if ($self->{isRole}
+ && ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS))
+ {
+ # As we incremented it above, we have one more
+ # chance here to add a role Without <= we would skip
+ # the role for last actor
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter}-1 ]}, $origtext
+ }
+ $self->{isRole} = 0;
+ }
+ }
+ elsif ($self->{isTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{isTime} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ country => 1,
+ };
+
+ $self->{isMovie} = 0;
+ $self->{isYear} = 0;
+ $self->{isCountry} = 0;
+ $self->{curName} = undef; # why?
+ $self->{curUrl} = undef; # why?
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+ $self->{insideResults} = 0;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|</?b>||gms;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Grab the home page first to receive a fresh, valid cookie
+ my $response = $ua->get('http://www.filmweb.pl/');
+
+ return "http://www.filmweb.pl/search?q=$word&alias=film";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ return "http://www.filmweb.pl" . $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'FilmWeb';
+ }
+
+ sub getExtra
+ {
+ return '';
+ }
+
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return 'ISO-8859-2';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'PL';
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCIbs.pm b/lib/gcstar/GCPlugins/GCfilms/GCIbs.pm
new file mode 100644
index 0000000..2cb141d
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCIbs.pm
@@ -0,0 +1,409 @@
+package GCPlugins::GCfilms::GCIbs;
+###################################################
+#
+# Copyright 2008 t-storm
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginIbs;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/mymovies\/list\?pending\&add=([0-9]*)/)
+ {
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = '/title/tt' . $1 . '/';
+ }
+ }
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if ( ($url =~ /^http:\/\/www.ibs.it\/dvd\/[0-9]+\//)
+ && (!$self->{alreadyListed}->{$url}))
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{alreadyListed}->{$url} = 1;
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{class} eq 'ttitolettobianco')
+ {
+ $self->{isYear} = 1;
+ $self->{isMovie} = 0;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "a")
+ {
+ $self->{currentHref} = $attr->{href};
+
+ if ($attr->{href} =~
+m/javascript:Jackopen\('http:\/\/giotto.internetbookshop.it\/cop\/copdjc.asp\?e=([0-9]+)'\)/
+ )
+ {
+ $self->{curInfo}->{image} =
+ "http://giotto.internetbookshop.it/cop/copdjc.asp?e=$1";
+ }
+ if ($attr->{href} =~ m/^\/film\/regista\//)
+ {
+ $self->{insideDirector} = 1;
+ }
+ elsif ($attr->{href} =~ m/^\/film\/attore\//)
+ {
+ $self->{insideActors} = 1;
+ $self->{insideRoles} = 0;
+ $self->{insideDirector} = 0;
+ }
+ else
+ {
+ $self->{insideSynopsis} = 0 if ($attr->{href} =~ m/plotsummary/);
+ $self->{insideGenre} = 1
+ if ($attr->{href} =~ m|/Sections/Genres/|)
+ && !($self->{curInfo}->{synopsis}
+ || $self->{curInfo}->{country}
+ || $self->{curInfo}->{time});
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($attr->{class} eq 'lbarrasup')
+ {
+ $self->{isMovie} = 1;
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ elsif ($tagname eq "SPAN")
+ {
+ if ($self->{inside}->{langue})
+ {
+ $self->{inside}->{langueLANG} = 1;
+ $self->{inside}->{langueCODEC} = 0;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ if ($tagname eq "SPAN")
+ {
+ if ($self->{inside}->{langue})
+ {
+ $self->{inside}->{langueLANG} = 0;
+ $self->{inside}->{langueCODEC} = 1;
+ }
+ }
+
+ $self->{inside}->{$tagname}--;
+
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $self->{listDate};
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isYear})
+ {
+ $origtext =~ /([0-9]+)/;
+ $self->{listDate} = $1;
+ $self->{isYear} = 0;
+ }
+ if ($self->{isDirector})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 0;
+ $self->{isDirector} = 0;
+ return;
+ }
+ $self->{isDirector} = 1 if $origtext =~ m/Regia di /;
+ }
+ else
+ {
+ $self->{inside}->{langue} = 0 if $origtext =~ m/Lingua sottotitoli/;
+ if ($self->{insideGenre})
+ {
+ $origtext =~ s/\s*$//;
+ $self->{curInfo}->{genre} .= $self->capWord($origtext) . ',';
+ $self->{curInfo}->{genre} =~ s|\s*/\s*|,|g;
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{isCountry})
+ {
+ $origtext =~ /(.+), (.+)/;
+ $self->{curInfo}->{country} .= $1;
+ $self->{curInfo}->{date} = $2;
+ $self->{isCountry} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{curInfo}->{time} =~ s/.*?://;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideRoles})
+ {
+ # As we incremented it above, we have one more chance here to add a role
+ # Without <= we would skip the role for last actor
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} - 1 ]},
+ $origtext
+ if ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{insideRoles} = 0;
+ }
+ elsif ($self->{inside}->{langue})
+ {
+ if ($self->{inside}->{span})
+ {
+ $self->{curInfo}->{language} = $origtext;
+ }
+ else
+ {
+ $origtext =~ s/^, //;
+ $origtext =~ s/ - $//;
+ push @{$self->{curInfo}->{audio}},
+ [ $self->{curInfo}->{language}, $origtext ];
+ }
+ }
+ elsif ($self->{inside}->{soustitre})
+ {
+ my @sottotitoli = split(' - ', $origtext);
+ my $subss;
+ foreach $subss (@sottotitoli)
+ {
+ push @{$self->{curInfo}->{subt}}, [$subss];
+ }
+
+ $self->{inside}->{soustitre} = 0;
+ }
+ elsif ($self->{isMovie})
+ {
+
+ if ($self->{isMovie1})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{isMovie1} = 0;
+ }
+ elsif ($self->{isMovie2})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isMovie2} = 0;
+ }
+ }
+ else
+ {
+ if ($origtext =~ m{User\s+Rating:\s+(\d+\.\d+)/10\s+})
+ {
+ $self->{curInfo}->{ratingpress} = int($1 + 0.5);
+ }
+ ; # if
+ }
+ ; # if
+
+ if ($origtext eq "Titolo")
+ {
+ $self->{isMovie1} = 1;
+ $self->{isMovie2} = 0;
+ }
+ elsif ($origtext eq "Titolo originale")
+ {
+ $self->{isMovie1} = 0;
+ $self->{isMovie2} = 1;
+ }
+ elsif ($origtext eq "Paese, Anno")
+ {
+ $self->{isCountry} = 1;
+ }
+ elsif ($origtext eq "Dati tecnici")
+ {
+ $self->{insideTime} = 1;
+ }
+ elsif ($origtext eq "Genere")
+ {
+ $self->{insideGenre} = 1;
+ }
+ elsif ($origtext eq "Descrizione")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($origtext =~ m/Vietato ai minori di ([0-9]+) anni/)
+ {
+ $self->{curInfo}->{age} = $1;
+ }
+ elsif ($origtext eq "Lingua audio")
+ {
+ $self->{inside}->{langue} = 1;
+ }
+ elsif ($origtext eq "Lingua sottotitoli")
+ {
+ $self->{inside}->{langue} = 0;
+ $self->{inside}->{soustitre} = 1;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+ $html =~ s{</?(?:b|small)>}{}gi;
+
+ if ($self->{parsingList})
+ {
+ $self->{alreadyListed} = {};
+ }
+ else
+ {
+ $html =~ s|<a href="synopsis">[^<]*</a>||gi;
+ $html =~ s|<a href="/name/.*?">([^<]*)</a>|$1|gi;
+ $html =~ s|<a href="/character/ch[0-9]*/">([^<]*)</a>|$1|gi;
+ #$html =~ s|<a href="/Sections/.*?">([^<]*)</a>|$1|gi;
+ $self->{curInfo}->{actors} = [];
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.ibs.it/dvd/ser/serpge.asp?ty=kw&dh=100&SEQ=Q&T=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url =~ /^http:/;
+ return "http://www.ibs.it" . $url;
+ }
+
+ sub getName
+ {
+ return "Internet Bookshop";
+ }
+
+ sub getAuthor
+ {
+ return 't-storm';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCImdb.pm b/lib/gcstar/GCPlugins/GCfilms/GCImdb.pm
new file mode 100644
index 0000000..70af804
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCImdb.pm
@@ -0,0 +1,439 @@
+package GCPlugins::GCfilms::GCImdb;
+
+###################################################
+#
+# Copyright 2010 groms
+#
+# Features:
+# + Multiple directors separated by comma
+# + Multiple countries separated by comma
+# + Correct URL in case of redirection
+# + Fetches Original Title
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginImdb;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if (($url =~ /^\/title\//) && (!$self->{alreadyListed}->{$url}))
+ {
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ $self->{alreadyListed}->{$url} = 1;
+ }
+ }
+ }
+ else
+ {
+
+ if ($tagname eq "link")
+ {
+ if ($attr->{rel} eq "canonical")
+ {
+ $self->{curInfo}->{webPage} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq "h1")
+ {
+ if ($attr->{class} eq "header")
+ {
+ $self->{insideHeader} = 1;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} eq "infobar")
+ {
+ $self->{insideInfobar} = 1;
+ }
+ }
+ elsif ($tagname eq "table")
+ {
+ if ($attr->{class} eq "cast_list")
+ {
+ $self->{insideCastList} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{itemprop} eq "ratingValue")
+ {
+ $self->{insideRating} = 1;
+ }
+ elsif ($attr->{class} eq "title-extra")
+ {
+ $self->{insideOriginalTitle} = 1;
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($self->{insidePrimaryImage})
+ {
+ if (!($attr->{src} =~ m/nopicture/))
+ {
+ ($self->{curInfo}->{image} = $attr->{src}) =~ s/_V1\._.+\./_V1\._SX1000_SY1000_\./;
+ }
+ }
+ elsif ($self->{insideInfobar} && $attr->{src} =~ m|/certificates/us/|)
+ {
+ my $cert = $attr->{title};
+ $self->{curInfo}->{age} = 1 if ($cert eq 'Unrated') || ($cert eq 'Open');
+ $self->{curInfo}->{age} = 2 if ($cert eq 'G') || ($cert eq 'Approved');
+ $self->{curInfo}->{age} = 5 if ($cert eq 'PG') || ($cert eq 'M') || ($cert eq 'GP');
+ $self->{curInfo}->{age} = 13 if $cert eq 'PG_13';
+ $self->{curInfo}->{age} = 17 if $cert eq 'R';
+ $self->{curInfo}->{age} = 18 if ($cert eq 'NC_17') || ($cert eq 'X');
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{insideHeader} && $attr->{href} =~ m/year/)
+ {
+ $self->{insideYear} = 1;
+ }
+ elsif ($self->{insideInfobar} && $attr->{href} =~ m/genre/)
+ {
+ $self->{insideGenre} = 1;
+ }
+ }
+ elsif ($tagname eq 'td')
+ {
+ if ($self->{insideCastList})
+ {
+ if ($attr->{class} eq 'name')
+ {
+ $self->{insideActor} = 1;
+ }
+ elsif ($attr->{class} eq 'character')
+ {
+ $self->{insideRole} = 1;
+ }
+ }
+ elsif ($attr->{id} eq "img_primary") {
+ $self->{insidePrimaryImage} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie} && ($tagname eq 'a'))
+ {
+ $self->{isMovie} = 0;
+ my $url = $self->{itemsList}[$self->{itemIdx}]->{url};
+ if (!$self->{itemsList}[$self->{itemIdx}]->{title})
+ {
+ $self->{alreadyListed}->{$url} = 0;
+ $self->{itemIdx}--;
+ }
+ }
+ } else {
+ if ($tagname eq "h1")
+ {
+ $self->{insideHeader} = 0;
+ }
+ elsif ($tagname eq "a")
+ {
+ $self->{insideYear} = 0;
+ $self->{insideGenre} = 0;
+ $self->{insideActor} = 0;
+ $self->{insideRole} = 0;
+ }
+ elsif ($tagname eq "div")
+ {
+ $self->{insideInfobar} = 0;
+ $self->{insideNat} = 0;
+ $self->{insideDirector} = 0;
+ $self->{insideStoryline} = 0;
+ $self->{insideReleaseDate} = 0;
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideRating} = 0;
+ $self->{insideOriginalTitle} = 0;
+ }
+ elsif ($tagname eq "table")
+ {
+ $self->{insideCastList} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insidePrimaryImage} = 0;
+ }
+ elsif ($self->{insideCastList})
+ {
+ if ($self->{actor} && $self->{role})
+ {
+ $self->{actor} =~ s/^\s+|\s+$//g;
+ $self->{actor} =~ s/\s{2,}/ /g;
+ push @{$self->{curInfo}->{actors}}, [$self->{actor}];
+ $self->{role} =~ s/^\s+|\s+$//g;
+ $self->{role} =~ s/\s{2,}/ /g;
+ push @{$self->{curInfo}->{actors}->[$self->{actorsCounter}]}, $self->{role};
+ $self->{actorsCounter}++;
+ }
+ $self->{actor} = "";
+ $self->{role} = "";
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/^\s+|\s+$//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{h1} && $origtext !~ m/IMDb\s*Title\s*Search/i)
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isInfo})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $1 if $origtext =~ m|\(([0-9]*)(/I+)?\)|;
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideHeader})
+ {
+ if ($self->{insideYear})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ }
+ elsif (!$self->{curInfo}->{title})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ if (!$self->{curInfo}->{original})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ }
+ elsif ($self->{insideOriginalTitle} && !$self->{inside}->{i})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ }
+ }
+ elsif ($self->{insideInfobar})
+ {
+ if ($self->{insideGenre})
+ {
+ if ($self->{curInfo}->{genre})
+ {
+ $self->{curInfo}->{genre} .= ",";
+ }
+ $self->{curInfo}->{genre} .= $origtext;
+ }
+ elsif ($origtext =~ m/([0-9]+ min)/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ }
+ elsif ($self->{insideRating} && $origtext =~ m/[0-9]\.[0-9]/)
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext;
+ }
+ elsif ($self->{insideNat})
+ {
+ if ($origtext =~ m/[^\s].+/)
+ {
+ if ($self->{curInfo}->{country} =~ m/.+/)
+ {
+ $self->{curInfo}->{country} .= ", ".$origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{country} = $origtext;
+ }
+ }
+ }
+ elsif ($self->{insideCastList})
+ {
+ if ($self->{insideActor})
+ {
+ $self->{actor} .= $origtext;
+ }
+ elsif ($self->{insideRole})
+ {
+ $self->{role} .= $origtext;
+ }
+ }
+ elsif ($self->{insideStoryline} && $self->{inside}{p})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideStoryline} = 0;
+ }
+ elsif ($self->{insideDirector} && $self->{inside}->{div})
+ {
+ $origtext =~ s/,/, /;
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{insideReleaseDate} && !$self->{curInfo}->{date}) {
+ if ($origtext =~ m/([0-9]{4})/)
+ {
+ $self->{curInfo}->{date} = $1;
+ $self->{insideReleaseDate} = 0;
+ }
+ }
+
+ if ($self->{inside}->{h2})
+ {
+ $self->{insideStoryline} = 1 if ($origtext eq "Storyline");
+ }
+ elsif ($self->{inside}->{h4})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/Directors?:/;
+ $self->{insideTime} = 1 if $origtext =~ m/Runtime:/;
+ $self->{insideNat} = 1 if $origtext =~ m/Country:/;
+ $self->{insideReleaseDate} = 1 if $origtext =~ m/Release Date:/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ if ($self->{parsingList})
+ {
+ $self->{alreadyListed} = {};
+ }
+ else
+ {
+ #$html =~ s|<a href="synopsis">[^<]*</a>||gi;
+ #$html =~ s|<a href="/name/.*?"[^>]*>([^<]*)</a>|$1|gi;
+ #$html =~ s|<a href="/character/ch[0-9]*/">([^<]*)</a>|$1|gi;
+ #$html =~ s|<a href="/Sections/.*?">([^<]*)</a>|$1|gi;
+
+ # Commented out this line, causes bug #14420 when importing from named lists
+ #$self->{curInfo}->{actors} = [];
+ }
+
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.imdb.com/find?s=tt&q=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.imdb.com" if $url eq "";
+ return $url if $url =~ /^http:/;
+ return "http://www.imdb.com".$url;
+ }
+
+ sub getName
+ {
+ return "IMDb";
+ }
+
+ sub getAuthor
+ {
+ return 'groms';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm b/lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm
new file mode 100644
index 0000000..d950395
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCKinopoisk.pm
@@ -0,0 +1,386 @@
+package GCPlugins::GCfilms::GCKinopoisk;
+
+use strict;
+use utf8;
+use Encode qw(encode);
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ package GCPlugins::GCfilms::GCPluginKinopoisk;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{class} eq "all")
+ {
+ my $url = $attr->{href};
+ if ($url =~ m/\/level\/1\/film/)
+ {
+ $self->{isMovie} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $url;
+ }
+ }
+ if ($attr->{class} eq "orange")
+ {
+ $self->{isYear} = 1;
+ }
+ }
+ elsif ($tagname eq "title")
+ {
+ $self->{insideHTMLtitle} = 1;
+ }
+ }
+ else
+ {
+ if ($attr->{class} eq "moviename-big" && $attr->{style} eq "margin: 0; padding: 0")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{style} eq "color: #666; font-size: 13px")
+ {
+ $self->{insideOriginal} = 1;
+ }
+ elsif ($attr->{class} eq "_reachbanner_" && $self->{insideSynopsis} == 0)
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/\/level\/10\/m\_act\%5Byear\%5D/)
+ {
+ $self->{insideDate} = 1;
+ }
+ if ($attr->{href} =~ m/\/level\/10\/m\_act\%5Bcountry\%5D/)
+ {
+ if ($self->{isCountry} >= 2)
+ {
+ $self->{insideCountry} = 1;
+ $self->{isCountry}++;
+ }
+ }
+ if ($attr->{href} =~ m/\/level\/4\/people/)
+ {
+ if ($self->{isDirector} >= 2)
+ {
+ $self->{insideDirector} = 1;
+ $self->{isDirector}++;
+ }
+ }
+ if ($attr->{href} =~ m/\/level\/10\/m\_act\%5Bgenre\%5D/)
+ {
+ $self->{insideGenre} = 1;
+ $self->{isGenre}++;
+ }
+ if ($self->{insideActorList})
+ {
+ $self->{isActors} += 1;
+ $self->{insideActors} = 1;
+ }
+ }
+ elsif ($tagname eq "td")
+ {
+ if ($attr->{class} eq "type")
+ {
+ $self->{isDirector} = 1;
+ $self->{isTime} = 1;
+ $self->{isCountry} = 1;
+ }
+ elsif ($self->{isTime} == 2)
+ {
+ $self->{insideTime} = 1;
+ $self->{isTime} = 0;
+ }
+ elsif ($attr->{style} eq "vertical-align: top; height: 15px" && $attr->{align} eq "right" && $self->{isActors} >= 0)
+ {
+ $self->{isActors} += 1;
+ $self->{insideActors} = 1;
+ }
+ }
+ elsif ($tagname eq "img" && $attr->{style} eq "border: none; border-left: 10px #f60 solid")
+ {
+ if ($attr->{src} ne "/images/image_none.gif")
+ {
+ $self->{curInfo}->{image} = "http://www.kinopoisk.ru".$attr->{src};
+ }
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if ($self->{parsingEnded});
+ if ($self->{parsingList})
+ {
+ if (($self->{insideHTMLtitle}))
+ {
+ if ($origtext =~ m/Результаты\sпоиÑка/)
+ {
+ #
+ }
+ else
+ {
+ $self->{parsingEnded} = 1;
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{url} = $self->{loadedUrl};
+ }
+ $self->{insideHTMLtitle} = 0;
+ }
+ if ($self->{isMovie})
+ {
+ my ($title, $date);
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{date} = $origtext;
+ $self->{isYear} = 0;
+ return;
+ }
+ }
+ else
+ {
+ if ($origtext =~ m/Ð’\s*главных\s*ролÑÑ…:/)
+ {
+ $self->{insideActorList} = 1;
+ }
+ if ($origtext =~ m/Роли\s*дублировали:/)
+ {
+ $self->{insideActorList} = 0;
+ }
+ if ($self->{insideTitle})
+ {
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ }
+ elsif ($self->{insideOriginal})
+ {
+ $origtext =~ s/^\s+//;
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideCountry} == 1)
+ {
+ if ($self->{isCountry} == 3)
+ {
+ $self->{curInfo}->{country} = $origtext;
+ }
+ elsif ($self->{isCountry} > 3)
+ {
+ $self->{curInfo}->{country} = $self->{curInfo}->{country}.", ".$origtext;
+ }
+ $self->{insideCountry} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ if ($self->{isDirector} == 3)
+ {
+ $self->{curInfo}->{director} = $origtext;
+ }
+ elsif ($self->{isDirector} > 3)
+ {
+ $self->{curInfo}->{director} = $self->{curInfo}->{director}.", ".$origtext;
+ }
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ if ($self->{isActors} == 1)
+ {
+ $self->{curInfo}->{actors} = $origtext;
+ }
+ elsif ($self->{isActors} > 1)
+ {
+ if ($origtext eq "...")
+ {
+ $self->{isActors} = -1;
+ }
+ else
+ {
+ $self->{curInfo}->{actors} = $self->{curInfo}->{actors}.", ".$origtext;
+ }
+ }
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideSynopsis} == 1)
+ {
+ #$origtext =~ s/^\s+//;
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 2;
+ }
+ elsif ($self->{isTime} == 1 || $self->{isDirector} == 1 || $self->{isCountry} == 1)
+ {
+ $self->{isDirector} = 0;
+ $self->{isTime} = 0;
+ $self->{isCountry} = 0;
+ if ($origtext eq "времÑ")
+ {
+ $self->{isTime} = 2;
+ }
+ elsif ($origtext eq "режиÑÑер")
+ {
+ $self->{isDirector} = 2;
+ }
+ elsif ($origtext eq "Ñтрана")
+ {
+ $self->{isCountry} = 2;
+ }
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ if ($self->{isGenre} == 1)
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ }
+ elsif ($self->{isGenre} > 1)
+ {
+ $self->{curInfo}->{genre} = $self->{curInfo}->{genre}.", ".$origtext;
+ }
+ $self->{insideGenre} = 0;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ if ($tagname eq "tr" && $self->{isDirector} >= 2)
+ {
+ $self->{isDirector} = 0;
+ }
+ elsif ($tagname eq "tr" && $self->{isGenre} != 0)
+ {
+ $self->{isGenre} = 0;
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideActorList} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{isYear} = 0;
+ $self->{isDirector} = 0;
+ $self->{isActors} = 0;
+ $self->{isTime} = 0;
+ $self->{isGenre} = 0;
+ $self->{isCountry} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+ $self->{insideActorList} = 0;
+ return $self;
+ }
+
+ sub getName
+ {
+ return "Kinopoisk";
+ }
+
+ sub getAuthor
+ {
+ return 'Nazarov Pavel';
+ }
+
+ sub getLang
+ {
+ return 'RU';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "windows-1251";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+ return "windows-1251";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.kinopoisk.ru/index.php?kp_query=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url =~ /^http:/;
+ return "http://www.kinopoisk.ru/" . $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/&#133;/\.\.\./g;
+ $html =~ s/\x92/'/g;
+ $html =~ s/\x93/“/g;
+ $html =~ s/\x94/â€/g;
+ $html =~ s/&#151;/—/g;
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+ $html =~ s/<br><br>/\x0A/g;
+ return $html;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm b/lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm
new file mode 100644
index 0000000..4caf406
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMediadis.pm
@@ -0,0 +1,316 @@
+package GCPlugins::GCfilms::GCMediadis;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMediadis;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ( ($attr->{href} =~ m|http://www\.mediadis\.com/video/detail\.asp|)
+ && ($attr->{class} eq 'a-blue'))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ elsif (($self->{couldBeCast}==1)
+ && ($attr->{href} =~ m|http://www\.mediadis\.com/products/search\.asp|))
+ {
+ # yes, found the magic link. director(s) to follow.
+ $self->{couldBeCast} = 2;
+ }
+ }
+ if (($tagname eq 'td') && ($attr->{class} eq 'search-list'))
+ {
+ if ($attr->{align} eq 'center')
+ {
+ $self->{couldBeYear} = 1;
+ }
+ if (($attr->{align} eq 'left') && ($attr->{colspan} eq '5'))
+ {
+ $self->{couldBeCast} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~ /^http:\/\/www\.(dvdzone2|mediadis)\.com\/pictures\/big\//)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ elsif ($tagname eq "p")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ elsif ($tagname eq "span")
+ {
+ if (($attr->{class} eq "detail-title"))
+ {
+ $self->{insideName} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'tr') {
+ $self->{couldBeCast} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ $origtext =~ s/^\s*(\S*)\s*$/$1/; # remove surrouding whitespace
+
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $self->capWord($origtext);
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{couldBeYear})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1
+ if $origtext =~ m/([0-9]{4})/;
+ $self->{couldBeYear} = 0;
+ }
+ elsif ($self->{couldBeCast} == 2) # waiting for director name
+ {
+ if ($origtext eq "-")
+ {
+ $self->{couldBeCast} = 3; # read actors now
+ }
+ elsif (!$self->{itemsList}[ $self->{itemIdx} ]->{director})
+ {
+ # revert the failed name transposure done my mediadis:
+ $origtext =~ s/^(.*) (\S+)$/$2 $1/;
+ # only one entry, no list.
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ }
+ }
+ elsif ($self->{couldBeCast} == 3) # waiting for actors names
+ {
+ if ($origtext)
+ {
+ # revert the failed name transposure done my mediadis:
+ $origtext =~ s/^(.*) (\S+)$/$2 $1/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{actors} .= $origtext;
+ }
+ }
+ }
+ else
+ {
+ $origtext =~ s/ : //g if !$self->{insideSynopsis};
+ if ($self->{insideRating})
+ {
+ $origtext =~ s{(\d+),(\d+)/10}{$1.$2};
+ $self->{curInfo}->{ratingpress} = int ($origtext + 0.5);
+ $self->{insideRating} = 0;
+ }
+ elsif ($self->{insideGenre})
+ {
+ $origtext =~ s/ - /,/g;
+ # don't scream! Convert all caps to first cap only.
+ $self->{curInfo}->{genre} .= ucfirst(lc($origtext));
+ $self->{insideGenre} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ if (!$self->{curInfo}->{director})
+ {
+ my @directors = split(/\s+-\s+/, $origtext);
+ for (my $i=0; $i<@directors; $i++)
+ {
+ # revert the failed name transposure done my mediadis:
+ $directors[$i] =~ s/^(.*) (\S+)$/$2 $1/;
+ }
+ $self->{curInfo}->{director} = join (', ', @directors);
+ }
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} .= $origtext . "\n\n";
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideNat})
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideActors})
+ {
+ foreach my $name (split(/\s+-\s+/, $origtext))
+ {
+ # revert the failed name transposure done my mediadis:
+ # move the first name part back in front.
+ $name =~ s/^(.*) (\S+)$/$2 $1/;
+ # and store the actors in a proper list.
+ push @{$self->{curInfo}->{actors}}, [$name]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ $self->{insideActors} = 0;
+ }
+ elsif ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $self->capWord($origtext) if !$self->{curInfo}->{original};
+ $self->{insideOrig} = 0;
+ }
+ elsif (($self->{inside}->{span}) && ($self->{insideName}))
+ {
+ $self->{curInfo}->{title} = $self->capWord($origtext) if !$self->{curInfo}->{title};
+ }
+ elsif ($self->{inside}->{strong})
+ {
+ $self->{insideDate} = 1 if $origtext =~ m/Year/;
+ $self->{insideDirector} = 1 if $origtext =~ m/Director\(s\)/;
+ $self->{insideGenre} = 1 if $origtext =~ m/Genres/;
+ $self->{insideOrig} = 1 if $origtext =~ m/Original title/;
+ $self->{insideTime} = 1 if $origtext =~ m/Duration/;
+ $self->{insideNat} = 1 if $origtext =~ m/Country/;
+ $self->{insideActors} = 1 if $origtext =~ m/Actors/
+ or $origtext =~ m/Voice of/;
+ }
+ if ($self->{inside}->{td})
+ {
+ if ($origtext =~ m/Global rating/)
+ {
+ $self->{insideRating} = 1;
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0, # hide the date as it is wrong most of the time
+ director => 1,
+ actors => 1
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s|<a (class="underline" )?href="http://www\.mediadis\.com/products/search\.asp\?par=[0-9]*" title="Filmography">([^<]*)</a>|$2|g;
+ $html =~ s/&nbsp;/ /g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.mediadis.com/video/search.asp?t=19&pl=all&kw=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return 'http://www.mediadis.com/video/';
+ }
+
+ sub getName
+ {
+ return 'Mediadis';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm b/lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm
new file mode 100644
index 0000000..f628a33
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMetropoliES.pm
@@ -0,0 +1,382 @@
+package GCPlugins::GCfilms::GCMetropoliES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMetropoliES;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+# Recorta el código del listado de resultados, quedandose solo con la parte que nos interesa del html
+# el modificador s/.../$1/s trata el flujo como una sola cadena y reemplaza todo el cuerpo con la parte que nos interesa
+ $html =~ s/^.*(<table width="100%" border="0" cellspacing="0" cellpadding="5">.*<\/td>\n <\/tr>\n<\/table>)\n\n\n.*$/$1/gs;
+
+ # Recorta el código de la ficha, quedandose solo con la parte que nos interesa del html
+ $html =~ s/^.*(<table width="100%" border="0" cellspacing="0" cellpadding="5">.*<\/td>\n <\/tr>\n<\/table>)\n<table.*$/$1/gs;
+ return $html;
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ # Código para procesar el resultado de la busqueda
+ if ($self->{parsingList})
+ {
+ if ($self->{isDate} eq 2)
+ {
+ $self->{isDate} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext;
+ $self->{isTitle} = 1;
+ return;
+ }
+
+ if ($self->{isTitle} eq 2)
+ {
+ $self->{isTitle} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isOrigTit} = 1;
+ return;
+ }
+ if ($self->{isOrigTit} eq 2)
+ {
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 1;
+ return;
+ }
+
+ if ($self->{isDirector} eq 2)
+ {
+ $self->{isDirector} = 0;
+ $self->{itemsList}[ $self->{itemIdx} ]->{director} = $origtext;
+ $self->{insedeInfos} = 0;
+ return;
+ }
+ return;
+ }
+
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ #$origtext =~ s/\n//g if !$self->{insideSynopsis};
+ if ($self->{insideName})
+ {
+ if ($origtext =~ /([^\(]*) \(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{title} = $1;
+ $self->{curInfo}->{date} = $2;
+ }
+ $self->{insideName} = 0;
+ }
+ if ($self->{inside}->{td})
+ {
+ if ($origtext =~ /(.*), (.*), (.*) Min\./)
+ {
+ $self->{curInfo}->{original} = $1;
+ $self->{curInfo}->{country} = $2;
+ $self->{curInfo}->{time} = $3;
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{insideActors}--;
+ if ($self->{insideActors} eq 0)
+ {
+ $self->{insideActors} = 0;
+ $self->{curInfo}->{actors} = $origtext;
+ }
+ }
+ }
+ if ($self->{insideDirector})
+ {
+ $self->{insideDirector} = 0;
+ $self->{curInfo}->{director} = $origtext;
+ }
+
+ if ($self->{inside}->{span})
+ {
+ if ($origtext =~ /Int.rpretes:/)
+ {
+ $self->{insideActors} = 2;
+ }
+ }
+ if ($self->{insideSynopsis})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ $self->{insideInfos} = 0;
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ # Código para procesar el resultado de la busqueda
+ #if ($self->{parsingList}){
+ #}
+ # Código para procesar la información de la pelicula seleccionada
+ #else {
+ #}
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ # Código para procesar el resultado de la busqueda para generar el listado
+ if ($self->{parsingList})
+ {
+ # Comprobamos si estamos dentro de un tr con la info de un titulo
+ if (($tagname eq "tr") && (($attr->{bgcolor} eq "#ECF5FF") || ($attr->{bgcolor} eq "#FFFFFF")))
+ {
+ $self->{insideInfos} = 1;
+ # Lo primero a leer es la fecha. Indicamos que es el siguiente a procesar
+ $self->{isDate} = 1;
+ $self->{isTitle} = 0;
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 0;
+ # Aumentamos el número de resultados encontrados
+ $self->{itemIdx}++;
+ return;
+ }
+
+ # Comprobamos que campo de la información estamos pocesando
+ if ($tagname eq "td" && $self->{insideInfos})
+ {
+ $self->{isDate} = 2 if $self->{isDate} eq 1;
+ $self->{isOrigTit} = 2 if $self->{isOrigTit} eq 1;
+ $self->{isDirector} = 2 if $self->{isDirector} eq 1;
+ }
+ if ($tagname eq "a" && $self->{isTitle})
+ {
+ $self->{isTitle} = 2;
+ # Guardamos la Url del enlace
+ my $url = $attr->{href};
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ # Código para procesar la información de la pelicula seleccionada
+ else
+ {
+ # Si estamos dentro de una imagen y no se ha asignado ninguna, la asignamos
+ if (($tagname eq "img") & !$self->{curInfo}->{image})
+ {
+# Imágenes en cmg:
+# Thumb http://carteles.metropoliglobal.com/galerias/data/1149/1563-2008-rastrooculto-espanol-210459-thumb.jpg
+# Normal: http://carteles.metropoliglobal.com/galerias/data/1149/1563-2008-rastrooculto-espanol-210459.jpg
+# Extraemos la dirección de la imagen a partir del thumb
+ if ($attr->{src} =~ /\.\.\/(galerias\/data\/[0-9]*\/.*)-thumb\.jpg/)
+ {
+ $self->{curInfo}->{image} = "http://carteles.metropoliglobal.com/" . $1 . ".jpg";
+ }
+ }
+
+ # Comprobamos el rating
+ if ($tagname eq "img")
+ {
+ # En cmg la puntuación está asignada con una imagen con el formato ratingX.gif donde
+ # X está entre 0 y 5
+ if ($attr->{src} =~ /imagenes\/rating([0-5])\.gif/)
+ {
+ $self->{curInfo}->{ratingpress} = ($1 / 5) * 10;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ $self->{insideName} = 1 if $attr->{class} eq "title";
+ $self->{insideInfos} = 1 if $attr->{class} eq "title";
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideDirector} = 1 if $attr->{width} eq "84%";
+ if ($self->{insideInfos})
+ {
+ $self->{insideSynopsis} = 1 if $attr->{colspan} eq "2";
+ }
+ }
+ }
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ #sub changeUrl
+ #{
+ # my ($self, $url) = @_;
+ # return $url;
+ #}
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ #sub getExtra
+ #{
+ # return 'Extra';
+ #}
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return "ES";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return "DoVerMan";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return 'CartelesMetropoliGlobal';
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+ # Charset de la web
+ return "iso-8859-1";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ # url contendrá ficha.php?......
+
+ return "http://carteles.metropoliglobal.com/paginas/$url";
+ }
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://carteles.metropoliglobal.com/paginas/ficha.php"
+ . "?qbtitulo=$word&qbbuscar=titulo&Submit=Buscar&qsec=buscar";
+ }
+
+ # Constructor
+ sub new
+ {
+ # Inicialización
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ # Campos que devuelve el plugin (1 si, 0 no). Son los que apareceran
+ # en el listado de resultados
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 0,
+ };
+
+ # Indica si estamos procesando información útil
+ $self->{insideInfos} = 0;
+
+ # Indican el estado del procesado del listado de resultados (0 no procesar, 1 es el siguiente, 2 procesando)
+ $self->{isDate} = 0;
+ $self->{isTitle} = 0;
+ $self->{isOrigTit} = 0;
+ $self->{isDirector} = 0;
+
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm b/lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm
new file mode 100644
index 0000000..1e989c2
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMonsieurCinema.pm
@@ -0,0 +1,272 @@
+package GCPlugins::GCfilms::GCMonsieurCinema;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+###################################
+# #
+# Plugin soumis par MeV #
+# #
+###################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMonsieurCinema;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ /^http\:\/\/cinema\.tiscali\.fr\/fichefilm\.aspx/)
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ($attr->{src} =~
+ m|^http\://media\.monsieurcinema\.com/film/[0-9]*/[0-9]*/[0-9]*\.jpg|)
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ elsif ($tagname eq "b")
+ {
+ if ($attr->{class} eq "sous_titre")
+ {
+ $self->{insideName} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} eq "sous_titre")
+ {
+ $self->{insideDate} = 1;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} eq "movie_infos")
+ {
+ $self->{insideInfos} = 1;
+ }
+ elsif ($attr->{align} eq "justify")
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($origtext =~ /, de ([^(]*)�\(([0-9]{4})\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"director"} = $1;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $2;
+ }
+ }
+ else
+ {
+ $origtext =~ s/\s{2,}//g;
+ $origtext =~ s/\[endline\]/\n/g if !$self->{insideSynopsis} && !$self->{insideCast};
+
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $self->capWord($origtext);
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideDate})
+ {
+ if ($origtext =~ /\(([0-9]{4})\)/)
+ {
+ $self->{curInfo}->{date} = $1;
+ $self->{insideCast} = 1;
+ }
+ $self->{insideDate} = 0;
+ }
+ elsif ($self->{insideInfos})
+ {
+ if (($origtext =~ /Genre\s*\:\s*(.*)/) || ($origtext =~ /Catégorie\s*\:\s*(.*)/))
+ {
+ $self->{curInfo}->{genre} .= $self->{curInfo}->{genre} ? "," . $1 : $1;
+ $self->{curInfo}->{genre} =~ s/, /,/g;
+ }
+ elsif ($origtext =~ /Durée\s*\:\s*(.*)/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ elsif ($origtext =~ /Pays\s*\:\s*(.*)/)
+ {
+ $self->{curInfo}->{country} = $1;
+ }
+ elsif ($origtext =~ /Public\s*\:\s*(.*)/)
+ {
+ if ($1 eq 'Tous publics')
+ {
+ $self->{curInfo}->{age} = 2;
+ }
+ else
+ {
+ $self->{curInfo}->{age} = $1;
+ $self->{curInfo}->{age} =~ s/.*?([0-9]+).*/$1/;
+ }
+ }
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ s/\[endline\]/\n/g;
+ $self->{curInfo}->{synopsis} = $origtext if !$self->{curInfo}->{synopsis};
+ $self->{insideSynopsis} = 0;
+ }
+ elsif ($self->{insideCast})
+ {
+ $origtext =~ s/\[endline\]//g;
+ $origtext =~ s/ |
+//g;
+ if ($origtext =~ /de(.*)avec(.*)/)
+ {
+ $self->{curInfo}->{director} = $1;
+ $self->{curInfo}->{actors} = $2;
+ }
+ $self->{insideCast} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 0,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s{</?b>}{}g;
+ $html =~ s/<br>/\[endline\]/gi;
+ $html =~ s{<span style="text-transform\:uppercase;">([^<]*)</span>}
+ {$1}g;
+ $html =~ s{<div style="float\:left;width\:100px">([^<]*)</div>[^<]*<div style="float\:left;">([^<]*)</div>}
+ {<div class="movie_infos">$1 \: $2</div>}g;
+ $html =~ s{<a href="http\://cinema\.tiscali\.fr/recherche\.aspx\?file=http&amp;keys=[^"]*">([^<]*)</a>}
+ {$1}g;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://cinema.tiscali.fr/recherche.aspx?file=http&keys=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url unless $url eq '';
+ return "http://cinema.tiscali.fr/";
+ }
+
+ sub getName
+ {
+ return "MonsieurCinema.com";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ return "utf8";
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm b/lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm
new file mode 100644
index 0000000..f325817
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMovieMeter.pm
@@ -0,0 +1,429 @@
+package GCPlugins::GCfilms::GCMovieMeter;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+# Copyright 2007 Petr Gajdusek (Pajdus) <gajdusek.petr@centrum.cz>
+# Copyright 2007 Mattias de Hollander (MaTiZ) <mdehollander@gmail.com>
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginMovieMeter;
+
+ use HTTP::Cookies;
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $url;
+
+ # Your code here
+
+ my $response =
+ $self->{ua}->post("http://www.moviemeter.nl/film/search", [ 'search[title]' => $word ]);
+ $url = return "http://www.moviemeter.nl/film/searchresults/";
+
+ return $url;
+ }
+
+ # getItemUrl
+ # Used to get the full URL of a movie page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.moviemeter.nl';
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ #return "WINDOWS-1250";
+ return "ISO-8859-1";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "MovieMeter.nl";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'MaTiZ';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'NL';
+ }
+
+ # hasSearchYear
+ # Used to hide year column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchYear
+ {
+ return 1;
+ }
+
+ # hasSearchDirector
+ # Used to hide director column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchDirector
+ {
+ return 0;
+ }
+
+ # hasSearchActors
+ # Used to hide actors column in search results
+ # Return 0 to hide column, 1 to show it.
+ sub hasSearchActors
+ {
+ return 0;
+ }
+
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return 'Original Title';
+ #return '';
+ }
+
+ # changeUrl
+ # Can be used to change URL if movie URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+
+ # Your code for processing search results here
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/\/film\/[0-9]+/)
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{class} =~ /filmresults/)
+ {
+ $self->{isYear} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} =~ /subtext/)
+ {
+ $self->{altTitle} = 1;
+ }
+ }
+ }
+ else
+ {
+ # Your code for processing movie information here
+ if ($tagname eq "h1")
+ {
+ $self->{insideName} = 1;
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($attr->{class} eq "poster")
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{insideFilmInfo})
+ {
+ if ($attr->{href} =~ /director/)
+ {
+ $self->{insideFilmDir} = 1;
+ $self->{filminfo_dir} += 1;
+ }
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if ($attr->{id} eq "film_info")
+ {
+ $self->{insideFilmInfo} = 1;
+ $self->{filminfo_id} = 0;
+ }
+ elsif ($attr->{id} eq "beslistresults")
+ {
+ $self->{insideFilmInfo} = 0;
+ }
+ elsif ($attr->{id} eq "film_votes")
+ {
+ $self->{insideRating} = 1;
+ }
+
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+
+ }
+ else
+ {
+ # Your code for processing movie information here
+
+ # optional
+ if ($tagname eq "div")
+ {
+ if ($self->{insideRating})
+ {
+ $self->{insideRating} = 0;
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($self->{insideFilmDir})
+ {
+ $self->{insideFilmDirOUT} = 1;
+ $self->{insideFilmDir} = 0;
+ }
+ }
+ }
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isYear})
+ {
+ # Remove brackets from year: from (2002) to 2002
+ $origtext =~ s/(\)|\()//g;
+ # Remove leading or trailing whitespace
+ $origtext =~ s/^\s+|\s+$//g;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"date"} = $origtext;
+ $self->{isYear} = 0;
+ }
+ elsif ($self->{altTitle})
+ {
+ $origtext =~ /Alternatieve titel:\s(.*)/;
+ $self->{itemsList}[ $self->{itemIdx} ]->{"extra"} =
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"};
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $1;
+ $self->{altTitle} = 0;
+ }
+
+ }
+ else
+ {
+ # Your code for processing movie information here
+ if ($self->{insideName})
+ {
+ # First try to use the search results information, otherwise
+ # parse the movie information
+ my $title = $self->{itemsList}[ $self->{wantedIdx} ]->{"title"};
+ if ($title)
+ {
+ $self->{curInfo}->{title} = $title;
+ $self->{curInfo}->{date} = $self->{itemsList}[ $self->{wantedIdx} ]->{"date"};
+ $self->{curInfo}->{original} =
+ $self->{itemsList}[ $self->{wantedIdx} ]->{"extra"};
+ }
+
+ else
+ {
+ # Split Little Miss Sunshine (2006) into title and year
+ my ($title, $year) = ($origtext =~ /(\D+)\s\((\d+)\)/);
+ $self->{curInfo}->{title} = $title;
+ $self->{curInfo}->{date} = $year;
+ }
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideFilmInfo})
+ {
+ $self->{filminfo_id} += 1;
+ # Country Genre Time
+ if ($self->{filminfo_id} == 2)
+ {
+ my @parts = split("\n", $origtext);
+ $self->{curInfo}->{country} = $parts[0];
+ my $genre = $parts[1];
+ $genre =~ s/\s\/\s/,/;
+ $self->{curInfo}->{genre} = $genre;
+ my $time = $parts[2];
+ $time =~ s/\sminuten//;
+ $self->{curInfo}->{time} = $time;
+ }
+ # Director
+ elsif ($self->{insideFilmDir})
+ {
+ if (exists $self->{curInfo}->{director})
+ {
+ $self->{curInfo}->{director} =
+ $self->{curInfo}->{director} . ", " . $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{director} = $origtext;
+
+ }
+ }
+ if ($origtext =~ s/\nmet\s//)
+ {
+ my @parts = split("\n\n", $origtext);
+ $self->{curInfo}->{synopsis} = $parts[1];
+ $parts[0] =~ s/ en /, /;
+ foreach my $actor (split("\s*,\s*", $parts[0]))
+ {
+ push @{$self->{curInfo}->{actors}}, [$actor]
+ if $self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS;
+ $self->{actorsCounter}++;
+ }
+ }
+ }
+ elsif ($self->{insideRating})
+ {
+ # Use a dot instead of a comma as decimal seperator
+ $origtext =~ s/,/./;
+ # Scale rating to a maximum of 10
+ # and round to integer
+ $self->{curInfo}->{ratingpress} = int($origtext * 2 + 0.5);
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{ua}->cookie_jar(HTTP::Cookies->new);
+
+ # Do your init stuff here
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+
+ return $self;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # replace <BR> and <P> tags with \n (also, </BR>,</P>, <P/>, <BR/> )
+ $html =~ s/\<(\/)?(BR|P)(\s*\/)?\>/\n/mgi;
+
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm b/lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm
new file mode 100644
index 0000000..f1a5e6c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCMoviecovers.pm
@@ -0,0 +1,246 @@
+package GCPlugins::GCfilms::GCMoviecovers;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginMoviecovers;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if (($attr->{href} =~ /^\/film\/titre_/) && ($self->{inside}->{li}))
+ {
+ my $url = $attr->{href};
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 0;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ my $src = $attr->{src};
+ my $alt = $attr->{alt};
+ if (!$self->{curInfo}->{image})
+ {
+ if ($alt =~ /^Recto/)
+ {
+ $src =~ s/http\:\/\/www\.moviecovers\.com\/DATA\/thumbs\/films\-[A-Za-z0-9-]+\/(.*)/$1/;
+ $self->{curInfo}->{image} =
+ "http://data.moviecovers.com/DATA/zipcache/" . $src;
+ }
+ }
+ }
+ }
+
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+
+ if ($self->{inside}->{li})
+ {
+ my $element = undef;
+ if ($origtext =~ /^ \([0-9]{4}\)/)
+ {
+ $origtext =~ s/ \(([0-9]{4})\)/$1/;
+ $element = "date";
+ $self->{isInfo} = 0;
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{$element} = $origtext
+ if $element;
+ }
+
+ }
+ else
+ {
+
+ if ($self->{inside}->{title})
+ {
+ $self->{curInfo}->{title} = $origtext if length($origtext) > 2;
+ }
+
+ if ($self->{inside}->{td})
+ {
+ if ($self->{insideOriginal})
+ {
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOriginal} = 0;
+ }
+ elsif (($self->{insideGenre}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{insideGenre} = 0;
+ }
+ elsif (($self->{insideDirector}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif (($self->{insideNat}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{country} = $origtext;
+ $self->{insideNat} = 0;
+ }
+ elsif ($self->{insideTime})
+ {
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{time} = $origtext;
+ $self->{insideTime} = 0;
+ }
+ elsif ($self->{insideDate} && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{date} = $origtext;
+ $self->{insideDate} = 0;
+ }
+ elsif (($self->{insideActors}) && ($self->{inside}->{a}))
+ {
+ $self->{curInfo}->{actors} .= $origtext . ', '
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ }
+ }
+ if ($self->{inside}->{th})
+ {
+ $self->{insideDirector} = 1 if $origtext =~ m/Réalisateur/;
+ $self->{insideActors} = 1 if $origtext =~ m/Acteurs principaux/;
+ $self->{insideGenre} = 1 if $origtext =~ m/Genre/;
+ $self->{insideTime} = 1 if $origtext =~ m/Durée/;
+ $self->{insideNat} = 1 if $origtext =~ m/Nationalité/;
+ $self->{insideDate} = 1 if $origtext =~ m/Année/;
+# $self->{insideSynopsis} = 1 if $origtext =~ m/Résumé/;
+ $self->{insideOriginal} = 1 if $origtext =~ m/Titre original/;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 1,
+ actors => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ bless($self, $class);
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.moviecovers.com/multicrit.html?titre=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.moviecovers.com" . $url;
+ }
+
+ sub getName
+ {
+ return "MovieCovers.com";
+ }
+
+ sub getAuthor
+ {
+ return 'Patrick Fratczak';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ return "ISO-8859-1";
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm b/lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm
new file mode 100644
index 0000000..9e093c7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCNasheKino.pm
@@ -0,0 +1,222 @@
+package GCPlugins::GCfilms::GCNasheKino;
+
+###################################################
+#
+# Copyright 2005-2009 zserghei
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+use Encode qw(encode);
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginNasheKino;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ my $url = $attr->{href};
+ if ($attr->{class} eq "ab10" && $url =~ m/\/data.movies\?id/)
+ {
+ $self->{isMovie} = 1;
+ $self->{isDate} = 2;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ if ( $tagname eq "a"
+ && $attr->{class} eq "ab10"
+ && $self->{isDate} == 2)
+ {
+ $self->{isDate} = 1;
+ }
+ }
+ else
+ {
+ if ( $tagname eq "a"
+ && $attr->{class} eq "ab10"
+ && $self->{inside}->{h1})
+ {
+ $self->{insideDate} = 1;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ return;
+ }
+ elsif ($self->{isDate} == 1)
+ {
+ if ($origtext =~ m/([0-9]+)\sг/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ $self->{isDate} = 0;
+ }
+ }
+ }
+ else
+ {
+ utf8::decode($origtext);
+ $origtext =~ s/^\s+//;
+ $origtext =~ s/\s+$//;
+ if ($self->{inside}->{h1})
+ {
+ $self->{curInfo}->{title} = $origtext
+ if !$self->{curInfo}->{title};
+ }
+ if ($self->{insideDate})
+ {
+ if ($origtext =~ m/([0-9]+)\sг/)
+ {
+ $self->{curInfo}->{date} = $1;
+ if ($self->{curInfo}->{date} < 1992)
+ {
+ $self->{curInfo}->{country} = "СССР";
+ }
+ else
+ {
+ $self->{curInfo}->{country} = "РоÑÑиÑ";
+ }
+ $self->{curInfo}->{audio} = "руÑÑкий";
+ $self->{insideDate} = 0;
+ }
+ }
+ if ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ if ($origtext =~ m/\S+/)
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ elsif ($self->{insideActors})
+ {
+ $self->{insideActors} = 0 if $origtext =~ m/Сценарий:/;
+ if ( $origtext !~ m/^,/
+ && $self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ $self->{curInfo}->{actors} .= (
+ $self->{curInfo}->{actors}
+ ? ", " . $origtext
+ : $origtext
+ );
+ $self->{actorsCounter}++;
+ }
+ }
+ $self->{insideDirector} = 1 if $origtext =~ m/РежиÑÑер\(Ñ‹\):/;
+ $self->{insideActors} = 1 if $origtext =~ m/Ðктер\(Ñ‹\):/;
+ $self->{insideSynopsis} = 1 if $origtext =~ m/О\sфильме:/;
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub getName
+ {
+ return "NasheKino";
+ }
+
+ sub getAuthor
+ {
+ return 'zserghei';
+ }
+
+ sub getLang
+ {
+ return 'RU';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "Windows-1251";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.nashekino.ru/data.find?t=0&yr=&sval=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return "http://www.nashekino.ru/" . $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{parsingEnded} = 0;
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm b/lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm
new file mode 100644
index 0000000..511ec4e
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCOFDb.pm
@@ -0,0 +1,304 @@
+package GCPlugins::GCfilms::GCOFDb;
+
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginOFDb;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ( ($attr->{href} =~ m/view\.php\?page=film&fid=[0-9]*/)
+ || ($attr->{href} =~ m|^film/[0-9]*|))
+ {
+ $self->{isTitle} = 1;
+ $self->{isInfo} = 0;
+ $self->{isOriginal} = 0;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+ }
+ elsif ($tagname eq "font")
+ {
+ if ($self->{isInfo})
+ {
+ $self->{isOriginal} = 1;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "font")
+ {
+ if ($attr->{face} eq "Arial,Helvetica,sans-serif")
+ {
+ if ($attr->{size} eq "3")
+ {
+ $self->{insideName} = 1;
+ }
+ elsif ($attr->{size} eq "2")
+ {
+ $self->{insideInfosNames} = 1 if $attr->{class} eq "Normal";
+ $self->{insideInfos} = 1 if $attr->{class} eq "Daten";
+ }
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ if ($attr->{src} =~ m|img\.ofdb\.de/film/[0-9]+/[0-9]*.jpg|)
+ {
+ $self->{curInfo}->{image} = $attr->{src}
+ if !$self->{curInfo}->{image};
+ }
+ elsif ($attr->{src} eq "images/design3/notenspalte.png")
+ {
+ $self->{curInfo}->{ratingpress} = int( $attr->{alt} + 0.5 )
+ if ! $self->{curInfo}->{ratingpress};
+ }
+ }
+ elsif ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m/view\.php\?page=blaettern&Kat=Land&Text=(.*)/)
+ {
+ $self->{insideCountry} = 1;
+ }
+ $self->{curInfo}->{date} = $1
+ if ($attr->{href} =~ m/view\.php\?page=blaettern&Kat=Jahr&Text=([0-9]{4})/);
+ }
+ elsif (($tagname eq "div") && ($attr->{class} eq "synopsis"))
+ {
+ $self->{insideSynopsis} = 1;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ if ($tagname eq "tr")
+ {
+ $self->{insideDirector} = 0;
+ $self->{insideActors} = 0;
+ $self->{insideGenre} = 0;
+ $self->{insideInfos} = 0;
+ }
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isTitle})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{"title"} = $origtext;
+ $self->{isTitle} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ elsif ($self->{isOriginal})
+ {
+ $origtext =~ s{^\s*/\s*}{};
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $origtext;
+ $self->{isOriginal} = 0;
+ return;
+ }
+ elsif (($self->{isInfo}) && ($origtext =~ m/\((\d{4})\)/))
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideName})
+ {
+ $self->{curInfo}->{title} = $origtext if !$self->{curInfo}->{title};
+ $self->{insideName} = 0;
+ }
+ elsif ($self->{insideInfosNames})
+ {
+ $self->{insideOrig} = 1 if $origtext =~ m/Originaltitel:/;
+ $self->{insideDirector} = 1 if $origtext =~ m/Regie:/;
+ $self->{insideActors} = 1 if $origtext =~ m/Darsteller:/;
+ $self->{insideGenre} = 1 if $origtext =~ m/Genre\(s\):/;
+ $self->{insideInfosNames} = 0;
+ }
+ elsif ($self->{insideCountry})
+ {
+ $self->{curInfo}->{country} .= ', ' if $self->{curInfo}->{country};
+ $self->{curInfo}->{country} .= $origtext;
+ $self->{insideCountry} = 0;
+ }
+ elsif ($self->{insideInfos} && $self->{inside}->{font})
+ {
+ if ($self->{insideOrig})
+ {
+ $self->{curInfo}->{original} = $origtext;
+ $self->{insideOrig} = 0;
+ $self->{insideInfos} = 0;
+ }
+ elsif ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} .=
+ $self->{curInfo}->{director}
+ ? ', ' . $origtext
+ : $origtext;
+ }
+ elsif ($self->{insideActors})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if $self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS;
+ $self->{actorsCounter}++;
+ }
+ elsif ($self->{insideGenre})
+ {
+ push @{$self->{curInfo}->{genre}}, [$origtext];
+ }
+ }
+ elsif ($self->{insideSynopsis})
+ {
+ $origtext =~ m/(http.*?)(\s|$)/;
+ my $page = $self->loadPage($1, 0, 1);
+ $page =~ m|<font face="Arial,Helvetica,sans-serif" size="2" class="Blocksatz">.*?</a><br>[^<]*</b>(?:</b>)?<br><br>(.*?)</font>|ms;
+ $self->{curInfo}->{synopsis} = $1;
+ $self->{curInfo}->{synopsis} =~ s/<br \/>/\n/gi;
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isYear} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s|onmouseover="[^"]*"||gms;
+ }
+ $html =~ s{<a href="view\.php\?page=liste&Name=[^"]*">([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<a href="view\.php\?page=genre&Genre=[^"]*">([^<]*)</a>}
+ {$1}g;
+ $html =~ s{<font face="Arial,Helvetica,sans-serif" size="2" class="Blocksatz"><p class="Blocksatz"><b>Inhalt:<\/b>\s?([^<]*)<a href="(view\.php\?page=inhalt&fid=[0-9]*&sid=[0-9]*)">\s?<b>\[mehr\]</b></a></p></font>}
+ {<div class="synopsis">$1\nhttp://www.ofdb.de/$2</div>};
+ $html =~ s{<font face="Arial,Helvetica,sans-serif" size="2" class="Blocksatz"><p\s*class="Blocksatz"><b>Inhalt:</b>\s?([^<]*)<a href="(plot/[0-9]*[^"]*)">\s?<b>\[mehr\]</b></a></p></font>}
+ {<div class="synopsis">$1\nhttp://www.ofdb.de/$2</div>}gm;
+ $html =~ s{%DF}{ss};
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # if $word looks like an EAN, do a EAN search, otherwise title search
+ my $kat = ($word =~ /^[\dX]{8}[\dX]*$/) ? "EAN" : "Titel";
+
+ return "http://www.ofdb.de/view.php?page=suchergebnis&Kat=$kat&SText=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ utf8::decode($url);
+ return 'http://www.ofdb.de/' . $url;
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getName
+ {
+ return "OFDb.de";
+ }
+
+ sub getAuthor
+ {
+ return 'MeV';
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm b/lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm
new file mode 100644
index 0000000..0bd78c8
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCOdeonHU.pm
@@ -0,0 +1,305 @@
+package GCPlugins::GCfilms::GCOdeonHU;
+
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginOdeonHU;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m:(kat.phtml\?id=.*):)
+ { #?
+ my $url = '/' . $1;
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ }
+ }
+ else
+ {
+ if ($tagname eq "span")
+ {
+ $self->{insideTitle} = ($attr->{class} eq "ver11 modB colDD0008");
+ }
+ elsif ($tagname eq "td")
+ {
+ $self->{insideFieldName} = ($attr->{class} eq "ver9 col102643");
+ $self->{insideFieldValue} = ($attr->{class} eq "ver11 colblack");
+ $self->{insidePersonType} = ($attr->{class} eq "ver9 col1D5263 pad5");
+ $self->{insideSynopsis} = ($attr->{class} eq "ver11 col102643 pad2");
+ $self->{insideRating} = ($attr->{class} eq "text_cat_score");
+
+ if ($self->{insideSynopsis}
+ && (length($self->{curInfo}->{synopsis}) > 20))
+ {
+ $self->{insideSynopsis} = 0;
+ }
+ }
+ elsif ($tagname eq "img")
+ {
+ #if (! $self->{curInfo}->{image}) {
+ if ($attr->{src} =~ m:img/album/.*\.jpg$:)
+ {
+ my $img = 'http://odeon.hu/';
+ $img .= $attr->{src};
+ $self->{curInfo}->{image} = $img;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+
+ if ($tagname eq "a")
+ {
+ $self->{isMovie} = 0;
+ }
+ if ($tagname eq "td")
+ {
+ $self->{insideFieldName} = 0;
+ $self->{insideFieldValue} = 0;
+ $self->{insidePersonType} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideRating} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ #return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ if ($self->{inside}->{b})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} .= $origtext;
+ return;
+ }
+ else
+ {
+ if ($origtext =~ m/\[(.*),\s+([0-9]+)\]/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $2;
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $1;
+ $self->{isMovie} = 0;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ return;
+ }
+
+ if ($self->{insideFieldName})
+ {
+ $self->{FieldName} = "original" if $origtext =~ m/^eredeti/;
+ $self->{FieldName} = "date" if $origtext =~ m/^..?v:/;
+ $self->{FieldName} = "country" if $origtext =~ m/^nemzet:/;
+ $self->{FieldName} = "time" if $origtext =~ m/^hossz:/;
+ $self->{FieldName} = "todo" if $origtext =~ m/^k..?p:/;
+ $self->{FieldName} = "todo" if $origtext =~ m/^kiad/;
+ $self->{FieldName} = "todo" if $origtext =~ m/^dial..?gus:/;
+ $self->{FieldName} = "genre" if $origtext =~ m/^m..?faj:/;
+
+ $self->{insideFieldName} = 0;
+ return;
+ }
+
+ if ($self->{insideFieldValue})
+ {
+ my $txt = $origtext;
+ my $name = $self->{FieldName};
+ $txt =~ s/^\s*//;
+ $txt =~ s/\s*$//;
+ $txt =~ s/\s+/ /g;
+ $txt =~ s/\s*perc$// if $name eq "time";
+ return
+ if $txt =~ m/^\s*$/;
+
+ if ($self->{curInfo}->{$name} !~ m/^\s*$/)
+ {
+ $self->{curInfo}->{$name} .= "," . $txt;
+ }
+ else
+ {
+ $self->{curInfo}->{$name} = $txt;
+ }
+
+ return;
+ }
+
+ if ($self->{insidePersonType})
+ {
+ if ($self->{inside}->{b})
+ {
+ my $name = 0;
+ $name = "director" if $origtext =~ m/^Rendez/;
+ $name = "actors" if $origtext =~ m/^Szerepl/;
+ if ($name)
+ {
+ $self->{PersonType} = $name;
+ }
+ else
+ {
+ $self->{insidePersonType} = 0;
+ }
+ return;
+ }
+ elsif ($self->{inside}->{a})
+ {
+ my $name = $self->{PersonType};
+ if ($self->{curInfo}->{$name} !~ m/^\s*$/)
+ {
+ $self->{curInfo}->{$name} .= "," . $origtext;
+ }
+ else
+ {
+ $self->{curInfo}->{$name} = $origtext;
+ }
+ #$self->{curInfo}->{actors} .= $origtext.', '
+ #if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ #$self->{actorsCounter}++;
+ }
+
+ return;
+ }
+
+ if ($self->{insideSynopsis})
+ {
+ my $txt = $origtext;
+ $txt =~ s/\r/\n/g;
+ $txt =~ s/^\s+//g;
+ $txt =~ s/\s+$//g;
+ $self->{curInfo}->{synopsis} .= $txt;
+ }
+ if ($self->{insideRating})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5)
+ if $origtext =~ /^[0-9.]+$/;
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ };
+
+ $self->{isMovie} = 0;
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ if ($self->{parsingList})
+ {
+ $html =~ s{</?span[^>]*>}{}gi; # remove all <span> tags
+ }
+
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://odeon.hu/kat.phtml?".
+ "search=$word&scat=5&btn_hirlev.x=13&btn_hirlev.y=5";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.odeon.hu$url";
+ }
+
+ sub getName
+ {
+ return "odeon.hu";
+ }
+
+ sub getAuthor
+ {
+ return 'Anonymous';
+ }
+
+ sub getLang
+ {
+ return 'HU';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCOnet.pm b/lib/gcstar/GCPlugins/GCfilms/GCOnet.pm
new file mode 100644
index 0000000..29eef60
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCOnet.pm
@@ -0,0 +1,327 @@
+#
+# More information here: http://wiki.gcstar.org/en/websites_plugins
+#
+# GCcollection should be replaced with the kind of collection your
+# plugin deals with. e.g. GCfilms, GCgames, GCbooks,...
+
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCcollection::GCOnet;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginOnet;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Your code here
+
+ return "http://film.onet.pl/filmoteka.html?S=$word";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ # Your code here
+
+ return "http://film.onet.pl/" . $url;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-2";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "Onet";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Marek Cendrowicz';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'PL';
+ }
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return "";
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{list_title} && $tagname eq 'a')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ $self->{listTitle} = 1;
+ }
+ }
+ else
+ {
+ if ($attr->{class} eq 'tyw')
+ {
+ $self->{itemTitle} = 1;
+ }
+ elsif ($tagname eq 'div' && $attr->{class} eq 'a2')
+ {
+ $self->{itemDescription} = 1;
+ }
+ elsif ($attr->{class} eq 'item_actor')
+ {
+ $self->{itemActor} = 1;
+ }
+ elsif ($tagname eq 'img'
+ && $attr->{class} eq 'pic'
+ && ($attr->{alt} eq 'Galeria' || $attr->{alt} eq 'Plakat'))
+ {
+ $self->{curInfo}->{image} = "http://film.onet.pl/" . $attr->{src};
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{listTitle})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{listTitle} = 0;
+ }
+ elsif ($self->{inside}->{list_date})
+ {
+ ($self->{itemsList}[ $self->{itemIdx} ]->{date}) = ($origtext =~ m/,\s+(\d+)$/);
+ }
+ }
+ else
+ {
+ if ($self->{itemTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{itemTitle} = 0;
+ }
+ elsif ($self->{inside}->{item_country})
+ {
+ ($self->{curInfo}->{original}) = ($origtext =~ m/(.*)\s+\(/);
+ ($self->{curInfo}->{country}, $self->{curInfo}->{date}) =
+ ($origtext =~ m/(\w+),\s+(\d+)\)/);
+ $origtext =~ s|/|, |g;
+ ($self->{curInfo}->{genre}) = ($origtext =~ m/\)(.*)/);
+ }
+ elsif ($self->{inside}->{item_time})
+ {
+ ($self->{curInfo}->{time}, $self->{curInfo}->{age}) =
+ ($origtext =~ m/czas\s+(\d+).*\s+od\s+(\d+)/);
+ }
+ elsif ($self->{inside}->{item_director})
+ {
+ $self->{curInfo}->{director} .= $origtext;
+ }
+ elsif ($self->{itemDescription})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{itemDescription} = 0;
+ }
+ elsif ($self->{itemActor})
+ {
+ $self->{curInfo}->{actors} .=
+ $self->{curInfo}->{actors} ? ", " . $origtext : $origtext;
+ $self->{itemActor} = 0;
+ }
+ elsif ($self->{inside}->{item_rating})
+ {
+ ($self->{curInfo}->{ratingpress}) = int($origtext * 2 + 0.5);
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{title} = '';
+ $self->{itemsList}[0]->{url} = '';
+
+ # Do your init stuff here
+ bless($self, $class);
+ return $self;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $html =~ s{<B>(.*?)</B>}{$1}gms;
+
+ if ($self->{parsingList})
+ {
+
+ $html =~ s{<TD class=a2 width="100%">(.*?)</TD>}
+ {<list_title>$1</list_title>}gms;
+ $html =~ s{<FONT class=a0 color="#993300">(.*?)</FONT>}
+ {<list_date>$1</list_date>}gms;
+ }
+ else
+ {
+ $html =~ s{<BR>}{}g;
+ $html =~ s{<TD class=a2 valign=top width="100%">(.*?)<}
+ {<item_country>$1</item_country><}gms;
+ $html =~ s{<SPAN class=a1>(.*?)</SPAN>}
+ {<item_time>$1</item_time>}gms;
+ $html =~ s{Re.yseria:&nbsp;&nbsp;(.*?)Scenariusz}
+ {<item_director>$1</item_director>}gms;
+ $html =~ s{Re.yseria:&nbsp;&nbsp;(.*?)wi.cej}
+ {<item_director>$1</item_director>}gms;
+ $html =~ s{a2><A class=u}
+ {a2><A class=item_actor}gms;
+ $html =~ s{Ocena filmu.*([0-9]\.[0-9]+)/5}
+ {<item_rating>$1</item_rating>}gms;
+ }
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm b/lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm
new file mode 100644
index 0000000..e460584
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCPortHU.pm
@@ -0,0 +1,343 @@
+package GCPlugins::GCfilms::GCPortHU;
+
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginPortHU;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingEnded})
+ {
+ return;
+ }
+
+ if ($self->{parsingList})
+ {
+ if ($tagname eq "a")
+ {
+ if ($attr->{href} =~ m:(/pls/fi/films.film_page.*):)
+ {
+ if ($self->{insideBoldText})
+ {
+ my $url = $1;
+ $self->{isMovie} = 1;
+ $self->{isInfo} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ }
+ else
+ {
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 0;
+ }
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} eq "txt")
+ {
+ $self->{isInfo}++
+ if $self->{isInfo};
+ }
+ $self->{insideBoldText} = ($attr->{class} eq "btxt");
+ }
+ }
+ else
+ {
+ if ($tagname eq "img")
+ {
+ if ( ($attr->{class} eq "object_picture")
+ && (!$self->{curInfo}->{image}))
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ $self->{insideOtherTitles} = 0;
+ $self->{insideDescription} = 1;
+ }
+ }
+ elsif ($tagname eq "div")
+ {
+ if (($attr->{class} eq "separator")
+ && $self->{insideActors})
+ {
+ $self->{insideActors} = 0;
+ $self->{insideSynopsis} = 1;
+ }
+ elsif (($attr->{class} eq "object_picture")
+ && (!$self->{curInfo}->{image}))
+ {
+ $attr->{style} =~ m/url\(([^\)]*)\)/;
+ $self->{curInfo}->{image} = $1;
+ $self->{insideOtherTitles} = 0;
+ $self->{insideDescription} = 1;
+ }
+ }
+ elsif ($tagname eq "span")
+ {
+ if ($attr->{class} eq "blackbigtitle")
+ {
+ $self->{insideTitle} = 1;
+ }
+ elsif ($attr->{class} eq "btxt")
+ {
+ $self->{insideBoldText} = 1;
+ }
+ else
+ {
+ $self->{insideBoldText} = 0;
+ }
+ $self->{insideNormalText} = ($attr->{class} eq "txt");
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if length($origtext) < 2;
+
+ $origtext =~ s/&#34;/"/g;
+ $origtext =~ s/&#179;/3/g;
+ $origtext =~ s/&#[0-9]*;//g;
+ $origtext =~ s/\n//g;
+
+ return if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isMovie})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{isMovie} = 0;
+ $self->{isInfo} = 1;
+ return;
+ }
+ if ($self->{isInfo} == 1)
+ {
+ if ($origtext =~ m/\((.*)\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{original} = $1;
+ }
+ $self->{isInfo} = 0
+ if $origtext =~ m/^&nbsp;&nbsp;$/;
+ }
+ if ($self->{isInfo} == 2)
+ {
+ if ($origtext =~ m/([0-9]+)\)/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $1;
+ }
+ if ($origtext =~ m/([0-9]+)\sperc/)
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{time} = $1;
+ }
+ $self->{isInfo} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{insideTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{insideTitle} = 0;
+ $self->{insideOtherTitles} = 1;
+ $self->{insideDescription} = 1;
+ return;
+ }
+ if ( $self->{insideOtherTitles}
+ && $self->{insideNormalText})
+ {
+ if ($origtext =~ m/\((.*)\)/)
+ {
+ $self->{curInfo}->{original} = $1;
+ }
+ $self->{insideOtherTitles} = 0;
+ return;
+ }
+ if ( $self->{insideDescription}
+ && $self->{insideBoldText})
+ {
+ if ($origtext =~ m/([0-9]+)\s+perc/)
+ {
+ $self->{curInfo}->{time} = $1;
+ }
+ if ($origtext =~ m/([0-9]+)$/)
+ {
+ $self->{curInfo}->{date} = $1;
+ }
+ if ($origtext =~ m/^([0-9]+)\s+�v/)
+ {
+ $self->{curInfo}->{age} = $1;
+ }
+ }
+
+ if ($origtext =~ m/^rendez/)
+ {
+ $self->{insideDirector} = 1;
+ $self->{insideOtherTitles} = 0;
+ $self->{insideDescription} = 0;
+ return;
+ }
+ if ($self->{insideDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{insideDirector} = 0;
+ return;
+ }
+
+ if ($origtext =~ m/^szerepl/)
+ {
+ $self->{insideActors} = 1;
+ return;
+ }
+ if ($self->{insideActors})
+ {
+ if ($self->{inside}->{a})
+ {
+ push @{$self->{curInfo}->{actors}}, [$origtext]
+ if ($self->{actorsCounter} <
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ $self->{actorsCounter}++;
+ return;
+ }
+ elsif ($origtext =~ m/\((.*)\)/)
+ {
+ # As we incremented it above, we have one more chance here to add a role
+ # Without <= we would skip the role for last actor
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} - 1 ]},
+ $1
+ if ($self->{actorsCounter} <=
+ $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS);
+ }
+ }
+
+ if ( $origtext =~ m/^(Linkek|Bemutat|Aj�nl�k)/
+ && $self->{insideBoldText})
+ {
+ $self->{parsingEnded} = 1;
+ $self->{insideSynopsis} = 0;
+ return;
+ }
+
+ if ( $self->{insideSynopsis}
+ && $self->{insideNormalText}
+ && $self->{inside}->{span}
+ && !$self->{inside}->{a})
+ {
+ ($self->{curInfo}->{synopsis} .= $origtext) =~ s/^\s*//;
+ }
+
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ original => 1,
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isMovie} = 0;
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideActors} = 0;
+ $self->{curName} = undef;
+ $self->{curUrl} = undef;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ $self->{parsingEnded} = 0;
+
+ $html =~ s/"&#34;/'"/g;
+ $html =~ s/&#34;"/"'/g;
+ $html =~ s|</a></b><br>|</a><br>|;
+
+ $self->{insideDescription} = 0;
+ $self->{insideSynopsis} = 0;
+ $self->{insideActors} = 0;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $base_url = 'http://www.port.hu/pls/ci/cinema.film_creator';
+ return "$base_url?i_text=$word&i_film_creator=1";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return "http://www.port.hu$url";
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getName
+ {
+ return "port.hu";
+ }
+
+ sub getAuthor
+ {
+ return 'Anonymous';
+ }
+
+ sub getLang
+ {
+ return 'HU';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm b/lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm
new file mode 100644
index 0000000..8f4290e
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCStopklatka.pm
@@ -0,0 +1,355 @@
+#
+# More information here: http://wiki.gcstar.org/en/websites_plugins
+#
+# GCcollection should be replaced with the kind of collection your
+# plugin deals with. e.g. GCfilms, GCgames, GCbooks,...
+
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCcollection::GCStopklatka;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCfilms::GCPluginStopklatka;
+
+ use base qw(GCPlugins::GCfilms::GCfilmsPluginsBase);
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ # Your code here
+
+ return "http://www.stopklatka.pl/szukaj/szukaj.asp?kategoria=film&szukaj=$word";
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ # Your code here
+
+ return "http://www.stopklatka.pl/" . $url;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-2";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "Stopklatka";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Marek Cendrowicz';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'PL';
+ }
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return "";
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{inside}->{list_details})
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $attr->{href};
+ }
+
+ $self->{listTitle} = 1
+ if ($attr->{class} eq 'searchTitle textB');
+
+ $self->{listYear} = 1
+ if ($attr->{class} eq 'searchTitle');
+ }
+ }
+ else
+ {
+ if ($attr->{class} eq 'wydarzenie_tytul')
+ {
+ $self->{pre_itemTitle} = 1;
+ }
+ elsif ($self->{pre_itemTitle})
+ {
+ if ($tagname eq 'h1')
+ {
+ $self->{itemTitle} = 1;
+ }
+ elsif ($tagname eq 'h2')
+ {
+ $self->{itemOriginalTitle} = 1;
+ }
+ elsif ($tagname eq 'table')
+ {
+ $self->{pre_itemTitle} = 0;
+ }
+ }
+ elsif ($attr->{class} eq 'film_pozycja')
+ {
+ $self->{pre_itemDetails} = 1;
+ }
+ elsif ($attr->{class} eq 'main_sub_table film')
+ {
+ $self->{itemMain} = 1;
+ }
+ elsif ($tagname eq 'img' && $self->{itemMain})
+ {
+ $self->{curInfo}->{image} = $attr->{src};
+ }
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{listTitle})
+ {
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $origtext;
+ $self->{listTitle} = 0;
+ }
+ elsif ($self->{listYear})
+ {
+ $origtext =~ s/\((.*?)\)/$1/gms;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $origtext;
+ $self->{listYear} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{itemTitle})
+ {
+ $self->{curInfo}->{title} = $origtext;
+ $self->{itemTitle} = 0;
+ }
+ elsif ($self->{itemOriginalTitle})
+ {
+ $origtext =~ s/\s*\((.*?)\)/$1/gms;
+ $self->{curInfo}->{original} = $origtext;
+ $self->{itemOriginalTitle} = 0;
+ }
+ elsif ($self->{itemDirector})
+ {
+ $self->{curInfo}->{director} = $origtext;
+ $self->{itemDirector} = 0;
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{itemDetails})
+ {
+ (
+ $self->{curInfo}->{genre}, $self->{curInfo}->{country},
+ $self->{curInfo}->{date}, $self->{curInfo}->{time}
+ ) = split(/, /, $origtext);
+ $self->{curInfo}->{time} =~ s/ min//;
+ $self->{itemDetails} = 0;
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{itemActors})
+ {
+ $self->{curInfo}->{actors} = $origtext;
+ $self->{itemActors} = 0;
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{itemMain})
+ {
+ $self->{curInfo}->{synopsis} = $origtext;
+ $self->{itemMain} = 0;
+ }
+ elsif ($self->{inside}->{item_rank})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext + 0.5);
+ $self->{pre_itemDetails} = 0;
+ }
+ elsif ($self->{pre_itemDetails})
+ {
+ $self->{itemDirector} = 1
+ if ($origtext eq 'reżyseria:');
+
+ $self->{itemDetails} = 1
+ if ($origtext eq 'szczegóły:');
+
+ $self->{itemActors} = 1
+ if ($origtext eq 'obsada:');
+ }
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ $self->{itemIdx} = 0;
+ $self->{itemsList}[0]->{title} = '';
+ $self->{itemsList}[0]->{url} = '';
+
+ # Do your init stuff here
+ bless($self, $class);
+ return $self;
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Your code to modify $html here.
+ if ($self->{parsingList})
+ {
+ $html =~
+ s|<!-- record_start -->(.*?)<!-- record_end -->|<list_details>$1</list_details>|gms;
+ }
+ else
+ {
+ $html =~ s|<nobr>(.*?)</nobr>|$1|gms;
+ $html =~ s|<span class="bold">(.*?)</span>|$1|gms;
+ $html =~ s|<a href="/filmowcy/osoba.*?">(.*?)</a>|$1|gms;
+ $html =~
+s|script type="text/javascript">document.write\(getOcena\((.*?)\)\);</script>|<item_rank>$1</item_rank>|gms;
+ }
+ return $html;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm
new file mode 100644
index 0000000..f7636cc
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedb.pm
@@ -0,0 +1,337 @@
+package GCPlugins::GCfilms::GCthemoviedb;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedb;
+
+ use base 'GCPlugins::GCfilms::GCfilmsPluginsBase';
+ use XML::Simple;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page !~ m/>Nothing found.<\/movie/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'movie', 'alternative_name' ],
+ KeyAttr => ['id']
+ );
+ my $movie;
+ foreach $movie (keys(%{$xml->{'movies'}->{'movie'}}))
+ {
+ # We only want movies, not series and everything else the api returns
+ if ($xml->{'movies'}->{'movie'}->{$movie}->{'type'} eq "movie")
+ {
+ $self->{itemIdx}++;
+ my $url =
+"http://api.themoviedb.org/2.1/Movie.getInfo/".$self->siteLanguage()."/xml/9fc8c3894a459cac8c75e3284b712dfc/"
+ . $movie;
+ # If the release date is missing, it will be returned as an array, so only save the release if
+ # it's not an array
+ my $released = "";
+ if (!ref($xml->{'movies'}->{'movie'}->{$movie}->{'released'}))
+ {
+ $released = $xml->{'movies'}->{'movie'}->{$movie}->{'released'};
+ }
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} =
+ $xml->{'movies'}->{'movie'}->{$movie}->{'name'};
+ # Now, check if there's any alternative names, and if so, add them in as
+ # additional search results.
+ for my $alternateName (
+ @{$xml->{'movies'}->{'movie'}->{$movie}->{alternative_name}})
+ {
+ if (!ref($alternateName))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{date} = $released;
+ $self->{itemsList}[ $self->{itemIdx} ]->{url} = $url;
+ $self->{itemsList}[ $self->{itemIdx} ]->{title} = $alternateName;
+ }
+ }
+
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ ForceArray => [ 'country', 'person', 'category', 'size', 'alternative_name' ],
+ KeyAttr => ['']
+ );
+ my $usingAlternateName = 0;
+ if (
+ (
+ $xml->{movies}->{movie}->{name} ne
+ $self->{itemsList}[ $self->{wantedIdx} ]->{title}
+ )
+ && ($self->{itemsList}[ $self->{wantedIdx} ]->{title})
+ )
+ {
+ # Name returned by tmdb is different to the one the user selected
+ # this means they choose an translated name, so use the name they choose
+ # as the default, and put tmdb's name in as the original (untranslated) name of the movie
+ $self->{curInfo}->{title} = $self->{itemsList}[ $self->{wantedIdx} ]->{title};
+ $self->{curInfo}->{original} = $xml->{movies}->{movie}->{name};
+ }
+ else
+ {
+ $self->{curInfo}->{title} = $xml->{movies}->{movie}->{name};
+ }
+ # Now, add any alternate names
+ for my $alternateName (@{$xml->{movies}->{movie}->{alternative_name}})
+ {
+ if ((!ref($alternateName)) && ($alternateName ne $self->{curInfo}->{title}))
+ {
+ $self->{curInfo}->{original} .= ", "
+ if $self->{curInfo}->{original};
+ $self->{curInfo}->{original} .= $alternateName;
+ }
+ }
+
+ $self->{curInfo}->{webPage} = $xml->{movies}->{movie}->{url};
+
+ # The following fields could be missing from the xml, so we need to check if they're blank
+ # (in which case they'll be a array)
+ $self->{curInfo}->{synopsis} = $xml->{movies}->{movie}->{overview}
+ if (!ref($xml->{movies}->{movie}->{overview}));
+ $self->{curInfo}->{ratingpress} = $xml->{movies}->{movie}->{rating}
+ if (!ref($xml->{movies}->{movie}->{rating}));
+ $self->{curInfo}->{date} = $xml->{movies}->{movie}->{released}
+ if (!ref($xml->{movies}->{movie}->{released}));
+ $self->{curInfo}->{time} = $xml->{movies}->{movie}->{runtime} . " mins"
+ if (!ref($xml->{movies}->{movie}->{runtime}));
+
+ if (!ref($xml->{movies}->{movie}->{certification}))
+ {
+ my $certification;
+ $certification = $xml->{movies}->{movie}->{certification};
+ $self->{curInfo}->{age} = 1
+ if ($certification eq 'Unrated') || ($certification eq 'Open');
+ $self->{curInfo}->{age} = 2
+ if ($certification eq 'G') || ($certification eq 'Approved');
+ $self->{curInfo}->{age} = 5
+ if ($certification eq 'PG')
+ || ($certification eq 'M')
+ || ($certification eq 'GP');
+ $self->{curInfo}->{age} = 13 if $certification eq 'PG-13';
+ $self->{curInfo}->{age} = 17 if $certification eq 'R';
+ $self->{curInfo}->{age} = 18
+ if ($certification eq 'NC-17') || ($certification eq 'X');
+ }
+
+ for my $country (@{$xml->{movies}->{movie}->{countries}->{country}})
+ {
+ push @{$self->{curInfo}->{country}}, $country->{name};
+ }
+ $self->{curInfo}->{country} =~ s/, $//;
+ for my $person (@{$xml->{movies}->{movie}->{cast}->{person}})
+ {
+ my $name = $person->{name};
+ # Strip any blank spaces from start and end of name
+ $name =~ s/\s*$//;
+ $name =~ s/^\s*//;
+ if ($person->{job} eq "Director")
+ {
+ $self->{curInfo}->{director} .= $name . ', ';
+ }
+ elsif ($person->{job} eq "Actor")
+ {
+ if ($self->{actorsCounter} < $GCPlugins::GCfilms::GCfilmsCommon::MAX_ACTORS)
+ {
+ push @{$self->{curInfo}->{actors}}, [$name];
+ my $role = $person->{character};
+ $role =~ s/\s*$//;
+ $role =~ s/^\s*//;
+ push @{$self->{curInfo}->{actors}->[ $self->{actorsCounter} ]}, $role;
+ $self->{actorsCounter}++;
+ }
+ }
+ }
+ $self->{curInfo}->{director} =~ s/, $//;
+ for my $category (@{$xml->{movies}->{movie}->{categories}->{category}})
+ {
+ push @{$self->{curInfo}->{genre}}, [ $category->{name} ]
+ if ($category->{type} eq 'genre');
+ }
+ for my $image (@{$xml->{movies}->{movie}->{images}->{image}})
+ {
+ if ($image->{type} eq "poster")
+ {
+ # Fetch either the big original pic, or just the small thumbnail pic
+ if ( (($self->{bigPics}) && ($image->{size} eq "original"))
+ || (!($self->{bigPics}) && ($image->{size} eq "thumb")))
+ {
+ if (!$self->{curInfo}->{image})
+ {
+ $self->{curInfo}->{image} = $image->{url};
+ }
+ }
+ }
+ }
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ date => 1,
+ director => 0,
+ actors => 0,
+ };
+
+ return $self;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.themoviedb.org";
+ }
+ elsif (index($url, "api") < 0)
+ {
+ # Url isn't for the movie db api, so we need to find the movie id
+ # and return a url corresponding to the api page for this movie
+ my $found = index(reverse($url), "/");
+ if ($found >= 0)
+ {
+ my $id = substr(reverse($url), 0, $found);
+ $url =
+"http://api.themoviedb.org/2.1/Movie.getInfo/".$self->siteLanguage()."/xml/9fc8c3894a459cac8c75e3284b712dfc/"
+ . reverse($id);
+ }
+ }
+ return $url;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return
+"http://api.themoviedb.org/2.1/Movie.search/".$self->siteLanguage()."/xml/9fc8c3894a459cac8c75e3284b712dfc/$word";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'en';
+ }
+
+ sub getName
+ {
+ return "The Movie DB";
+ }
+
+ sub getAuthor
+ {
+ return 'Zombiepig';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm
new file mode 100644
index 0000000..bc55111
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbDE.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCfilms::GCthemoviedbDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCThemoviedb;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedbDE;
+
+ use base qw(GCPlugins::GCfilms::GCPluginThemoviedb);
+ use XML::Simple;
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'de';
+ }
+
+ sub getName
+ {
+ return "The Movie DB (DE)";
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm
new file mode 100644
index 0000000..77dc03a
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbES.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCfilms::GCthemoviedbES;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCThemoviedb;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedbES;
+
+ use base qw(GCPlugins::GCfilms::GCPluginThemoviedb);
+ use XML::Simple;
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'es';
+ }
+
+ sub getName
+ {
+ return "The Movie DB (ES)";
+ }
+
+ sub getLang
+ {
+ return 'ES';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm
new file mode 100644
index 0000000..624b64f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCThemoviedbFR.pm
@@ -0,0 +1,56 @@
+package GCPlugins::GCfilms::GCthemoviedbFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCfilms::GCThemoviedb;
+
+{
+
+ package GCPlugins::GCfilms::GCPluginThemoviedbFR;
+
+ use base qw(GCPlugins::GCfilms::GCPluginThemoviedb);
+ use XML::Simple;
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'fr';
+ }
+
+ sub getName
+ {
+ return "The Movie DB (FR)";
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm b/lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm
new file mode 100644
index 0000000..a7178fa
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCfilmsAmazonCommon.pm
@@ -0,0 +1,59 @@
+package GCPlugins::GCfilms::GCfilmsAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCfilms::GCfilmsCommon;
+use GCPlugins::GCstar::GCAmazonCommon;
+
+{
+ package GCPlugins::GCfilms::GCfilmsAmazonPluginsBase;
+
+ use base ('GCPlugins::GCfilms::GCfilmsPluginsBase', 'GCPlugins::GCstar::GCPluginAmazonCommon');
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{codeField} = '';
+ $self->{searchType} = 'dvd';
+
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub getEanField
+ {
+ return 'title';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm b/lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm
new file mode 100644
index 0000000..d67952f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCfilms/GCfilmsCommon.pm
@@ -0,0 +1,70 @@
+package GCPlugins::GCfilms::GCfilmsCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 30;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+
+ package GCPlugins::GCfilms::GCfilmsPluginsBase;
+
+ use base qw(GCPluginParser);
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->{actorsCounter} = 0;
+ $self->{directorCounter} = 0;
+ $self->SUPER::loadUrl($url);
+
+ if (!$self->{curInfo}->{title} && $self->{curInfo}->{original})
+ {
+ $self->{curInfo}->{title} = $self->{curInfo}->{original};
+ $self->{curInfo}->{original} = '';
+ }
+ return $self->{curInfo};
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAlapage.pm b/lib/gcstar/GCPlugins/GCgames/GCAlapage.pm
new file mode 100644
index 0000000..0d21a94
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAlapage.pm
@@ -0,0 +1,262 @@
+package GCPlugins::GCgames::GCAlapage;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAlapage;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && ($attr->{class} eq 'infosProduit'))
+ {
+ $self->{itemIdx}++;
+ $self->{isGame} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame}))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $attr->{title};
+ $self->{isGame} = 0 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'liensAriane') && ($self->{isGame}) && ($self->{itemsList}[$self->{itemIdx}]->{platform} eq ''))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if (($tagname eq 'h1') && ($attr->{id} eq 'zm_name_description'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'zm_description_long'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{rel} eq 'images nocount') && ($self->{bigPics}))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{href_img} ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'zm_main_image') && !($self->{bigPics}))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src} ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isPlatform})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ $origtext =~ s/Sony //i;
+ $origtext =~ s/Jeux PC/PC/i;
+
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ $self->{Save_plateforme} = $self->{itemsList}[$self->{itemIdx}]->{platform};
+ $self->{isPlatform} = 0;
+
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{platform} = $self->{Save_plateforme};
+ $self->{isName} = 0 ;
+
+ if ($self->{ean} ne '')
+ {
+ $self->{curInfo}->{ean} = $self->{ean};
+ }
+
+ }
+ elsif ($self->{isDescription} eq 1)
+ {
+ # Enleve les blancs dans le texte
+ $origtext =~ s/ / /g;
+ $self->{curInfo}->{description} = $origtext;
+ $self->{isDescription} = 0 ;
+ }
+
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 0,
+ genre => 0
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0;
+ $self->{Save_plateforme} = '';
+ $self->{isDescription} = 0;
+ $self->{ean} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<br>||gi;
+ $html =~ s|<br />||gi;
+
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'ean')
+ {
+ $self->{ean} = $word;
+ }
+ else
+ {
+ $self->{ean} = '';
+ }
+
+ return 'http://search.alapage.com/search?a=8584451-0-0&s='.$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'Alapage';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ean', 'name'];
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazon.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazon.pm
new file mode 100644
index 0000000..36b7890
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazon.pm
@@ -0,0 +1,115 @@
+package GCPlugins::GCgames::GCAmazon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazon;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'com';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Product Description</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Release Date&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Release Date:</<tpfdateparution></gi;
+ $html =~ s/<b>Platform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Platform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|\n*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (US)';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm
new file mode 100644
index 0000000..a54c4ef
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonCA.pm
@@ -0,0 +1,115 @@
+package GCPlugins::GCgames::GCAmazonCA;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonCA;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'ca';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Product Description</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Release Date&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Release Date:</<tpfdateparution></gi;
+ $html =~ s/<b>Platform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Platform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|\n*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (CA)';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm
new file mode 100644
index 0000000..1dbc106
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonDE.pm
@@ -0,0 +1,114 @@
+package GCPlugins::GCgames::GCAmazonDE;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonDE;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'de';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Produktbeschreibungen</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Erscheinungsdatum&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Erscheinungsdatum:</<tpfdateparution></gi;
+ $html =~ s/<b>Plattform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Plattform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (DE)';
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm
new file mode 100644
index 0000000..1bceb23
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonFR.pm
@@ -0,0 +1,118 @@
+package GCPlugins::GCgames::GCAmazonFR;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonFR;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'fr';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Description du produit</><tpfdescription><\/tpfdescription></;
+ $html =~ s/>Descriptions du produit</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Date de parution&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Date de parution:</<tpfdateparution></gi;
+ $html =~ s/<b>Plate-forme:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Plate-forme:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ # Bug sur Shadow of Memories pour PS2
+ $html =~ s|Actio\)n|Action|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (FR)';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm
new file mode 100644
index 0000000..80824ec
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonJP.pm
@@ -0,0 +1,120 @@
+package GCPlugins::GCgames::GCAmazonJP;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonJP;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'co.jp';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>商å“ã®èª¬æ˜Ž</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/発売日&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/発売日:</<tpfdateparution></gi;
+ $html =~ s/<b>プラットフォーム:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>プラットフォーム:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (JP)';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "SHIFT_JIS";
+ }
+
+ sub getLang
+ {
+ return 'JP';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm b/lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm
new file mode 100644
index 0000000..5108e8c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCAmazonUK.pm
@@ -0,0 +1,115 @@
+package GCPlugins::GCgames::GCAmazonUK;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginAmazonUK;
+
+ use base 'GCPlugins::GCgames::GCgamesAmazonPluginsBase';
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{suffix} = 'co.uk';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s/>Product Description</><tpfdescription><\/tpfdescription></;
+ $html =~ s/>Reviews</><tpfdescription><\/tpfdescription></;
+ # Le descriptif pouvant contenir des balises html je le repere maintenant
+ my $found = index($html,"<tpfdescription>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found,length($html)- $found);
+
+ $html2 =~ s|</li>||gi;
+ $html2 =~ s|<p>|\n\n|gi;
+ $html2 =~ s|</p>||gi;
+ $html2 =~ s|<ul>|\n|gi;
+ $html2 =~ s|</ul>|\n\n|gi;
+ $html2 =~ s|<strong>||gi;
+ $html2 =~ s|</strong>||gi;
+ $html2 =~ s|<em>||gi;
+ $html2 =~ s|</em>||gi;
+
+ $html = substr($html, 0, $found) . $html2 ;
+ }
+
+ $html =~ s/Release Date&nbsp;:</<tpfdateparution></gi;
+ $html =~ s/Release Date:</<tpfdateparution></gi;
+ $html =~ s/<b>Platform:<\/b> &nbsp;</<tpfplateforme><\/tpfplateforme></gi;
+ $html =~ s/<b>Platform:<\/b>/<tpfplateforme><\/tpfplateforme>/gi;
+ $html =~ s/registerImage\("original_image",/<\/script><tpfcouverture src=/gi;
+ $html =~ s/registerImage\("alt_image_1",/<\/script><tpfscreenshot1 src=/gi;
+ $html =~ s/registerImage\("alt_image_2",/<\/script><tpfscreenshot2 src=/gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<li>|*|gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+
+ }
+ return $html;
+ }
+
+ sub getName
+ {
+ return 'Amazon (UK)';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm b/lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm
new file mode 100644
index 0000000..fd130cf
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCDicoDuNet.pm
@@ -0,0 +1,291 @@
+package GCPlugins::GCgames::GCDicoDuNet;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginDicoDuNet;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && ($attr->{class} eq 'cat_produit'))
+ {
+ $self->{isGame} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isUrl}) && ($self->{isGame}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ elsif (($tagname eq 'strong') && ($self->{isGame}))
+ {
+ $self->{isName} = 1 ;
+ $self->{isGame} = 0 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if (($tagname eq 'h3') && ($attr->{class} eq 'produits'))
+ {
+ $self->{isGame} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($self->{isGame} eq 1) )
+ {
+ $self->{isName} = 1 ;
+ $self->{isGame} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame} eq 2))
+ {
+ $self->{isEditor} = 1 ;
+ $self->{isGame} = 0 ;
+ }
+ elsif ($tagname eq 'table')
+ {
+ $self->{isGame} = 0 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{id} eq 'vous_etes_ici'))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} ne 'http://www.dicodunet.com/jeux-video/') && ($self->{isPlatform}))
+ {
+ $self->{isPlatform} = 2 ;
+ }
+ elsif (($tagname eq 'a') && (index($attr->{href},"www.dicodunet.com/jeux-video/img/") >= 0) && ($self->{curInfo}->{boxpic} eq ''))
+ {
+ my $html = $self->loadPage($attr->{href}, 0, 1);
+ my $found = index($html,"<h3 class=\"produits\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<h3 class="produits">'),length($html)- $found -length('<h3 class="produits">'));
+
+ my $found = index($html,"<img src=\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<img src="'),length($html)- $found -length('<img src="'));
+ $html = substr($html, 0,index($html,"\""));
+
+ $self->{curInfo}->{boxpic} = $html;
+ }
+ }
+
+ }
+ elsif ($tagname eq 'tpfdateparution')
+ {
+ $self->{isDate} = 1 ;
+ }
+ elsif ($tagname eq 'tpfean')
+ {
+ $self->{isEan} = 1 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{isName} = 0 ;
+ }
+ elsif ($self->{isEditor})
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ $origtext =~ s/PlayStation 2/Playstation 2/i;
+ $origtext =~ s/Jeux PC/PC/i;
+ $origtext =~ s/Jeux Mac/MAC/i;
+
+ if (($self->{curInfo}->{platform} eq '') && ($origtext ne ''))
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{curInfo}->{platform} .= ', ';
+ $self->{curInfo}->{platform} .= $origtext;
+ }
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{curInfo}->{released} =~ s|([0-9]*)-([0-9]*)-([0-9]*)|$3.'/'.$2.'/'.$1|e;
+ $self->{isDate} = 0 ;
+ }
+ elsif ($self->{isEan})
+ {
+ $self->{curInfo}->{ean} = $origtext;
+ $self->{isEan} = 0 ;
+ }
+
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 0,
+ genre => 0,
+ released => 0
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isUrl} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDate} = 0;
+ $self->{isEan} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ my $found = index($html,"class=\"produits_box\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ $html =~ s/Version sortie le /<tpfdateparution>/gi;
+ $html =~ s/Code EAN : /<tpfean>/gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return ('http://www.dicodunet.com/jeux-video/recherche.php', ["q" => "$word"] );
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.dicodunet.com/';
+ }
+
+ sub getName
+ {
+ return 'DicoDuNet';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ #return "UTF-8";
+ return "ISO-8859-15";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+}
+
+1;
+
diff --git a/lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm b/lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm
new file mode 100644
index 0000000..c5870b4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCGameSpot.pm
@@ -0,0 +1,490 @@
+package GCPlugins::GCgames::GCGameSpot;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginGameSpot;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+ use Text::Wrap;
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'div')
+ {
+ $self->{isGame} = 1
+ if $attr->{class} =~ /result_title/;
+ }
+ elsif ($tagname eq 'tpfdatetpf')
+ {
+ $self->{isDate} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isName} = 1;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if (($tagname eq 'h2') && ($attr->{class} eq 'module_title'))
+ {
+ $self->{isSection} = 1;
+ }
+ elsif (($tagname eq 'th') && ($attr->{scope} eq 'row') && ($attr->{class} eq 'code') && ($self->{section} ne ''))
+ {
+ $self->{isCheat} = 1;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'effect') && ($self->{section} ne ''))
+ {
+ $self->{isDesc} = 1;
+ }
+ elsif (($tagname eq 'h3') && ($attr->{class} eq 'cheatCodeTitle') && ($self->{section} eq 'Secrets'))
+ {
+ $self->{curInfo}->{secrets} .= "\n" if $self->{curInfo}->{secrets};
+ }
+ elsif ($tagname eq 'tpfdebuttpf')
+ {
+ $self->{section} = 'Secrets';
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'head'))
+ {
+ $self->{section} = '';
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{urlTips} = '';
+ }
+ }
+ else
+ {
+ if ($tagname eq 'img')
+ {
+ $self->{curInfo}->{boxpic} = ' '
+ if $attr->{src} =~ /no_preview/;
+ if ((! $self->{curInfo}->{boxpic}) && ($attr->{src} =~ /[^xo]boxs[^c]/))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ }
+ if ($attr->{src} =~ /thumb/)
+ {
+ my $pic = $attr->{src};
+ $pic =~ s/thumb00([0-9])/screen00$1/;
+ if ($1 && ($1 <= 2))
+ {
+ $self->{curInfo}->{'screenshot'.$1} = $pic
+ if ! $self->{curInfo}->{'screenshot'.$1};
+ }
+ }
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'boxshot'))
+ {
+ $self->{isBox} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isBox} eq 1))
+ {
+ my $html = $self->loadPage($self->getItemUrl($attr->{href}), 0, 1);
+ my $found = index($html,"id=\"main_image\" src=\"");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('id="main_image" src="'),length($html)- $found -length('id="main_image" src="'));
+
+ my @array = split(/"/,$html);
+ #"
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{boxpic} = $array[0];
+ }
+ $self->{curInfo}->{backpic} = $array[0];
+ $self->{curInfo}->{backpic} =~ s/_front/_back/;
+ }
+ $self->{isBox} = 0;
+ }
+ elsif (($tagname eq 'h1') && ($attr->{class} eq 'productPageTitle'))
+ {
+ $self->{isName} = 1 if ! $self->{curInfo}->{name};
+ }
+ elsif (($tagname eq 'meta') && ($attr->{name} eq 'description'))
+ {
+ $self->{curInfo}->{description} = $attr->{content};
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} =~ /activeFilter/))
+ {
+ $self->{curInfo}->{exclusive} = 0;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'reviewer'))
+ {
+ $self->{isRating} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isRating} eq 1))
+ {
+ $self->{isRating} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'moreStat play_info number_of_players'))
+ {
+ $self->{isPlayers} = 1;
+ }
+ elsif (($tagname eq 'p') && ($self->{isPlayers} eq 1))
+ {
+ $self->{isPlayers} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'publisher'))
+ {
+ $self->{isEditor} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isEditor} eq 1))
+ {
+ $self->{isEditor} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'developer'))
+ {
+ $self->{isDeveloper} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isDeveloper} eq 1))
+ {
+ $self->{isDeveloper} = 2;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'genre'))
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGenre}))
+ {
+ $self->{curInfo}->{genre} = $attr->{title};
+ $self->{isGenre} = 0;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'date'))
+ {
+ $self->{isReleased} = 1;
+ }
+ elsif (($tagname eq 'a') && ($self->{isReleased} eq 1))
+ {
+ $self->{isReleased} = 2;
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ /\/cheats\//) && ($attr->{class} eq 'navItemAction'))
+ {
+ $self->{urlTips} = $attr->{href};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ $self->{isGame} = 0
+ if ($tagname eq 'div');
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ $origtext =~ /^(.*?)\s*\((.*?)\)\s*$/;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $1;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $2;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{itemsList}[$self->{itemIdx}]->{url} . 'tpfplatformtpf' . $self->{itemsList}[$self->{itemIdx}]->{platform};
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $origtext =~ /^\s*Release Date:\s*(.*?)\s*$/ms;
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $1;
+ $self->{isDate} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if (($self->{isSection} eq 1) && $self->{inside}->{h2})
+ {
+ $self->{section} = 'Codes' if $origtext =~ /Cheat Codes$/;
+ $self->{section} = 'Unlockables' if $origtext =~ /Unlockables$/;
+ $self->{section} = 'Secrets' if $origtext =~ /Secrets$/;
+ $self->{section} = 'Secrets' if $origtext =~ /Easter Eggs$/;
+ $self->{isSection} = 0;
+ }
+ elsif (($self->{section} eq 'Codes') || ($self->{section} eq 'Unlockables'))
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ $Text::Wrap::columns = 80;
+ $origtext = Text::Wrap::wrap('', '', $origtext);
+
+ if ($self->{isCheat})
+ {
+ if ($self->{section} eq 'Codes')
+ {
+ $self->{tmpCheatLine} = [];
+ push @{$self->{tmpCheatLine}}, $origtext;
+ }
+ else
+ {
+ $self->{tmpCheatLine} = [];
+ ${$self->{tmpCheatLine}}[1] = $origtext;
+ }
+ $self->{isCheat} = 0;
+ }
+ elsif ($self->{isDesc})
+ {
+ if ($self->{section} eq 'Codes')
+ {
+ push @{$self->{tmpCheatLine}}, $origtext;
+ push @{$self->{curInfo}->{code}}, $self->{tmpCheatLine};
+ $self->{tmpCheatLine} = [];
+ }
+ else
+ {
+ ${$self->{tmpCheatLine}}[0] = $origtext;
+ push @{$self->{curInfo}->{unlockable}}, $self->{tmpCheatLine};
+ $self->{tmpCheatLine} = [];
+ }
+ $self->{isDesc} = 0;
+ }
+ }
+ elsif ($self->{section} eq 'Secrets')
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ return if !$origtext;
+ $self->{curInfo}->{secrets} .= "\n" if $self->{curInfo}->{secrets};
+ $self->{curInfo}->{secrets} .= $origtext;
+ }
+ }
+ else
+ {
+ if ($self->{isName})
+ {
+ $origtext =~ s/\n//g;
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{platform} = $self->{url_plateforme};
+ $self->{curInfo}->{exclusive} = 1;
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isRating} eq 2)
+ {
+ $self->{curInfo}->{ratingpress} = $origtext;
+ $self->{isRating} = 0;
+ }
+ else
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\s*$//;
+ return if !$origtext;
+ if ($self->{isReleased} eq 2)
+ {
+ $origtext =~ s/ .$//;
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isReleased} = 0;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0;
+ }
+ elsif ($self->{isPlayers} eq 2)
+ {
+ $origtext =~ s/(Players?)?\s*\(.*?$//;
+ $self->{curInfo}->{players} = $origtext;
+ $self->{isPlayers} = 0;
+ }
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+ return 'http://www.gamespot.com' .$self->{urlTips};
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 1,
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isDate} = 0;
+ $self->{isCheat} = 0;
+ $self->{isDesc} = 0;
+ $self->{isTip} = 0;
+ $self->{isRating} = 0;
+ $self->{section} = '';
+ $self->{isSection} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isGenre} = 0;
+ $self->{isEditor} = 0;
+ $self->{isReleased} = 0;
+ $self->{isPlayers} = 0;
+ $self->{isBox} = 0;
+ $self->{isExclu} = 0;
+ $self->{url_plateforme} = '';
+ $self->{urlTips} = "";
+ $self->{SaveUrl} = "";
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingTips})
+ {
+ $html =~ s|<b>(.*?)</b>|$1|g;
+ $html =~ s|<i>(.*?)</i>|$1|g;
+## It takes too much time
+# $html =~ s|<li class="guideAct"><a href="(.+)">Go to Online Walkthrough|'<tpfdebuttpf>' . $self->RecupSolution($1) . '<tpffintpf>'|ge;
+ }
+ elsif ($self->{parsingList})
+ {
+ $html =~ s|Release Date|<tpfdatetpf>Release Date|g;
+ }
+ else
+ {
+ my $found = index($html,"Similar Games");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+ }
+
+ return $html;
+ }
+
+ sub RecupSolution
+ {
+ my ($self, $url) = @_;
+
+ my $html = $self->loadPage($url);
+
+ my $found = index($html,"<h2>");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found,length($html)- $found);
+ }
+ else
+ {
+ $found = index($html,"<span class=\"author\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found,length($html)- $found);
+ }
+ }
+
+ $html = substr($html, 0, index($html, " rel=\"next\">"));
+
+ $html =~ s|<a class="next" href="/gameguides.html"||ge;
+ $html =~ s|<a class="next" href="(.+)"|$self->RecupSolution('http://www.gamespot.com'.$1)|ge;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ #return 'http://www.gamespot.com/search.html?qs='.$word.'&sub=g&stype=11&type=11';
+ return 'http://www.gamespot.com/pages/search/solr_search_ajax.php?q='.$word.'&type=game&offset=0&tags_only=false&sort=false';
+ #return 'http://www.gamespot.com/search.html?qs=' .$word. '&tag=masthead%3Bsearch';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ my $found = index($url,"tpfplatformtpf");
+ if ( $found >= 0 )
+ {
+ $self->{url_plateforme} = substr($url, $found +length('tpfplatformtpf'),length($url)- $found -length('tpfplatformtpf'));
+ $url = substr($url, 0,$found);
+ }
+
+ return 'http://www.gamespot.com' . $url
+ if $url !~ /gamespot\.com/;
+ return $url if $url;
+ return 'http://www.gamespot.com';
+ }
+
+ sub getName
+ {
+ return 'GameSpot';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+ sub isPreferred
+ {
+ return 1;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm
new file mode 100644
index 0000000..560a582
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoCom.pm
@@ -0,0 +1,447 @@
+package GCPlugins::GCgames::GCJeuxVideoCom;
+
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginJeuxVideoCom;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+ return if $self->{parsingEnded};
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'div') && (($attr->{id} eq 'new_mc') || ($attr->{id} eq 'old_mc')))
+ {
+ $self->{inResults} = 1;
+ }
+ elsif ($self->{inResults})
+ {
+ if ($tagname eq 'img')
+ {
+ $self->{currentPlatform} = $attr->{alt};
+ }
+ elsif (($tagname eq 'a') && ($attr->{href} =~ /^http/))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $self->{currentPlatform};
+ $self->{isGame} = 1;
+ }
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if ($tagname eq 'tpfdebuttpf')
+ {
+ $self->{isTip} = 1;
+ }
+ elsif ( ($tagname eq 'h3') && ($attr->{class} eq 'titre_bloc') && ($self->{isTip} ne 4))
+ {
+ $self->{isTip} = 2;
+ }
+ elsif ( (($tagname eq 'h3') || ($tagname eq 'h4') || ($tagname eq 'h5') ) && ($self->{isTip} ne 3) && ($self->{isTip} ne 4))
+ {
+ $self->{isTip} = 2;
+ }
+ elsif ( ($tagname eq 'p') && ($self->{isTip} ne 3) && ($self->{isTip} ne 4))
+ {
+ $self->{isTip} = 1;
+ }
+ elsif ($tagname eq 'tpfstopsolution')
+ {
+ $self->{isTip} = 4;
+ }
+ elsif ($tagname eq 'tpffintpf')
+ {
+ $self->{isTip} = 3;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isTip} = 0;
+ $self->{urlTips} = '';
+ }
+
+ }
+ else
+ {
+ if (($tagname eq 'meta') && ($attr->{property} eq 'og:image'))
+ {
+ my $cover = $attr->{content};
+ $cover =~ s|(http://[^/]*)/([^i])|$1/images/$2|;
+ if ($self->{bigPics})
+ {
+ $cover =~ s/-p(-|\.)/-g$1/;
+ $cover =~ s/t(\.jpg)/$1/;
+ }
+ my $back = $cover;
+ if (!($back =~ s/-avant(-|\.)/-arriere$1/))
+ {
+ $back =~ s/f(t?\.jpg)/r$1/;
+ }
+ $self->{curInfo}->{boxpic} = $cover;
+ $self->{curInfo}->{backpic} = $back;
+ }
+ elsif (($tagname eq 'li') && ($attr->{class} eq 'note_redac'))
+ {
+ $self->{is} = 'ratingpress';
+ }
+ elsif ( ($tagname eq 'div') && ($attr->{class} eq 'series_images') )
+ {
+ $self->{inScreenshots} = 1;
+ }
+ elsif ( ($tagname eq 'img') && ($self->{inScreenshots}) )
+ {
+ if (! $self->{curInfo}->{screenshot1})
+ {
+ $self->{curInfo}->{screenshot1} = $attr->{src};
+ $self->{curInfo}->{screenshot1} =~ s/.gif/.jpg/;
+ $self->{curInfo}->{screenshot1} =~ s/_m\.jpg/\.jpg/;
+ }
+ elsif (! $self->{curInfo}->{screenshot2})
+ {
+ $self->{curInfo}->{screenshot2} = $attr->{src};
+ $self->{curInfo}->{screenshot2} =~ s/.gif/.jpg/;
+ $self->{curInfo}->{screenshot2} =~ s/_m\.jpg/\.jpg/;
+ $self->{isScreen} = 0;
+ }
+ }
+ elsif (($attr->{href} =~ m^/(etajvhtm|cheats)/^) && ! ($self->{urlTips}))
+ {
+ $self->{urlTips} = $attr->{href};
+ }
+ elsif (($attr->{href} =~ m/test.htm/) && ! ($self->{curInfo}->{players}))
+ {
+ my $html = $self->loadPage($attr->{href});
+
+ my $found = index($html,"<li><strong>Multijoueurs :</strong>");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<li><strong>Multijoueurs :</strong>'),length($html)- $found -length('<li><strong>Multijoueurs :</strong>'));
+ $self->{curInfo}->{players} = substr($html, 0, index($html, "<"));
+
+ # Enleve les blancs en debut de chaine
+ $self->{curInfo}->{players} =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{players} =~ s/\s+$//;
+
+ $self->{curInfo}->{players} =~ s/-/1/;
+ $self->{curInfo}->{players} =~ s/non/1/i;
+ $self->{curInfo}->{players} =~ s/oui/Multijoueurs/i;
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ return if $self->{parsingEnded};
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'div')
+ {
+ $self->{inResults} = 0;
+ }
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ return if $self->{parsingEnded};
+ if ($self->{parsingList})
+ {
+ if ($self->{isGame})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isGame} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isTip} eq 2)
+ {
+ $self->{curInfo}->{secrets} .= "\n\n" if $self->{curInfo}->{secrets};
+ $self->{curInfo}->{secrets} .= $origtext;
+ $self->{isTip} = 0;
+ }
+ elsif ($self->{isTip} eq 1)
+ {
+ chomp($origtext);
+ if ( ($self->{curInfo}->{secrets}) && ($origtext ne "") )
+ {
+ $self->{curInfo}->{secrets} .= "\n"
+ }
+ $self->{curInfo}->{secrets} .= $origtext;
+ $self->{isTip} = 0;
+ }
+ }
+ else
+ {
+ if ($self->{inside}->{h1})
+ {
+ if ($self->{inside}->{a})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{exclusive} = 1;
+ }
+ elsif ($self->{inside}->{span})
+ {
+ if ($origtext !~ /^Fiche /)
+ {
+ $origtext =~ s/^\s*-?\s*//;
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ }
+ }
+ elsif ($self->{inside}->{strong})
+ {
+ $self->{is} = 'released' if ($origtext =~ /Sortie :/) || ($origtext =~ /Sortie France :/);
+ $self->{is} = 'genre' if $origtext =~ /Type :/;
+ $self->{is} = 'description' if $origtext =~ /Descriptif :/;
+ $self->{is} = 'editor' if $origtext =~ /Editeur :/;
+ $self->{is} = 'developer' if $origtext =~ /D.*?veloppeur :/;
+ $self->{is} = 'players' if $origtext =~ /Multijoueurs :/;
+ $self->{curInfo}->{exclusive} = 0 if $origtext =~ /Existe aussi sur :/;
+ }
+ elsif ($self->{is})
+ {
+ $origtext =~ s/^\s*//;
+ $origtext =~ s/\n$//;
+ if ($origtext)
+ {
+ if ($self->{is} eq 'players')
+ {
+ $origtext =~ s/-/1/;
+ $origtext =~ s/non/1/i;
+ $origtext =~ s/oui/Multijoueurs/i;
+ }
+ if ($self->{is} eq 'ratingpress')
+ {
+ $origtext =~ m|(\d*)/20|;
+ $origtext = int($1 / 2);
+ }
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ $self->{is} = '';
+ }
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+ return $self->{urlTips};
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1
+ };
+
+ $self->{isTip} = 0;
+ $self->{urlTips} = "";
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ if ($self->{parsingList})
+ {
+ $self->{parsingEnded} = 0;
+ $self->{inResults} = 0;
+ $self->{isGame} = 0;
+ }
+ elsif ($self->{parsingTips})
+ {
+ $html =~ s|<h4 class="lien_base"><a href="(.+)">Les astuces d|$self->RecupTips($1)|ge;
+ $html =~ s|<h4 class="lien_base"><a href="(.+)">La solution d|$self->RecupSolution($1)|ge;
+ $html =~ s|<h5><a href="(.+)">||gi;
+ $html =~ s|<h3 class="titre_bloc"><span>Plus d'infos</span></h3>|<tpfstopsolution>|gi;
+ $html =~ s|<div id="boxes_v">|<tpffintpf>|gi;
+ $html =~ s|<p class="lien_base">|<tpffintpf>|gi;
+ $html =~ s|<div class="player_article">|<tpffintpf>|gi;
+ $html =~ s|</object>|<tpfdebuttpf>|gi;
+ $html =~ s|<p class="title_bar">|<tpffintpf>|gi;
+ $html =~ s|<div class="bloc3" id="astuces_ajout"><h3 class="titre_bloc">|<tpffintpf>|gi;
+ $html =~ s|<br />|<p>|gi;
+ $html =~ s|<kbd>|<p>|gi;
+ $html =~ s|</kbd>||gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<span>||gi;
+ $html =~ s|<img src="../pics/psx/cercle.gif"\s*(alt="CERCLE")?\s*/>|Cercle|gi;
+ $html =~ s|<img src="../pics/psx/croix.gif"\s*(alt="CROIX")?\s*/>|Croix|gi;
+ $html =~ s|<img src="../pics/psx/carre.gif"\s*(alt="CARRE")?\s*/>|Carr.|gi;
+ $html =~ s|<img src="../pics/psx/triangle.gif"\s*(alt="TRIANGLE")?\s*/>|Triangle|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/cercle.gif"\s*(alt="CERCLE")?\s*/>|Cercle|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/croix.gif"\s*(alt="CROIX")?\s*/>|Croix|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/carre.gif"\s*(alt="CARRE")?\s*/>|Carr.|gi;
+ $html =~ s|<img src="http://image.jeuxvideo.com/pics/btajv/psx/triangle.gif"\s*(alt="TRIANGLE")?\s*/>|Triangle|gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ else
+ {
+ $self->{is} = '';
+ $self->{inScreenshots} = 0;
+ }
+ return $html;
+ }
+
+ sub RecupTips
+ {
+ my ($self, $url) = @_;
+
+ my $html = $self->loadPage($url);
+ my $savenexturl = '';
+
+ my $found = index($html,"<p class=\"astuces_suiv\"> <a href=\"");
+ if ( $found >= 0 )
+ {
+ $savenexturl = substr($html, $found +length('<p class="astuces_suiv"> <a href="'),length($html)- $found -length('<p class="astuces_suiv"> <a href="'));
+ $savenexturl = substr($savenexturl, 0, index($savenexturl, "\""));
+ }
+
+ $found = index($html,"<div id=\"astuce_detail\" class=\"astuce\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<div id="astuce_detail" class="astuce">'),length($html)- $found -length('<div id="astuce_detail" class="astuce">'));
+ $html = substr($html, 0, index($html, "<div id=\"barre_outils_v2\">"));
+ if ( $savenexturl ne "" )
+ {
+ $html .= $self->RecupTips($savenexturl);
+ }
+ }
+ else
+ {
+ $html = '';
+ }
+ return "<tpfdebuttpf>" . $html . "<tpffintpf>";
+ }
+
+ sub RecupSolution
+ {
+ my ($self, $url) = @_;
+
+ my $html = $self->loadPage($url);
+ my $savenexturl = '';
+
+ my $found = index($html,"<p class=\"astuces_suiv\"><a href=\"");
+ if ( $found >= 0 )
+ {
+ $savenexturl = substr($html, $found +length('<p class="astuces_suiv"><a href="'),length($html)- $found -length('<p class="astuces_suiv"><a href="'));
+ $savenexturl = substr($savenexturl, 0, index($savenexturl, "\""));
+ }
+
+ $found = index($html,"<div id=\"astuce_detail\" class=\"soluce\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, $found +length('<div id="astuce_detail" class="soluce">'),length($html)- $found -length('<div id="astuce_detail" class="soluce">'));
+ $html = substr($html, 0, index($html, "<div id=\"barre_outils_v2\">"));
+ if ( $savenexturl ne "" )
+ {
+ $html .= $self->RecupSolution($savenexturl);
+ }
+ }
+ else
+ {
+ $html = '';
+ }
+ return "<tpfdebuttpf>" . $html . "<tpffintpf>";
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ $word =~ s/\+/ /g;
+ return 'http://www.jeuxvideo.com/recherche/jeux/'.$word.'.htm';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.jeuxvideo.com/';
+ }
+
+ sub getName
+ {
+ return 'jeuxvideo.com';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian & TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+ sub isPreferred
+ {
+ return 1;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm
new file mode 100644
index 0000000..bec266f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCJeuxVideoFr.pm
@@ -0,0 +1,425 @@
+package GCPlugins::GCgames::GCJeuxVideoFr;
+
+###################################################
+#
+# Copyright 2005-2011 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginJeuxVideoFr;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ($tagname eq 'div')
+ {
+ $self->{isGame} = 1
+ if $attr->{class} eq "jeuDesc";
+ }
+ if ($self->{isGame})
+ {
+ if ($tagname eq 'a')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $attr->{title};
+ }
+ elsif ( ($tagname eq 'span') & ($attr->{class} eq "bleu2"))
+ {
+ $self->{isPlatform} = 1;
+ }
+ elsif ( ($tagname eq 'span') & ($attr->{class} eq "bleu6"))
+ {
+ $self->{isGenre} = 1;
+ }
+ elsif ( ($tagname eq 'p') & ($attr->{class} eq "jeuNote"))
+ {
+ $self->{isGame} = 0;
+ $self->{isEnd} = 1;
+ }
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if ( ($tagname eq 'input') && ($attr->{id} eq 'titreJeu'))
+ {
+ $self->{curInfo}->{name} = $attr->{value};
+ $self->{curInfo}->{platform} = $self->{url_plateforme};
+
+ my $html = $self->loadPage( $self->{url_screenshot} );
+
+ my $found = index($html,"div class=\"image_slideshow\">");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot1} = substr($html, $found +length('div class="image_slideshow">'),length($html)- $found -length('div class="image_slideshow">'));
+ $found = index($self->{curInfo}->{screenshot1},"<a href=\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot1} = substr($self->{curInfo}->{screenshot1}, $found +length('<a href="'),length($self->{curInfo}->{screenshot1})- $found -length('<a href="'));
+ $self->{curInfo}->{screenshot1} = substr($self->{curInfo}->{screenshot1}, 0,index($self->{curInfo}->{screenshot1},"\""));
+ $found = index($html,"\"imageNumberTotal\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($html, $found +length('"imageNumberTotal"'),length($html)- $found -length('"imageNumberTotal"'));
+ $found = index($self->{curInfo}->{screenshot2},"href=\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($self->{curInfo}->{screenshot2}, $found +length('href="'),length($self->{curInfo}->{screenshot2})- $found -length('href="'));
+ $self->{curInfo}->{screenshot2} = 'http://www.jeuxvideo.fr/' . substr($self->{curInfo}->{screenshot2}, 0,index($self->{curInfo}->{screenshot2},"\""));
+
+ $html = $self->loadPage( $self->{curInfo}->{screenshot2} );
+ $found = index($html,"div class=\"image_slideshow\">");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($html, $found +length('div class="image_slideshow">'),length($html)- $found -length('div class="image_slideshow">'));
+ $found = index($self->{curInfo}->{screenshot2},"<a href=\"");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{screenshot2} = substr($self->{curInfo}->{screenshot2}, $found +length('<a href="'),length($self->{curInfo}->{screenshot2})- $found -length('<a href="'));
+ $self->{curInfo}->{screenshot2} = substr($self->{curInfo}->{screenshot2}, 0,index($self->{curInfo}->{screenshot2},"\""));
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'clearer spacer10'))
+ {
+ $self->{isInfo} = 0;
+ $self->{is} = '';
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'listing_apropos'))
+ {
+ $self->{isInfo} = 1;
+ }
+ elsif (($self->{isInfo} eq '1') && ($tagname eq 'span') && ($attr->{class} eq 'strong'))
+ {
+ $self->{isInfo} = 2;
+ }
+ elsif (($self->{is}) && ($tagname eq 'span') && ($attr->{class} eq 'noir'))
+ {
+ $self->{isInfo} = 3;
+ }
+ elsif (($self->{is}) && ($tagname eq 'div') && ($attr->{class} eq 'clearer'))
+ {
+ $self->{isInfo} = 1;
+ $self->{is} = '';
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'note-jeux orange1') && ($attr->{property} eq 'v:rating'))
+ {
+ $self->{isNote} = 1;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'contentCommentaire'))
+ {
+ $self->{isDesc} = 1;
+ }
+ elsif (($self->{isDesc}) && ($tagname eq 'div') && ($attr->{class} eq 'clearer'))
+ {
+ $self->{isDesc} = 0;
+ }
+ elsif ( ($tagname eq 'img') && ($attr->{class} eq 'imgJeu') && !($attr->{src} =~ /blank/i))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList})
+ {
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if ($self->{isGenre})
+ {
+ if ($self->{itemsList}[$self->{itemIdx}]->{genre} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $origtext;
+ $self->{isGenre} = 0;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $self->{itemsList}[$self->{itemIdx}]->{genre} . ' - ' . $origtext;
+ $self->{isGenre} = 0;
+ }
+ }
+ elsif ($self->{isPlatform})
+ {
+ $origtext =~ s/\|//gi;
+ if ($self->{itemsList}[$self->{itemIdx}]->{platform} eq '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= $origtext;
+ }
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isEnd})
+ {
+ my @array = split(/,/,$self->{itemsList}[$self->{itemIdx}]->{platform});
+ my $element;
+
+ my $SaveName = $self->{itemsList}[$self->{itemIdx}]->{name};
+ my $SaveUrl = $self->{itemsList}[$self->{itemIdx}]->{url};
+ my $SaveGenre = $self->{itemsList}[$self->{itemIdx}]->{genre};
+ $self->{itemIdx}--;
+
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $element =~ s/\s+$//;
+
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $SaveName;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $SaveUrl . 'tpfplatformtpf' . $element;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $element;
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $SaveGenre;
+ }
+ $self->{isEnd} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if ($self->{isInfo} eq 2)
+ {
+ $self->{is} = 'genre' if $origtext =~ /Genre :/;
+ $self->{is} = 'editor' if $origtext =~ /Editeur :/;
+ $self->{is} = 'developer' if $origtext =~ /D.veloppeur :/;
+ $self->{is} = 'players' if $origtext =~ /Nb joueurs :/;
+ $self->{is} = 'released' if $origtext =~ /Sortie :/;
+ $self->{is} = 'exclusive' if $origtext =~ /Plateformes :/;
+ }
+ elsif ($self->{isInfo} eq 3)
+ {
+ # Enleve le caractere | qui separe les champs
+ $origtext =~ s/\|//gi;
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($origtext)
+ {
+ if ($self->{is} eq 'players')
+ {
+ $origtext =~ s/Exclusivement Solo/1/i;
+ $origtext =~ s/\s*joueurs?//i;
+ }
+
+ if ($self->{curInfo}->{$self->{is}} eq '')
+ {
+ if ($self->{is} eq 'exclusive')
+ {
+ $self->{curInfo}->{$self->{is}} = 'true';
+ if ($origtext =~ /$self->{curInfo}->{platform}/i)
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ }
+ else
+ {
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ }
+ }
+ else
+ {
+ if ($self->{is} eq 'exclusive')
+ {
+ $self->{curInfo}->{$self->{is}} = 'false';
+ if ($origtext =~ /$self->{curInfo}->{platform}/i)
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ }
+ }
+ else
+ {
+ $self->{curInfo}->{$self->{is}} = $self->{curInfo}->{$self->{is}} . ', ' . $origtext;
+ }
+ }
+
+ }
+ }
+ elsif ($self->{isNote} eq 1)
+ {
+ $self->{curInfo}->{ratingpress} = $origtext;
+ $self->{isNote} = 0;
+ }
+ elsif ($self->{isDesc} eq 1)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return $self->{url_tips};
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 0,
+ genre => 1
+ };
+
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isGenre} = 0;
+ $self->{isEnd} = 0;
+ $self->{isInfo} = 0;
+ $self->{isNote} = 0;
+ $self->{isDesc} = 0;
+ $self->{isTip} = 0;
+ $self->{url_plateforme} = '';
+ $self->{url_screenshot} = '';
+ $self->{url_tips} = '';
+ $self->{is} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ }
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return 'http://www.jeuxvideo.fr/r/'.$word.'/';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ my $found = index($url,"tpfplatformtpf");
+ if ( $found >= 0 )
+ {
+ $self->{url_plateforme} = substr($url, $found +length('tpfplatformtpf'),length($url)- $found -length('tpfplatformtpf'));
+ $url = substr($url, 0,$found);
+ }
+
+ $self->{url_screenshot} = 'http://www.jeuxvideo.fr' . $url . 'image-photo/';
+ $self->{url_tips} = 'http://www.jeuxvideo.fr' . $url . 'astuce-code/';
+
+ return 'http://www.jeuxvideo.fr' . $url;
+ }
+
+ sub getName
+ {
+ return 'jeuxvideo.fr';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCLudus.pm b/lib/gcstar/GCPlugins/GCgames/GCLudus.pm
new file mode 100644
index 0000000..42b42a7
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCLudus.pm
@@ -0,0 +1,367 @@
+package GCPlugins::GCgames::GCLudus;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginLudus;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'span') && ( $attr->{class} eq 'titolini' ))
+ {
+ $self->{isGame} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($self->{isGame}))
+ {
+ $self->{isGame} = 0 ;
+ $self->{isInfo} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($self->{isGame}))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.ludus.it/" . $attr->{href};
+ $self->{isName} = 1 ;
+ $self->{isInfo} = 1 ;
+ }
+ elsif (($tagname eq 'td') && ( $attr->{class} eq 'trat2' ) && ($self->{isInfo} eq '1'))
+ {
+ # le deuxieme champs est le type de donnees
+ $self->{isInfo} = 2 ;
+ }
+ elsif (($tagname eq 'td') && ( $attr->{class} eq 'trat2' ) && ($self->{isInfo} eq '2'))
+ {
+ # le troisieme champs est la plateforme
+ $self->{isPlatform} = 1 ;
+ $self->{isInfo} = 3 ;
+ }
+ elsif (($tagname eq 'td') && ( $attr->{class} eq 'trat2' ) && ($self->{isInfo} eq '3'))
+ {
+ # le quatrieme champs est la date de sortie
+ $self->{isDate} = 1 ;
+ $self->{isInfo} = 0 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if (($tagname eq 'td') && ($attr->{colspan} eq '2') && ($attr->{class} eq 'titoli2'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'testo4'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($self->{isPlatform} eq 1)
+ {
+ $self->{isPlatform} = 2 ;
+ }
+ elsif ($self->{isEditor} eq 1)
+ {
+ $self->{isEditor} = 2 ;
+ }
+ elsif ($self->{isDeveloper} eq 1)
+ {
+ $self->{isDeveloper} = 2 ;
+ }
+ elsif ($self->{isGenre} eq 1)
+ {
+ $self->{isGenre} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ($attr->{class} eq 'testo') && ($attr->{align} eq ''))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'tpfsautdeligne') && ($self->{isDescription}))
+ {
+ $self->{curInfo}->{description} .= "\n";
+ }
+ elsif (($tagname eq 'table') && ($self->{isDescription}))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif ( ($tagname eq 'a') && (index($attr->{onclick},"adafl=win") >= 0) && ($self->{curInfo}->{screenshot1} eq '') && ($self->{curInfo}->{screenshot2} eq ''))
+ {
+ $self->{isScreen} = 1;
+ }
+ elsif ( ($tagname eq 'img') && ($self->{isScreen}) )
+ {
+ if ($self->{curInfo}->{screenshot1} eq '')
+ {
+ $self->{curInfo}->{screenshot1} = $attr->{src};
+ $self->{curInfo}->{screenshot1} =~ s|//|http://www.ludus.it/|;
+ my $found = index(reverse($self->{curInfo}->{screenshot1}),"/");
+ if ( $found >= 0 )
+ {
+ my $tempscreen = substr(reverse($self->{curInfo}->{screenshot1}), $found +length('/'),length($self->{curInfo}->{screenshot1})- $found -length('/'));
+ my $tempscreen2 = substr(reverse($self->{curInfo}->{screenshot1}), 0, $found);
+ $tempscreen2 = "/immagini_grandi/" . reverse($tempscreen2);
+ $self->{curInfo}->{screenshot1} = reverse($tempscreen) . $tempscreen2;
+ }
+ }
+ elsif ($self->{curInfo}->{screenshot2} eq '')
+ {
+ $self->{curInfo}->{screenshot2} = $attr->{src};
+ $self->{curInfo}->{screenshot2} =~ s|//|http://www.ludus.it/|;
+ my $found = index(reverse($self->{curInfo}->{screenshot2}),"/");
+ if ( $found >= 0 )
+ {
+ my $tempscreen = substr(reverse($self->{curInfo}->{screenshot2}), $found +length('/'),length($self->{curInfo}->{screenshot2})- $found -length('/'));
+ my $tempscreen2 = substr(reverse($self->{curInfo}->{screenshot2}), 0, $found);
+ $tempscreen2 = "/immagini_grandi/" . reverse($tempscreen2);
+ $self->{curInfo}->{screenshot2} = reverse($tempscreen) . $tempscreen2;
+ }
+ $self->{isScreen} = 0;
+ }
+ }
+ elsif (($tagname eq 'a') && (index($attr->{href},"post_form") >= 0))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{href};
+ $self->{curInfo}->{boxpic} =~ s|/LINGUA/IT||;
+ my $found = index(reverse($self->{curInfo}->{boxpic}),"/");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{boxpic} = substr(reverse($self->{curInfo}->{boxpic}), 0, $found);
+ $self->{curInfo}->{boxpic} = "http://www.ludus.it/copertine/giochi/" . reverse($self->{curInfo}->{boxpic}) . ".jpg";
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isPlatform})
+ {
+ $origtext =~ s/Pc/PC/;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ my $found = index(reverse($origtext),"-");
+ if ( $found >= 0 )
+ {
+ $origtext = substr(reverse($origtext), $found +length('-'),length($origtext)- $found -length('-'));
+ $origtext = reverse($origtext);
+ }
+ $self->{curInfo}->{name} = $origtext;
+ $self->{curInfo}->{released} = $self->{itemsList}[$self->{wantedIdx}]->{released};
+ $self->{isName} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isPlatform} = 1 if ($origtext =~ m/Piattaforma:/i);
+ $self->{isEditor} = 1 if ($origtext =~ m/Software House:/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/Sviluppatore:/i);
+ $self->{isGenre} = 1 if ($origtext =~ m/Genere:/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ my @array = split(/\//,$origtext);
+ my $element;
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ $self->{curInfo}->{genre} .= $element;
+ $self->{curInfo}->{genre} .= ",";
+ }
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0 ;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ $origtext =~ s/Pc/PC/;
+ $self->{curInfo}->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ genre => 0,
+ released => 1
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isGenre} = 0;
+ $self->{isScreen} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|<tpfsautdeligne>|gi;
+ $html =~ s|<br />|<tpfsautdeligne>|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ $word =~ s/\+/ /g;
+ return ('http://www.ludus.it/code/lista_alfabetica_giochi/LINGUA/IT', ["categoria" => "2", "SEARCH_STRING" => "$word"] );
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'Ludus';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm b/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm
new file mode 100644
index 0000000..c6650c3
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCMobyGames.pm
@@ -0,0 +1,541 @@
+package GCPlugins::GCgames::GCMobyGames;
+
+###################################################
+#
+# Copyright 2005-2011 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginMobyGames;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+ use HTML::Entities;
+
+ sub extractTips
+ {
+ my ($self, $html_ini) = @_;
+ my $answer = "";
+ my @tmpAnswer = ();
+ my $html = $self->loadPage($html_ini, 0, 1);
+ $html =~ s|<pre>||gi;
+ $html =~ s|</pre>||gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ my $found = index($html,"class=\"sbL sbB sbT\">");
+ if ( $found >= 0 )
+ {
+ $answer = substr($html, $found + length("class=\"sbL sbB sbT\">"),length($html)- $found -length("class=\"sbL sbB sbT\">") );
+ $answer = substr($answer, 0, index($answer,"</td><td align="));
+
+ $tmpAnswer[0] = decode_entities($answer);
+
+ $found = index($html,"class=\"sbR sbL sbB\"><p>");
+ if ( $found >= 0 )
+ {
+ my $html2 = substr($html, $found + length("class=\"sbR sbL sbB\"><p>"),length($html)- $found -length("class=\"sbR sbL sbB\"><p>") );
+ $html2 = substr($html2, 0, index($html2,"</p>"));
+ $html2 =~ s/<br>/\n/gi;
+ $html2 =~ s|<p>|\n|gi;
+ $html2 =~ s|</p>||gi;
+
+ $tmpAnswer[1] = decode_entities($html2);
+ }
+
+ }
+
+ return @tmpAnswer;
+ }
+
+ sub extractPlayer
+ {
+ my ($self, $html_ini, $word) = @_;
+ my $html = 0;
+ my $found = index($html_ini,$word);
+ if ( $found >= 0 )
+ {
+ $html = substr($html_ini, $found + length($word),length($html_ini)- $found -length($word) );
+ $html = substr($html,0, index($html,"</a>") );
+ $html = reverse($html);
+ $html = substr($html,0, index($html,">") );
+ $html = reverse($html);
+ $html =~ s/&nbsp;/ /g;
+ $html =~ s/1 Player/1/;
+ }
+ return $html;
+ }
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if ( !$self->{insideSearchImage}
+ && ($tagname eq 'a')
+ && ( substr($attr->{href},0,6) eq '/game/' ) )
+ {
+ # Test if there is a platform name in it
+ # (i.e. if we can find a second slash after game/ )
+ if ($attr->{href} =~ m|/game/[^/]*/|)
+ {
+ if ($self->{currentName})
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://www.mobygames.com'.$attr->{href}.'';
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $self->{currentName};
+ $self->{isPlatform} = 1;
+ }
+ else
+ {
+ # This is a game we want to add
+ $self->{isGame} = 1;
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://www.mobygames.com'.$attr->{href}.'';
+ $self->{isName} = 1 ;
+ }
+ }
+ else
+ {
+ # We will need the name later
+ $self->{isGameName} = 1;
+ }
+ }
+ elsif ( ($tagname eq 'a') && ( substr($attr->{href},0,7) eq '/search' ) )
+ {
+ $self->{isGame} = 0;
+ }
+ elsif ($tagname eq 'div')
+ {
+ if ($attr->{class} eq 'searchResult')
+ {
+ $self->{currentName} = '';
+ }
+ elsif ($attr->{class} eq 'searchImage')
+ {
+ $self->{insideSearchImage} = 1;
+ }
+ }
+ elsif ($tagname eq 'em')
+ {
+ $self->{isDate} = 1;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ if (($tagname eq 'table') && ($attr->{summary} eq 'List of Tips and Tricks'))
+ {
+ $self->{isSectionTips} = 2;
+ }
+ elsif ( ($tagname eq 'b') && ($self->{isSectionTips} eq '2') )
+ {
+ $self->{isSectionTips} = 1;
+ }
+ elsif ( ($tagname eq 'tr') && (($attr->{class} eq 'mb1') || ($attr->{class} eq 'mb2')) )
+ {
+ $self->{isTip} = 1 if ($self->{isTip} eq 2);
+ $self->{isCode} = 1 if ($self->{isCode} eq 2);
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isTip} eq 1))
+ {
+ my @tips = $self->extractTips('http://www.mobygames.com'.$attr->{href}.'');
+ if ($tips[0] =~ m/unlock/i)
+ {
+ $Text::Wrap::columns = 80;
+ $tips[1] = Text::Wrap::wrap('', '', $tips[1]);
+ #$self->{tmpCheatLine} = [];
+ #push @{$self->{tmpCheatLine}}, @tips;
+ push @{$self->{curInfo}->{unlockable}}, \@tips;
+ }
+ else
+ {
+ my $answer = $tips[0];
+ $answer .= "\n";
+ $answer .= $tips[1];
+ if ( ($self->{curInfo}->{secrets}) && ($answer ne "") )
+ {
+ $self->{curInfo}->{secrets} .= "\n\n\n"
+ }
+ $self->{curInfo}->{secrets} .= $answer;
+ }
+ $self->{isTip} = 2;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isCode} eq 1))
+ {
+ my @tips = $self->extractTips('http://www.mobygames.com'.$attr->{href}.'');
+ @tips = reverse(@tips);
+ $Text::Wrap::columns = 80;
+ $tips[1] = Text::Wrap::wrap('', '', $tips[1]);
+ #$self->{tmpCheatLine} = [];
+ #push @{$self->{tmpCheatLine}}, @tips;
+ push @{$self->{curInfo}->{code}}, \@tips;
+
+ $self->{isCode} = 2;
+
+ }
+ elsif ($tagname eq 'br')
+ {
+ $self->{isTip} = 3;
+ $self->{isCode} = 3;
+ $self->{isSectionTips} = 0;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isTip} = 0;
+ $self->{isCode} = 0;
+ $self->{isSectionTips} = 0;
+ }
+
+ }
+ else
+ {
+
+ if ($tagname eq 'div')
+ {
+ for ($attr->{id})
+ {
+ /^gameTitle$/ && ($self->{isName} = 1, last);
+ /^gamePlatform/ && ($self->{isPlatform} = 1, last);
+ #/^coreGameCover/ && ($self->{isBox} = 1, last);
+ /^coreGameRelease/ && ($self->{isEditor} = 1, last);
+ }
+
+ if ($attr->{class} =~ m/scoreBoxBig/)
+ {
+ $self->{isRating} = 1;
+ }
+
+ if ($self->{curInfo}->{genre})
+ {
+ $self->{isGenre} = 0;
+ }
+
+ $self->{isDescription} = 0;
+
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isName}) )
+ {
+ $self->{is} = 'name';
+ $self->{curInfo}->{exclusive} = 1;
+ $self->{isName} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isPlatform}) )
+ {
+ $self->{is} = 'platform';
+ $self->{isPlatform} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isEditor}) )
+ {
+ $self->{is} = 'editor';
+ $self->{isEditor} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isDeveloper}) )
+ {
+ $self->{is} = 'developer';
+ $self->{isDeveloper} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isDate}) )
+ {
+ $self->{is} = 'released';
+ $self->{isDate} = 0;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isGenre}) )
+ {
+ $self->{is} = 'genre';
+ }
+ elsif ($tagname eq 'img')
+ {
+ if ($attr->{src} =~ m|covers/small|)
+ {
+ $attr->{src} =~ s|/small/|/large/|
+ if $self->{bigPics};
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ # From here we try to get back cover
+ my $covers = $self->loadPage($self->{rootUrl}.'/cover-art', 0, 1);
+ $covers =~ m|<img alt=".*?Back Cover".*?src="([^"]*)"|;
+ $self->{curInfo}->{backpic} = $1;
+ $self->{curInfo}->{backpic} =~ s|/small/|/large/|
+ if $self->{bigPics};
+ }
+ }
+ elsif ($tagname eq 'html')
+ {
+ my $html = $self->loadPage($self->{curInfo}->{$self->{urlField}}.'/techinfo', 0, 1);
+ my $player_offline = $self->extractPlayer($html, "Number&nbsp;of Players: Offline" );
+ my $player_online = $self->extractPlayer($html, "Number&nbsp;of Players: Online" );
+ my $player_total = $self->extractPlayer($html, "Number&nbsp;of Players Supported" );
+
+ if ($player_total)
+ {
+ $self->{curInfo}->{players} = $player_total;
+ }
+ else
+ {
+ if ($player_offline)
+ {
+ $self->{curInfo}->{players} = 'Offline: '.$player_offline;
+ }
+ if ($player_online)
+ {
+ if ( $self->{curInfo}->{players} )
+ {
+ $self->{curInfo}->{players} .= '; Online: '.$player_online;
+ }
+ else
+ {
+ $self->{curInfo}->{players} = 'Online: '.$player_online;
+ }
+ }
+ }
+
+ $html = $self->loadPage($self->{curInfo}->{$self->{urlField}}.'/screenshots', 0, 1);
+ my $screen = 1;
+ while ($html =~ m|src="(/images/shots/[^"]*?)"|g)
+ {
+ $self->{curInfo}->{'screenshot'.$screen} = 'http://www.mobygames.com' . $1;
+ $self->{curInfo}->{'screenshot'.$screen} =~ s|/images/shots/s/|/images/shots/l/|
+ if $self->{bigPics};
+ $screen++;
+ last if $screen > 2;
+ }
+ }
+ elsif ( ($tagname eq 'br') && ($self->{isDescription}) )
+ {
+ $self->{curInfo}->{description} .= "\n";
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+ if ($self->{parsingList} && ($tagname eq 'div'))
+ {
+ $self->{insideSearchImage} = 0;
+ }
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ #$self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ if ($origtext !~ /^Game:/)
+ {
+ if (!$self->{currentName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ }
+ $self->{isName} = 0;
+ }
+ }
+ elsif ($self->{isPlatform})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isGameName})
+ {
+ $self->{currentName} = $origtext;
+ $self->{isGameName} = 0;
+ }
+ elsif ($self->{isDate})
+ {
+ # <em> tags enclose both dates and the 'a.k.a.' text, so make sure we
+ # ignore the aka ones
+ if ($origtext !~ /^a\.k\.a\./)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{released} = $origtext;
+ if (! $self->{itemsList}[$self->{itemIdx}]->{platform})
+ {
+ $self->{previous} =~ s/[\s\(]*$//g;
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $self->{previous};
+ }
+ }
+ $self->{isDate} = 0;
+ }
+ $self->{previous} = $origtext;
+ }
+ elsif ($self->{parsingTips})
+ {
+ if ($self->{isSectionTips} eq 1)
+ {
+ if ($origtext =~ m/General Hints\/Tips/i)
+ {
+ $self->{isTip} = 2;
+ $self->{isCode} = 0;
+ }
+ elsif ($origtext =~ m/Cheats\/Codes/i)
+ {
+ $self->{isTip} = 0;
+ $self->{isCode} = 2;
+ }
+ $self->{isSectionTips} = 2;
+ }
+ }
+ else
+ {
+ if ($self->{is})
+ {
+ $origtext =~ s/^\s*//;
+
+ if ($self->{is} eq 'platform')
+ {
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ $self->{curInfo}->{platform} =~ s/DOS/PC/;
+ $self->{curInfo}->{platform} =~ s/Windows/PC/;
+ }
+ elsif ($self->{is} eq 'genre')
+ {
+ push @{$self->{curInfo}->{genre}}, [ $origtext ];
+ }
+ else
+ {
+ $self->{curInfo}->{$self->{is}} = $origtext;
+ }
+
+ $self->{is} = '';
+ }
+ elsif ($self->{isRating})
+ {
+ $self->{curInfo}->{ratingpress} = int($origtext/10+0.5);
+ $self->{isRating} = 0;
+ }
+ elsif ($self->{isDescription})
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ elsif ($origtext eq 'Developed by')
+ {
+ $self->{isDeveloper} = 1
+ }
+ elsif ( ($origtext eq 'Also For') || (($origtext eq 'Platforms')))
+ {
+ $self->{curInfo}->{exclusive} = 0;
+ }
+ elsif ($origtext eq 'Released')
+ {
+ $self->{isDate} = 1
+ }
+ elsif ($origtext eq 'Genre')
+ {
+ $self->{isGenre} = 1
+ }
+ elsif ($origtext eq 'Description')
+ {
+ $self->{isDescription} = 1
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+ my $url = $self->{curInfo}->{$self->{urlField}}.'/hints';
+ $url =~ s/##MobyGames//;
+ return $url;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ released => 1
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isGameName} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isGenre} = 0;
+ $self->{isDescription} = 0;
+ $self->{isBox} = 0;
+ $self->{isSectionTips} = 0;
+ $self->{isTip} = 0;
+ $self->{isCode} = 0;
+ $self->{is} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ $self->{rootUrl} = $self->{loadedUrl};
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return 'http://www.mobygames.com/search/quick?q='.$word.'&p=-1&search=Go&sFilter=1&sG=on';
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.mobygames.com/';
+ }
+
+ sub getName
+ {
+ return 'MobyGames';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCNextGame.pm b/lib/gcstar/GCPlugins/GCgames/GCNextGame.pm
new file mode 100644
index 0000000..b884b54
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCNextGame.pm
@@ -0,0 +1,480 @@
+package GCPlugins::GCgames::GCNextGame;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginNextGame;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isGenre} eq '1')
+ {
+ $self->{isGenre} = 2 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'box_searchresult'))
+ {
+ $self->{isGame} = 1 ;
+ $self->{itemIdx}++;
+ }
+ elsif (($tagname eq 'ul') && ($attr->{class} eq 'platforms'))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'li') && ($self->{isPlatform} eq 1))
+ {
+ $self->{isPlatform} = 2 ;
+ }
+ elsif (($tagname eq 'hr') && ($attr->{class} eq 'clear'))
+ {
+ $self->{isPlatform} = 0 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'blu'))
+ {
+ return if $self->{alreadyRetrieved}->{$attr->{href}};
+ $self->{alreadyRetrieved}->{$attr->{href}} = 1;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'dt') && ($self->{isGame} eq '1'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if ($self->{isDeveloper} eq 1)
+ {
+ $self->{isDeveloper} = 2;
+ }
+ elsif ($self->{isGenre} eq 1)
+ {
+ $self->{isGenre} = 2;
+ }
+ elsif ($self->{isEditor} eq 1)
+ {
+ $self->{isEditor} = 2 ;
+ }
+ elsif ($self->{isDate} eq 1)
+ {
+ $self->{isDate} = 2 ;
+ }
+ elsif ($self->{isPlayer} eq 1)
+ {
+ $self->{isPlayer} = 2;
+ }
+ elsif ($self->{isPlatform} eq 1)
+ {
+ $self->{isPlatform} = 2;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'box_liquid'))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif ($tagname eq 'head')
+ {
+ $self->{isDescription} = 0 ;
+ }
+ elsif (($tagname eq 'h1') && ($attr->{class} eq 'blu'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'hr') && ($attr->{class} eq 'clear'))
+ {
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif (($tagname eq 'dl') && ($attr->{class} eq 'datasheet_column'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($tagname eq 'dt') && ($self->{isAnalyse} eq '1'))
+ {
+ $self->{isAnalyse} = 2 ;
+ }
+ elsif (($tagname eq 'td') && ($attr->{class} eq 'active current'))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{id} eq 'datasheet_packshot'))
+ {
+ $self->{curInfo}->{boxpic} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{boxpic} =~ s|.T160.|.|gi;
+ }
+ }
+ elsif ( ($tagname eq 'img') && ($attr->{class} eq 'thumb') )
+ {
+ if ($self->{curInfo}->{screenshot1} eq '')
+ {
+ $self->{curInfo}->{screenshot1} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{screenshot1} =~ s|.T200.|.|gi;
+ }
+ }
+ elsif ($self->{curInfo}->{screenshot2} eq '')
+ {
+ $self->{curInfo}->{screenshot2} = $attr->{src};
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{screenshot2} =~ s|.T200.|.|gi;
+ }
+ }
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} eq 'REVIEW'))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($tagname eq 'ul') && ($attr->{class} eq 'platforms') && ($self->{isDescription} eq 1))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{class} eq 'blu') && ($self->{isDescription} eq 3))
+ {
+ my $html = $self->loadPage( $attr->{href}, 0, 1 );
+ $html =~ s|&amp;|&|gi;
+ my $found = index($html,"<div class=\"testo edit_inline_box\" id=\"id_text\">");
+ if ( $found >= 0 )
+ {
+ $html = "<>" . substr($html, $found +length('<div class="testo edit_inline_box" id="id_text">'),length($html)- $found -length('<div class="testo edit_inline_box" id="id_text">'));
+
+ $found = index($html,"<div class=\"byline\">");
+ if ( $found >= 0 )
+ {
+ $html = substr($html, 0, $found);
+ }
+
+ my @array = split(/</,$html);
+ my $element;
+
+ foreach $element (@array)
+ {
+ $found = index($element,">");
+ if ( $found >= 0 )
+ {
+ $self->{curInfo}->{description} .= substr($element, $found +length('>'),length($element)- $found -length('>'));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if (($self->{itemsList}[$self->{itemIdx}]->{platform} eq '') && ($origtext ne ''))
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $origtext;
+ }
+ elsif ($origtext ne '')
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= ', ';
+ $self->{itemsList}[$self->{itemIdx}]->{platform} .= $origtext;
+ }
+
+ $self->{isPlatform} = 1 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isGenre} = 1 if ($origtext =~ m/Genere/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $origtext;
+
+ my @array = split(/,/,$self->{itemsList}[$self->{itemIdx}]->{platform});
+ my $element;
+
+ my $SaveName = $self->{itemsList}[$self->{itemIdx}]->{name};
+ my $SaveUrl = $self->{itemsList}[$self->{itemIdx}]->{url};
+ my $SaveGenre = $self->{itemsList}[$self->{itemIdx}]->{genre};
+ $self->{itemIdx}--;
+
+ if ($SaveName ne "")
+ {
+ foreach $element (@array)
+ {
+ # Enleve les blancs en debut de chaine
+ $element =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $element =~ s/\s+$//;
+
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $SaveName;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $SaveUrl . $element .'/';
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $element;
+ $self->{itemsList}[$self->{itemIdx}]->{genre} = $SaveGenre;
+ }
+ }
+ else
+ {
+ $self->{itemIdx}++;
+ delete $self->{itemsList}[$self->{itemIdx}];
+ $self->{itemIdx}--;
+ }
+
+ $self->{isGenre} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{isName} = 0 ;
+
+ if ($self->{ean} ne '')
+ {
+ $self->{curInfo}->{ean} = $self->{ean};
+ }
+
+ }
+ elsif ($self->{isPlatform} eq 2)
+ {
+ $self->{curInfo}->{platform} = $origtext;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isAnalyse} eq 2)
+ {
+ $self->{isEditor} = 1 if ($origtext =~ m/Produttore/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/Sviluppatore/i);
+ $self->{isGenre} = 1 if ($origtext =~ m/Genere/i);
+ $self->{isDate} = 1 if ($origtext =~ m/Disponibile/i);
+ $self->{isPlayer} = 1 if ($origtext =~ m/Giocatori/i);
+
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0;
+ }
+ elsif ($self->{isGenre} eq 2)
+ {
+ $self->{curInfo}->{genre} = $origtext;
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isDate} eq 2)
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isDate} = 0 ;
+ }
+ elsif ($self->{isPlayer} eq 2)
+ {
+ $self->{curInfo}->{players} = $origtext;
+ $self->{isPlayer} = 0 ;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ if ($origtext =~ m/$self->{curInfo}->{platform}/i)
+ {
+ $self->{isDescription} = 3;
+ }
+ else
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1,
+ genre => 1,
+ released => 0
+ };
+
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isAnalyse} = 0 ;
+ $self->{isGenre} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isPlayer} = 0;
+ $self->{isDescription} = 0;
+ $self->{ean} = '';
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|</li><li>|<ul class="platforms">|gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ $self->{alreadyRetrieved} = {};
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'ean')
+ {
+ $self->{ean} = $word;
+ }
+ else
+ {
+ $self->{ean} = '';
+ }
+
+ return 'http://next.videogame.it/magazine/review/?name='.$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://next.videogame.it/';
+ }
+
+ sub getName
+ {
+ return 'NextGame';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+ return "ISO-8859-1";
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'IT';
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+
+ sub getDefaultPictureSuffix
+ {
+ return '.jpg';
+ }
+}
+
+1;
+
diff --git a/lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm b/lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm
new file mode 100644
index 0000000..c0759a4
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCTheLegacy.pm
@@ -0,0 +1,316 @@
+package GCPlugins::GCgames::GCTheLegacy;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+
+{
+ package GCPlugins::GCgames::GCPluginTheLegacy;
+
+ use base 'GCPlugins::GCgames::GCgamesPluginsBase';
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+ if ($self->{parsingList})
+ {
+ if (($tagname eq 'a') && ( $attr->{class} eq 'aa' ))
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://www.thelegacy.de/Museum/" . $attr->{href};
+ $self->{isName} = 1 ;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ if (($tagname eq 'div') && ($attr->{style} eq 'font-size:14pt; color:#990000; padding-top:0.5em;'))
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif (($tagname eq 'div') && ($attr->{class} eq 'description') && ($self->{curInfo}->{platform} eq ''))
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{target} eq 'ListGames') && ($attr->{class} eq 'a') && ($attr->{style} eq ''))
+ {
+ $self->{isGenre} = 1 ;
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/pics/cover/Thumb|i))
+ {
+ $self->{curInfo}->{boxpic} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/pics/backcover/Thumb|i))
+ {
+ $self->{curInfo}->{backpic} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ elsif (($tagname eq 'img') && ($attr->{src} =~ m|/pics/screen|i))
+ {
+ if ($self->{curInfo}->{screenshot1} eq '')
+ {
+ $self->{curInfo}->{screenshot1} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ elsif ($self->{curInfo}->{screenshot2} eq '')
+ {
+ $self->{curInfo}->{screenshot2} = "http://www.thelegacy.de" . $attr->{src};
+ }
+ }
+ elsif ( (($tagname eq 'span') ||($tagname eq 'div')) && ($attr->{class} eq 'category'))
+ {
+ $self->{isAnalyse} = 1 ;
+ }
+ elsif (($self->{isEditor} eq 1) && ($tagname eq 'a') && ($attr->{target} eq 'ListGames') && ($attr->{class} eq 'aa') && ($self->{curInfo}->{editor} eq ''))
+ {
+ $self->{isEditor} = 2 ;
+ }
+ elsif (($self->{isDeveloper} eq 1) && ($tagname eq 'a') && ($attr->{target} eq 'ListGames') && ($attr->{class} eq 'aa') && ($self->{curInfo}->{developer} eq ''))
+ {
+ $self->{isDeveloper} = 2 ;
+ }
+ elsif (($self->{isDate} eq 1) && ($tagname eq 'div') && ($attr->{class} eq 'description') && ($self->{curInfo}->{released} eq ''))
+ {
+ $self->{isDate} = 2 ;
+ }
+ elsif (($tagname eq 'a') && ($attr->{name} =~ m|review_|i))
+ {
+ $self->{isDescription} = 1 ;
+ }
+ elsif (($self->{isDescription} eq 1) && ($tagname eq 'a') && ($attr->{class} eq 'aa'))
+ {
+ $self->{isDescription} = 2 ;
+ }
+ elsif (($tagname eq 'span') && ( $attr->{id} =~ m|review_|i) && ( $attr->{id} =~ m|_less|i))
+ {
+ $self->{isDescription} = 0 ;
+ }
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+ if ($self->{isName})
+ {
+ $self->{curInfo}->{name} = $origtext;
+ $self->{isName} = 0 ;
+ }
+ elsif ($self->{isAnalyse})
+ {
+ $self->{isDate} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isEditor} = 0;
+
+ $self->{isDate} = 1 if ($origtext =~ m/ffentlichung/i);
+ $self->{isDate} = 1 if ($origtext =~ m/Publishing/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/Entwickler/i);
+ $self->{isDeveloper} = 1 if ($origtext =~ m/developer/i);
+ $self->{isEditor} = 1 if ($origtext =~ m/Publisher/i);
+
+ $self->{isAnalyse} = 0 ;
+ }
+ elsif ($self->{isDate} eq 2)
+ {
+ $origtext =~ s/://;
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isDate} = 0 ;
+ }
+ elsif ($self->{isGenre})
+ {
+ $self->{curInfo}->{genre} .= $origtext;
+ $self->{curInfo}->{genre} .= ",";
+ $self->{isGenre} = 0;
+ }
+ elsif ($self->{isDeveloper} eq 2)
+ {
+ $self->{curInfo}->{developer} = $origtext;
+ $self->{isDeveloper} = 0 ;
+ }
+ elsif ($self->{isEditor} eq 2)
+ {
+ $self->{curInfo}->{editor} = $origtext;
+ $self->{isEditor} = 0 ;
+ }
+ elsif ($self->{isPlatform})
+ {
+ $origtext =~ s/PC \(Windows\)/PC/;
+ my @array = split(/-/,$origtext);
+ $self->{curInfo}->{platform} = $array[0];
+ # Enleve les blancs en fin de chaine
+ $self->{curInfo}->{platform} =~ s/\s+$//;
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isDescription} eq 1)
+ {
+ $self->{curInfo}->{description} .= $origtext;
+ }
+ elsif ($self->{isDescription} eq 2)
+ {
+ $self->{isDescription} = 1;
+ }
+ }
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return ;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 0,
+ genre => 0,
+ released => 0
+ };
+
+ $self->{isInfo} = 0;
+ $self->{isName} = 0;
+ $self->{isPlatform} = 0 ;
+ $self->{isAnalyse} = 0;
+ $self->{isEditor} = 0;
+ $self->{isDeveloper} = 0;
+ $self->{isDate} = 0;
+ $self->{isGenre} = 0;
+ $self->{isDescription} = 0;
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ if ($self->{parsingList})
+ {
+ }
+ else
+ {
+ $html =~ s|<u>||gi;
+ $html =~ s|<li>|\n* |gi;
+ $html =~ s|<br>|\n|gi;
+ $html =~ s|<br />|\n|gi;
+ $html =~ s|<b>||gi;
+ $html =~ s|</b>||gi;
+ $html =~ s|<i>||gi;
+ $html =~ s|</i>||gi;
+ $html =~ s|<p>|\n|gi;
+ $html =~ s|</p>||gi;
+ $html =~ s|\x{92}|'|gi;
+ $html =~ s|&#146;|'|gi;
+ $html =~ s|&#149;|*|gi;
+ $html =~ s|&#156;|oe|gi;
+ $html =~ s|&#133;|...|gi;
+ $html =~ s|\x{85}|...|gi;
+ $html =~ s|\x{8C}|OE|gi;
+ $html =~ s|\x{9C}|oe|gi;
+ }
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ return "http://www.thelegacy.de/Museum/SQLlist_games.php3?logicalSearchConnection[]=AND&SearchValue=" . $word. "&searchEntity=TITLE&Review=&Forum=&type=&changed=&TopTen=&titel_id=&game_id=&titel=&first_letter=&misc=yes&quick=yes";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'TheLegacy';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'DE';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-15";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm b/lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm
new file mode 100644
index 0000000..ce3b52c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCgamesAmazonCommon.pm
@@ -0,0 +1,314 @@
+package GCPlugins::GCgames::GCgamesAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCgames::GCgamesCommon;
+use GCPlugins::GCstar::GCAmazonCommon;
+
+{
+ package GCPlugins::GCgames::GCgamesAmazonPluginsBase;
+
+ use base ('GCPlugins::GCgames::GCgamesPluginsBase', 'GCPlugins::GCstar::GCPluginAmazonCommon');
+
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ if ( ($tagname eq 'div') && ($attr->{class} eq 'buying') && ($self->{isGame} ne 2) )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{loadedUrl};
+ $self->{isGame} = 2 ;
+ }
+ elsif ( ($tagname eq 'h1') && ($attr->{class} eq 'headerblocktitle') && ($self->{isGame} ne 2) )
+ {
+ $self->{isGame} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif ( ($tagname eq 'td') && ($attr->{class} eq 'imageColumn') && ($self->{isGame} ne 2) )
+ {
+ $self->{isGame} = 1 ;
+ $self->{isUrl} = 1 ;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isGame} eq 1) && ($self->{isUrl}) )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $attr->{href};
+ $self->{isUrl} = 0 ;
+ }
+ elsif ( ($tagname eq 'span') && ($attr->{class} eq 'srTitle') && ($self->{isGame} eq 1) )
+ {
+ $self->{isName} = 1 ;
+ }
+ elsif ( ($tagname eq 'span') && ($attr->{class} eq 'binding') && ($self->{isGame} eq 1) )
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif ( ($tagname eq 'span') && ($attr->{class} eq 'avail') )
+ {
+ $self->{isGame} = 0 ;
+ }
+ elsif ( ($tagname eq 'div') && ($attr->{class} eq 'usedPrice') )
+ {
+ $self->{isGame} = 0 ;
+ }
+ elsif ( ($tagname eq 'input') && ($attr->{name} eq 'sdp-sai-asin') )
+ {
+ $self->{isCodeEAN} = 1 ;
+ }
+ elsif ( ($tagname eq 'a') && ($self->{isCodeEAN}))
+ {
+ $self->{SaveUrl} = $attr->{href};
+ $self->{isCodeEAN} = 0 ;
+ }
+ elsif ( ($tagname eq 'b') && ($attr->{class} eq 'sans') )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $self->{SaveUrl};
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+
+ if ( ($tagname eq 'meta') && ($attr->{name} eq 'keywords') )
+ {
+ my ($name, $editor, @genre) = split(/,/,$attr->{content});
+ $self->{curInfo}->{name} = $name;
+ $self->{curInfo}->{editor} = $editor;
+ my $element;
+ foreach $element (@genre)
+ {
+ $element =~ s/^\s+//;
+ if ( !($element =~ m/console/i) && !($element =~ m/cartouche/i) && !($element =~ m/video games/i) && !($element =~ /([0-9])/))
+ {
+ $self->{curInfo}->{genre} .= $element;
+ $self->{curInfo}->{genre} .= ",";
+ }
+ }
+
+ # Sur Amazon.com et amazon.co.jp je n ai pas reussi a trouver un critere pertinent pour la recherche des genres
+ if (($self->{suffix} eq 'com') || ($self->{suffix} eq 'co.jp') )
+ {
+ $self->{curInfo}->{genre} = '';
+ }
+
+ if ($self->{ean} ne '')
+ {
+ $self->{curInfo}->{ean} = $self->{ean};
+ }
+ }
+ elsif ($tagname eq 'tpfdateparution')
+ {
+ $self->{isDate} = 1 ;
+ }
+ elsif ($tagname eq 'tpfplateforme')
+ {
+ $self->{isPlatform} = 1 ;
+ }
+ elsif ($tagname eq 'tpfcouverture')
+ {
+ $self->{curInfo}->{boxpic} = $self->extractImage($attr);
+ }
+ elsif ($tagname eq 'tpfscreenshot1')
+ {
+ $self->{curInfo}->{screenshot1} = $self->extractImage($attr);
+ }
+ elsif ($tagname eq 'tpfscreenshot2')
+ {
+ $self->{curInfo}->{screenshot2} = $self->extractImage($attr);
+ }
+ elsif (($tagname eq 'tpfdescription') )
+ {
+ $self->{isDesc} = 1;
+ }
+ elsif ( ($tagname eq 'div') && ($attr->{class} eq 'bucket') && ($self->{isDesc} eq 1))
+ {
+ $self->{isDesc} = 0;
+ }
+
+ }
+ }
+
+ sub end
+ {
+ my ($self, $tagname) = @_;
+
+ $self->{inside}->{$tagname}--;
+ }
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ if ($self->{isPlatform})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{platform} = $self->transformPlatform($origtext);
+ $self->{isPlatform} = 0;
+ }
+ elsif ($self->{isName})
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{name} = $origtext;
+ $self->{isName} = 0;
+ }
+ }
+ elsif ($self->{parsingTips})
+ {
+ }
+ else
+ {
+ # Enleve les blancs en debut de chaine
+ $origtext =~ s/^\s+//;
+ # Enleve les blancs en fin de chaine
+ $origtext =~ s/\s+$//;
+
+ if ($self->{isDate})
+ {
+ $self->{curInfo}->{released} = $origtext;
+ $self->{isDate} = 0;
+ }
+ elsif ($self->{isPlatform})
+ {
+ if ($origtext ne '' )
+ {
+ $self->{curInfo}->{platform} = $self->transformPlatform($origtext);
+ $self->{isPlatform} = 0;
+ }
+ }
+ elsif (($self->{isDesc}) && ($origtext ne ""))
+ {
+ $self->{curInfo}->{description} .= $origtext ."\n";
+ }
+ }
+ }
+
+ sub transformPlatform
+ {
+ my ($self, $platform) = @_;
+
+ $platform =~ s/^([\w ]*)\W{2}.*$/$1/ms;
+ $platform =~ s/SONY //i;
+ if ($platform =~ m/windows/i)
+ {
+ $platform = 'PC';
+ }
+ return $platform;
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ name => 1,
+ platform => 1
+ };
+
+ $self->{isCodeEAN} = 0;
+ $self->{SaveUrl} = '';
+ $self->{isName} = 0;
+ $self->{isGame} = 0;
+ $self->{isUrl} = 0;
+ $self->{isPlatform} = 0;
+ $self->{isDate} = 0;
+ $self->{isDesc} = 0;
+ $self->{ean} = '';
+
+ return $self;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ if ($self->{searchField} eq 'ean')
+ {
+ $self->{ean} = $word;
+ return "http://s1.amazon." . $self->{suffix} . "/exec/varzea/sdp/sai-condition/" . $word;
+ }
+ else
+ {
+ $self->{ean} = '';
+ }
+
+ return 'http://www.amazon.' . $self->{suffix} . '/gp/search/?redirect=true&search-alias=videogames&keywords=' .$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url if $url;
+ return 'http://www.amazon.' . $self->{suffix};
+ }
+
+ sub getName
+ {
+ return 'Amazon';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'FR';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['ean', 'name'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm b/lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm
new file mode 100644
index 0000000..9403652
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCgames/GCgamesCommon.pm
@@ -0,0 +1,87 @@
+package GCPlugins::GCgames::GCgamesCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+our $MAX_ACTORS = 6;
+our $MAX_DIRECTORS = 4;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCgames::GCgamesPluginsBase;
+
+ use base qw(GCPluginParser);
+ use HTML::Entities;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['name'];
+ }
+
+ sub getTipsUrl
+ {
+ my $self = shift;
+
+ return '';
+ }
+
+ sub getTips
+ {
+ my $self = shift;
+ my $url = $self->getTipsUrl;
+ if ($url)
+ {
+ $self->{parsingTips} = 1;
+ my $html = $self->loadPage($url, 0, 1);
+ $html = $self->preProcess($html);
+ decode_entities($html);
+ $self->{inside} = undef;
+ $self->parse($html);
+ $self->{parsingTips} = 0;
+ }
+ }
+
+ sub getItemInfo
+ {
+ my $self = shift;
+
+ $self->SUPER::getItemInfo;
+ $self->getTips;
+
+ return $self->{curInfo};
+ }
+
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm b/lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm
new file mode 100644
index 0000000..c6e0c87
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCDiscogs.pm
@@ -0,0 +1,333 @@
+package GCPlugins::GCmusics::GCDiscogs;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCmusics::GCmusicsCommon;
+
+{
+ package GCPlugins::GCmusics::GCPluginDiscogs;
+
+ use base 'GCPlugins::GCmusics::GCmusicsPluginsBase';
+ use XML::Simple;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if $page =~ /^<!DOCTYPE html/;
+ my $xml;
+ my $xs = XML::Simple->new;
+ my $key = $self->{searchField};
+ if ($self->{parsingList})
+ {
+ if ( $key eq 'artist' )
+ {
+ $xml = $xs->XMLin($page);
+ my $artist = $xml -> {'artist'} -> {'name'};
+ my $release;
+ foreach $release ( keys( %{ $xml -> {'artist'} -> {'releases'} -> {'release'} } ) )
+ {
+ $self->{itemIdx}++;
+ my $title = $xml -> {'artist'} -> {'releases'} -> {'release'} -> {$release} -> {'title'};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://api.discogs.com/release/".$release."?f=xml&api_key=e8f5ae8ba2";
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $title;
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{title} =~ s/^\s+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = $artist;
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{artist} =~ s/\s+$//;
+ }
+ }
+ elsif ( $key eq 'label' )
+ {
+ $xml = $xs->XMLin($page);
+ my $release;
+ foreach $release ( keys( %{ $xml -> {'label'} -> {'releases'} -> {'release'} } ) )
+ {
+ $self->{itemIdx}++;
+ my $title = $xml -> {'label'} -> {'releases'} -> {'release'} -> {$release} -> {'title'};
+ my $artist = $xml -> {'label'} -> {'releases'} -> {'release'} -> {$release} -> {'artist'};
+ $self->{itemsList}[$self->{itemIdx}]->{url} = "http://api.discogs.com/release/".$release."?f=xml&api_key=e8f5ae8ba2";
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $title;
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{title} =~ s/^\s+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = $artist;
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{artist} =~ s/\s+$//;
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['result', 'event'],
+ KeyAttr => {'release' => ''});
+ my $release;
+ foreach $release ( @{ $xml->{'searchresults'}->{result} } )
+ {
+ if ($release->{type} eq 'release')
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = $release->{uri};
+ $self->{itemsList}[$self->{itemIdx}]->{release} = $release->{summary};
+
+ my $found = index($release->{title},"-");
+ if ( $found >= 0 )
+ {
+
+ $self->{itemsList}[$self->{itemIdx}]->{title} = substr($release->{title}, $found +length('-'),length($release->{title})- $found -length('-'));
+ # Enleve les blancs en debut de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{title} =~ s/^\s+//;
+
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = substr($release->{title}, 0, $found);
+ # Enleve les blancs en fin de chaine
+ $self->{itemsList}[$self->{itemIdx}]->{artist} =~ s/\s+$//;
+
+ # Clean up release summary
+ my $tmpTitle = $release->{title};
+ $tmpTitle =~ s/\- //;
+
+ # Unsure about this line, seems to not be required anymore, and is breaking parsing
+ # of search results. EG - searching for "raw animals"
+ # $self->{itemsList}[$self->{itemIdx}]->{release} =~ s/^$tmpTitle //;
+ }
+ else
+ {
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $release->{title};
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['track', 'artist', 'image', 'label', 'genre', 'format'],
+ KeyAttr => {'track' => ''});
+ $self->{curInfo}->{title} = $xml->{release}->{title};
+ $self->{curInfo}->{artist} = '';
+ for my $art (@{$xml->{release}->{artists}->{artist}})
+ {
+ $self->{curInfo}->{artist} .= $art->{name}.', ';
+ }
+ $self->{curInfo}->{artist} =~ s/, $//;
+ $self->{curInfo}->{producer} = '';
+ $self->{curInfo}->{composer} = '';
+ for my $rel (@{$xml->{release}->{extraartists}->{artist}})
+ {
+ $self->{curInfo}->{producer} .= $rel->{name}.', '
+ if $rel->{role} eq 'Producer';
+ $self->{curInfo}->{composer} .= $rel->{name}.', '
+ if (($rel->{role} eq 'Composed By') || ($rel->{role} eq 'Score') || ($rel->{role} eq 'Songwriter') || ($rel->{role} eq 'Written-By'));
+ }
+ $self->{curInfo}->{producer} =~ s/, $//;
+ $self->{curInfo}->{composer} =~ s/, $//;
+ $self->{curInfo}->{release} = $xml->{release}->{released};
+ for my $track(@{$xml->{release}->{'tracklist'}->{track}})
+ {
+ my $duree = $track->{duration};
+ $duree =~ /([0-9]+):([0-9]+)/;
+ my $duree2 = int($1*60 + $2);
+ my $position = "";
+ # Sometimes the position is missing, which causes it to be an array
+ if (!ref($track->{position}))
+ {
+ $position = $track->{position};
+ }
+ $self->addTrack($track->{title}, $duree2, $position);
+ }
+ $self->{curInfo}->{tracks} = $self->getTracks;
+ $self->{curInfo}->{running} = $self->getTotalTime;
+ for my $cover(@{$xml->{release}->{images}->{image}})
+ {
+ if ($self->{curInfo}->{cover} eq '')
+ {
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = $cover->{uri};
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = $cover->{uri};
+ # Change to small res cover
+ $self->{curInfo}->{cover} =~ s/image\/R-/image\/R-150-/;
+ }
+ }
+
+ }
+ $self->{curInfo}->{label} = '';
+ for my $label (@{$xml->{release}->{labels}->{label}})
+ {
+ $self->{curInfo}->{label} .= $label->{name}.', ';
+ }
+ $self->{curInfo}->{label} =~ s/, $//;
+ $self->{curInfo}->{genre} = '';
+ for my $genre (@{$xml->{release}->{genres}->{genre}})
+ {
+ $self->{curInfo}->{genre} .= $genre.',';
+ }
+ $self->{curInfo}->{genre} =~ s/,$//;
+ $self->{curInfo}->{origin} = $xml->{release}->{country};
+ $self->{curInfo}->{origin} =~ s/,$//;
+ for my $format(@{$xml->{release}->{formats}->{format}})
+ {
+ if ( $self->{curInfo}->{format} eq '')
+ {
+ $self->{curInfo}->{format} = $format->{name};
+ $self->{curInfo}->{format} =~ s/,$//;
+ }
+ }
+ $self->{curInfo}->{web} = 'http://www.discogs.com/release/' . $xml->{release}->{id};
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ release => 1
+ };
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $key = $self->{searchField};
+ my $url;
+ if ( $key eq 'title' )
+ {
+ $url = "http://api.discogs.com/search?type=all&q=". $word ."&f=xml&api_key=e8f5ae8ba2";
+ }
+ elsif ( $key eq 'artist' )
+ {
+ $url = "http://api.discogs.com/". $key ."/". $word ."?f=xml&api_key=e8f5ae8ba2";
+ }
+ elsif ( $key eq 'label' )
+ {
+ $url = "http://api.discogs.com/". $key ."/". $word ."?f=xml&api_key=e8f5ae8ba2";
+ }
+
+ return $url;
+# return "http://api.discogs.com/search?type=all&q=". $word ."&f=xml&api_key=e8f5ae8ba2";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ if (!$url)
+ {
+ # If we're not passed a url, return a hint so that gcstar knows what type
+ # of addresses this plugin handles
+ $url = "http://www.discogs.com";
+ }
+ elsif (index($url,"api_key") < 0)
+ {
+ # Url isn't for the discogs api, so we need to find the release id
+ # and return a url corresponding to the api page for this release
+ $url =~ /release\/([0-9]+)/;
+ my $id = $1;
+ $url = "http://api.discogs.com/release/". $id ."?f=xml&api_key=e8f5ae8ba2";
+ }
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $self->getItemUrl($url);
+ }
+
+ sub getName
+ {
+ return 'Discogs';
+ }
+
+ sub getAuthor
+ {
+ return 'TPF';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title', 'artist', 'label'];
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm b/lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm
new file mode 100644
index 0000000..b2d7873
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCDoubanmusic.pm
@@ -0,0 +1,238 @@
+package GCPlugins::GCmusics::GCDoubanmusic;
+
+###################################################
+#
+# Copyright 2005-2010 Bai Wensimi
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCmusics::GCmusicsCommon;
+
+{
+ package GCPlugins::GCmusics::GCPluginDoubanmusic;
+
+ use base qw(GCPlugins::GCmusics::GCmusicsPluginsBase);
+ use XML::Simple;
+ use Encode;
+ use LWP::Simple qw($ua);
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ return if (($page =~ /^bad isbn/) & ($page =~ /^The/));
+ my $xml;
+ my $xs = XML::Simple->new;
+
+ if ($self->{parsingList})
+ {
+ if ($page =~ /feed>$/)
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ foreach my $ItemMusic ( @{$xml->{'entry'}}){
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $ItemMusic->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $ItemMusic->{'title'};
+ foreach my $tmp_author (@{$ItemMusic->{'author'}}){
+ {($self->{itemsList}[ $self->{itemIdx} ]->{'artist'} ne '' ) and $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=',';}
+ $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=$tmp_author->{'name'};
+ }
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin(
+ $page,
+ forceArray=>['author'],
+ KeyAttr => ['']
+ );
+ $self->{itemIdx}++;
+ $self->{itemsList}[ $self->{itemIdx} ]->{'url'} = $xml->{'id'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'title'} = $xml->{'title'};
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=$tmp_author->{'name'};
+ $self->{itemsList}[ $self->{itemIdx} ]->{'artist'}.=',';
+ }
+ }
+ }
+ else
+ {
+ $xml =$xs->XMLin($page,
+ ForceArray => [ 'author' ],
+ KeyAttr => {'db:tag'=>'name','link'=>'rel'});
+ foreach my $tmp_author (@{$xml->{'author'}}){
+ {($self->{curInfo}->{artist} ne '' ) and $self->{curInfo}->{artist}.=','; }
+ $self->{curInfo}->{artist}.=$tmp_author->{'name'};
+ }
+ $self->{curInfo}->{title}=$xml->{'title'};
+ $self->{curInfo}->{web}=$xml->{'link'}->{'alternate'}->{'href'};
+ foreach my $check(@{$xml->{'db:attribute'}}){
+ my $db_attr=$check->{'name'};
+ SWITCH: {
+ $db_attr eq 'publisher' and $self->{curInfo}->{producer}=$check->{'content'} ,last;
+ $db_attr eq 'pubdate' and $self->{curInfo}->{release}=$check->{'content'} ,last;
+ $db_attr eq 'ean' and $self->{curInfo}->{unique}=$check->{'content'} ,last;
+ $db_attr eq 'media' and $self->{curInfo}->{format}=$check->{'content'} ,last;
+ if ($db_attr eq 'tracks') { my @chains = split(/(?=\d+\.)/, $check->{'content'});
+ foreach my $track ( @chains ){
+ my $num=$track;my $name=$track;
+ $num=~ s/(^\d+).*/$1/;
+ $num=~ s/\n//g;
+ $name =~ s/^\d+\.(.*)/$1/;
+ $name=~s/\n//g;
+ $num=encode("utf8",$num);
+ $name=encode("utf8",$name);
+ $self->addTrack($name,0,$num);
+ }
+ last SWITCH;}
+ ;
+ }
+ }
+ $self->{curInfo}->{tracks} = $self->getTracks;
+ my $tmp_image=$xml->{'link'}->{'image'}->{'href'};
+ $tmp_image =~ s/spic/lpic/;
+ $self->{curInfo}->{cover}=$tmp_image;
+ }
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ publication => 0,
+ };
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://api.douban.com/music/subjects?q=" .$word;
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url;
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ # Make sure the url is for the api, not the main movie page
+ return $self->getItemUrl($url);
+ }
+
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ sub getName
+ {
+ return "豆瓣";
+ }
+
+
+ sub testURL
+ {
+ my ($self, $url) = @_;
+ $url =~ /[\?&]lid=([0-9]+)*/;
+ my $id = $1;
+ return ($id == $self->siteLanguageCode());
+ }
+
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ };
+ }
+
+ sub getAuthor
+ {
+ return 'BW';
+ }
+
+ sub getLang
+ {
+ return 'ZH';
+ }
+
+ sub isPreferred
+ {
+ return 1;
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "UTF-8";
+ }
+ sub getSearchFieldsArray
+ {
+ return ['isbn', 'title'];
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub siteLanguage
+ {
+ my $self = shift;
+
+ return 'ZH';
+ }
+
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm b/lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm
new file mode 100644
index 0000000..f91027f
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCMusicBrainz.pm
@@ -0,0 +1,309 @@
+package GCPlugins::GCmusics::GCMusicBrainz;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCmusics::GCmusicsCommon;
+
+{
+ package GCPlugins::GCmusics::GCPluginMusicBrainz;
+
+ use base 'GCPlugins::GCmusics::GCmusicsPluginsBase';
+ use XML::Simple;
+ use Locale::Country;
+
+ sub parse
+ {
+ my ($self, $page) = @_;
+ my $xml;
+ my $xs = XML::Simple->new;
+ if ($self->{parsingList})
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['release', 'event'],
+ KeyAttr => {'release' => ''});
+ my $release;
+ foreach $release ( @{ $xml->{'release-list'}->{release} } )
+ {
+ $self->{itemIdx}++;
+ $self->{itemsList}[$self->{itemIdx}]->{url} = 'http://musicbrainz.org/album/'.$release->{id}.'.html';
+ $self->{itemsList}[$self->{itemIdx}]->{title} = $release->{title};
+ $self->{itemsList}[$self->{itemIdx}]->{artist} = $release->{artist}->{name};
+
+ my $releaseDate='9999-12-31';
+ for my $releaseEvent (@{$release->{'release-event-list'}->{event}})
+ {
+ if ($releaseEvent->{date} lt $releaseDate)
+ {
+ # Find the earliest release event
+ $releaseDate = $releaseEvent->{date};
+ }
+ }
+
+ $self->{itemsList}[$self->{itemIdx}]->{release} = $releaseDate
+ if $releaseDate ne '9999-12-31';
+ }
+ }
+ else
+ {
+ $xml = $xs->XMLin($page,
+ ForceArray => ['track', 'event', 'relation', 'relation-list','tag'],
+ KeyAttr => {'track' => ''});
+ $self->{curInfo}->{title} = $xml->{release}->{title};
+ $self->{curInfo}->{web} = 'http://musicbrainz.org/release/'.$xml->{release}->{id}.'.html';
+ $self->{curInfo}->{artist} = $xml->{release}->{artist}->{name};
+ $self->{curInfo}->{ratingpress} = int($xml->{release}->{rating}->{content}) * 2;
+ $self->{curInfo}->{producer} = '';
+ $self->{curInfo}->{composer} = '';
+
+ # Step through the relations
+ for my $relation (@{$xml->{release}->{'relation-list'}})
+ {
+ if ($relation->{'target-type'} eq 'Artist')
+ {
+ # Artist type relations
+ for my $rel (@{$relation->{relation}})
+ {
+ # Search for producer or composer relations
+ $self->{curInfo}->{producer} .= $rel->{artist}->{name}.', '
+ if $rel->{type} eq 'Producer';
+ $self->{curInfo}->{composer} .= $rel->{artist}->{name}.', '
+ if $rel->{type} eq 'Composer';
+ }
+ }
+ elsif ($relation->{'target-type'} eq 'Url')
+ {
+ # Look for url type relations. Currently only jamendo works, but we should also cover the archive.org
+ # relations
+ for my $rel (@{$relation->{relation}})
+ {
+ # Alternate cover art sites
+ if (($rel->{target} =~ m/jamendo.com/) && (!$self->{curInfo}->{cover}))
+ {
+ # Cover art should be on jamendo
+ $rel->{target} =~ /\/([0-9]+)$/;
+ my $id = $1;
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = "http://img.jamendo.com/albums/$id/covers/1.0.jpg";
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = "http://img.jamendo.com/albums/$id/covers/1.200.jpg";
+ }
+ }
+ }
+ }
+ }
+
+ $self->{curInfo}->{producer} =~ s/, $//;
+ $self->{curInfo}->{composer} =~ s/, $//;
+
+ my $releaseDate;
+ my $releaseLabel;
+ my $releaseCountry;
+ my $releaseFormat;
+ my $releaseDateFromCompare='9999-12-12';
+ for my $releaseEvent (@{$xml->{release}->{'release-event-list'}->{event}})
+ {
+ my $releaseDateToCompare;
+ # Check if musicbrainz only has the year, if so, set things up so we'll prefer
+ # releases with the month & day over year-only releases
+ if (length($releaseEvent->{date}) == 4)
+ {
+ $releaseDateToCompare = $releaseEvent->{date}."-12-31";
+ }
+ else
+ {
+ $releaseDateToCompare = $releaseEvent->{date};
+ }
+
+ if (($releaseDateToCompare lt $releaseDateFromCompare) ||
+ (($releaseDateToCompare eq $releaseDateFromCompare) &&
+ (($releaseEvent->{country} eq 'US') || ($releaseEvent->{country} eq 'GB'))))
+ {
+ # Find the earliest release event, which has a month & day
+ # Big call, but we're probably more correct choosing a US or UK release if there's two
+ # release events with the same date, so prioritise them
+ $releaseDate = $releaseEvent->{date};
+ $releaseLabel = $releaseEvent->{label}->{name}
+ if $releaseEvent->{label};
+ $releaseCountry = code2country($releaseEvent->{country});
+ $releaseFormat = $releaseEvent->{format};
+ $releaseDateFromCompare = $releaseDateToCompare;
+ }
+ }
+
+ $self->{curInfo}->{release} = $releaseDate;
+ $self->{curInfo}->{label} = $releaseLabel;
+ $self->{curInfo}->{origin} = $releaseCountry;
+ $self->{curInfo}->{format} = $releaseFormat;
+
+ for my $track(@{$xml->{release}->{'track-list'}->{track}})
+ {
+ $self->addTrack($track->{title}, $track->{duration} / 1000);
+ }
+ $self->{curInfo}->{tracks} = $self->getTracks;
+ $self->{curInfo}->{running} = $self->getTotalTime;
+
+ for my $genre(@{$xml->{release}->{'tag-list'}->{tag}})
+ {
+ # Capitalize first letter of each word
+ $genre->{content} =~ s/\b(\w+)\b/ucfirst($1)/ge;
+ # Only add genres if they have more then 1 vote, strips out a lot of
+ # weird/wrong tags
+ push @{$self->{curInfo}->{genre}}, [$genre->{content}]
+ if ($genre->{count} > 1);
+ }
+
+ # If amazon artwork exists, use it
+ if (($xml->{release}->{asin}) && (!$self->{curInfo}->{cover}))
+ {
+ if ($self->{bigPics})
+ {
+ $self->{curInfo}->{cover} = 'http://images.amazon.com/images/P/'.$xml->{release}->{asin}.'.01.LZZZZZZZ.jpg'
+ }
+ else
+ {
+ $self->{curInfo}->{cover} = 'http://images.amazon.com/images/P/'.$xml->{release}->{asin}.'.01.MZZZZZZZ.jpg'
+ }
+ }
+ }
+ }
+
+ sub convertDate
+ {
+ my ($self, $date) = @_;
+ $date =~ /([0-9]{4})-?([0-9]{2})?-?([0-9]{2})?/;
+ return $3 .($3 ? '/' : '').$2.($2 ? '/' : '').$1;
+ }
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{hasField} = {
+ title => 1,
+ artist => 1,
+ release => 1,
+ tracks => 1
+ };
+
+ return $self;
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ return $html;
+ }
+
+ sub decodeEntitiesWanted
+ {
+ return 0;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+
+ my $key = ($self->{searchField} eq 'artist') ? 'artist' : 'title';
+ return "http://musicbrainz.org/ws/1/release/?type=xml&$key=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return "http://musicbrainz.org/";
+ }
+
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+ $url =~ s|http://musicbrainz.org/album/(.*?)\.html|http://musicbrainz.org/ws/1/release/$1?type=xml&inc=artist+tracks+release-events+artist-rels+url-rels+ratings+labels+tags|;
+ $url =~ s|http://musicbrainz.org/release/(.*?)\.html|http://musicbrainz.org/ws/1/release/$1?type=xml&inc=artist+tracks+release-events+artist-rels+url-rels+ratings+labels+tags|;
+ return $url;
+ }
+
+ sub getName
+ {
+ return 'MusicBrainz';
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub getLang
+ {
+ return 'EN';
+ }
+
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "UTF-8";
+ }
+
+ sub getSearchCharset
+ {
+ my $self = shift;
+
+ # Need urls to be double character encoded
+ return "utf8";
+ }
+
+ sub convertCharset
+ {
+ my ($self, $value) = @_;
+ return $value;
+ }
+
+ sub getNotConverted
+ {
+ my $self = shift;
+ return [];
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title', 'artist'];
+ }
+
+ sub isPreferred
+ {
+ # Return status of 2 means plugin is default regardless of user's language
+ return 2;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm b/lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm
new file mode 100644
index 0000000..186662c
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCmusics/GCmusicsCommon.pm
@@ -0,0 +1,62 @@
+package GCPlugins::GCmusics::GCmusicsCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+use GCExtract::GCExtractMusics;
+
+{
+ package GCPlugins::GCmusics::GCmusicsPluginsBase;
+
+ use base ('GCPluginParser', 'GCExtract::GCmusicsExtracter');
+ #use base ('GCPluginParser');
+ use HTML::Entities;
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub getSearchFieldsArray
+ {
+ return ['title'];
+ }
+
+ sub loadUrl
+ {
+ my ($self, $url) = @_;
+
+ $self->resetTracks;
+ $self->SUPER::loadUrl($url);
+ return $self->{curInfo};
+ }
+
+}
+
+1; \ No newline at end of file
diff --git a/lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm b/lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm
new file mode 100644
index 0000000..a9ecd80
--- /dev/null
+++ b/lib/gcstar/GCPlugins/GCstar/GCAmazonCommon.pm
@@ -0,0 +1,132 @@
+package GCPlugins::GCstar::GCAmazonCommon;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCPlugins::GCPluginsBase;
+
+{
+ package GCPlugins::GCstar::GCPluginAmazonCommon;
+
+ sub text
+ {
+ my ($self, $origtext) = @_;
+ return 0 if ($self->{parsingEnded});
+
+ if ($self->{parsingList})
+ {
+ if (
+ (($self->{inside}->{b})
+ || ($self->{inside}->{span})
+ || ($self->{inside}->{label}))
+ )
+ {
+ my $suffix = $self->{suffix};
+ if ((($suffix =~ /^co/) && ($origtext =~ /Sort by/))
+ || (($suffix eq 'fr' ) && ($origtext =~ /Trier par/))
+ || (($suffix eq 'de' ) && ($origtext =~ /Sortieren nach/)))
+ {
+ $self->{beginParsing} = 1;
+ return 1;
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ sub extractImage
+ {
+ my ($self, $attr) = @_;
+ my $url = $attr->{src};
+ return 'http://images.amazon.com/images/'.$1.'/'.$2.$3.'MZZZZZZZ.'.$5
+ if ($url =~ m%^http://.*?images[.-]amazon\.com/images/(P)/([A-Z0-9]*)(\.[0-9]+\.)?[-A-Za-z0-9_.,]*?ZZZZZZZ(.*?)\.(jpg|gif)%);
+ return 'http://images.amazon.com/images/'.$1.'/'.$2.'.'.$3
+ if ($url =~ m%^http://.*?images[.-]amazon\.com/images/(I|G)/([-\%A-Z0-9a-z+]*)\._.*?_\.(jpg|gif)%);
+ if ($attr->{id} eq 'prodImage')
+ {
+ $url =~ s/_AA[0-9]*_//;
+ return $url;
+ }
+ return '';
+ }
+
+ sub isEAN
+ {
+ my ($self, $value) = @_;
+
+ my $l = length($value);
+ return 1
+ if ($l == 8)
+ || ($l == 13)
+ || ($l == 15)
+ || ($l == 18);
+ return 0;
+ }
+
+ sub isItemUrl
+ {
+ my ($self, $url) = @_;
+ return $1
+ if (($url =~ m|/dp/[A-Z0-9]*/sr=([0-3]-[0-9]*)/qid=[0-9]*|)
+ || ($url =~ m|/dp/[A-Z0-9]*/ref=(?:sr\|pd)_([a-z0-9_]*)/[0-9]*|)
+ || ($url =~ m|/dp/[A-Z0-9]*/ref=(?:sr\|pd)_([a-z0-9_]*)/[0-9]*|));
+ return undef;
+ }
+
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ return "http://www.amazon.".$self->{suffix}."/gp/search/?redirect=true&search-alias=".$self->{searchType}."&keywords=$word";
+ }
+
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ return $url if $url;
+ return 'http://www.amazon.'.$self->{suffix};
+ }
+
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+ if ($self->{parsingList})
+ {
+ $html =~ s|<span\s+class="srTitle">([^<]*)</span>|<srTitle>$1</srTitle>|gim;
+ $html =~ s|<td class="otherEditions">.*?</td>||gim;
+ }
+ else
+ {
+ $html =~ s|<a\s*href="/exec/obidos/ASIN/[0-9/\${}]*">([^<]*)</a>|$1|gim;
+ }
+ return $html;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCSplash.pm b/lib/gcstar/GCSplash.pm
new file mode 100644
index 0000000..27c0a27
--- /dev/null
+++ b/lib/gcstar/GCSplash.pm
@@ -0,0 +1,241 @@
+package GCSplash;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Gtk2;
+
+{
+ package GCSplashWindow;
+ use GCUtils;
+ use base "Gtk2::Window";
+
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+ bless ($self, $class);
+
+ $self->{parent} = shift;
+ $self->{version} = shift;
+
+ $self->{splashImage} = $self->{parent}->{logosDir}.'splash.png';
+
+ $self->set_decorated(0);
+ $self->set_resizable(0);
+ $self->set_transient_for($self->{parent});
+ $self->set_destroy_with_parent(1);
+ $self->set_modal(1);
+ $self->set_skip_taskbar_hint(1);
+
+ #$self->set_position('center-always');
+ $self->set_keep_above(1);
+
+ $self->{title} = new Gtk2::Label;
+ $self->{title}->set_markup('<span size="xx-large" weight="bold" color="#1c86ee">GCstar</span>');
+ $self->{label} = new Gtk2::Label('test');
+
+ $self->{vbox} = new Gtk2::VBox(0,0);
+
+ $self->{progress} = new Gtk2::ProgressBar;
+ $self->{progress}->set_size_request(240,-1);
+
+ my $color_fg = Gtk2::Gdk::Color->parse('#1c86ee');
+ my $color_progress_bg = Gtk2::Gdk::Color->parse('#ffffff');
+ my $color_progress_fg = Gtk2::Gdk::Color->parse('#1c86ee');
+ my $color_progress_text = Gtk2::Gdk::Color->parse('#cdad00');
+
+ $self->{label}->modify_fg('normal', $color_fg);
+ $self->{progress}->modify_bg('normal', $color_progress_bg);
+ $self->{progress}->modify_bg('active', $color_progress_fg);
+ $self->{progress}->modify_bg('prelight', $color_progress_fg);
+
+ my $eventbox = Gtk2::EventBox->new();
+ my $img = Gtk2::Image->new_from_pixmap (undef, undef);
+ my $inbox = new Gtk2::Fixed;
+ $eventbox->add($inbox);
+ $inbox->put($img,0,0);
+ $inbox->put($self->{title},0,110);
+ $inbox->put($self->{label},0,145);
+ $inbox->put($self->{progress},30,170);
+ $self->{vbox}->pack_start($eventbox,0,0,0);
+
+ $self->add($self->{vbox});
+ my $drawing_area = Gtk2::DrawingArea->new;
+ $self->{vbox}->pack_start($drawing_area,0,0,0);
+ $drawing_area->realize;
+
+ my ($pango_w, $pango_h) = (300,200);
+ my $pixmap = Gtk2::Gdk::Pixmap->new ($drawing_area->window,
+ $pango_w,
+ $pango_h,
+ -1);
+
+ my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{splashImage});
+ my ($pm, $m) = $pixbuf->render_pixmap_and_mask(255);
+ $img->set_from_pixmap($pm, $m);
+ $self->shape_combine_mask ($m, 0, 0) if $m;
+ $self->set_position('center');
+ $self->{vbox}->show_all;
+ $self->show;
+ $self->{title}->set_size_request(300,-1);
+ $self->{label}->set_size_request(300,-1);
+
+ return $self;
+ }
+
+ sub init
+ {
+ my $self = shift;
+
+ if ($self->{phase} == 0)
+ {
+ $self->setLabel($self->{parent}->{lang}->{SplashInit});
+ $self->{phase} = 1;
+ }
+ elsif ($self->{phase} == 1)
+ {
+ $self->setProgress(0.0);
+ $self->{parent}->init($self);
+ $self->setProgress(0.1);
+ $self->{phase} = 2;
+ $self->setLabel($self->{parent}->{lang}->{SplashLoad});
+ }
+ elsif ($self->{phase} == 2)
+ {
+ $self->{parent}->loadPrevious($self);
+ $self->setProgress(0.7);
+# $self->{parent}->setSensitive(1);
+ $self->{phase} = 3;
+ $self->setLabel($self->{parent}->{lang}->{SplashSort});
+ }
+ elsif ($self->{phase} == 3)
+ {
+ $self->{parent}->initEnd;
+ $self->setProgress(1.0);
+ $self->{parent}->setSensitive(1);
+ $self->{phase} = 4;
+ $self->setLabel($self->{parent}->{lang}->{SplashDone});
+ }
+ else
+ {
+ $self->hide;
+ $self->{parent}->{initializing} = 0;
+ Glib::Timeout->add(700 ,\&destroyMe, $self);
+ return 0;
+ }
+ Glib::Timeout->add(100 ,\&init, $self);
+
+ return 0;
+ }
+
+ sub setLabel
+ {
+ my ($self, $text) = @_;
+ #$text =~ s|^(.)|<span size="x-large" color="#cdad00">$1</span>|;
+ $self->{label}->set_markup('<b>'.$text.'</b>');
+ }
+
+ sub setItemsTotal
+ {
+ my ($self, $total) = @_;
+ $self->{step} = GCUtils::round($total / 7);
+ $self->{step} = 1 if $self->{step} < 1;
+ $self->{total} = $total;
+ }
+
+ sub setProgressForItemsLoad
+ {
+ my ($self, $current) = @_;
+ if (! $self->{total})
+ {
+ $self->{progress}->set_fraction(0.2);
+ }
+ else
+ {
+ return if ($current % $self->{step});
+ $self->setLabel($self->{parent}->{lang}->{SplashLoad}." <span color='#cdad00'>($current/".$self->{total}.')</span>');
+ $self->{progress}->set_fraction(0.1 + (($current / $self->{total}) * 0.3));
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsDisplay
+ {
+ my ($self, $current) = @_;
+ if (! $self->{total})
+ {
+ $self->{progress}->set_fraction(0.6);
+ }
+ else
+ {
+ return if ($current % $self->{step});
+ $self->setLabel($self->{parent}->{lang}->{SplashDisplay}." <span color='#cdad00'>($current/".$self->{total}.')</span>');
+ $self->{progress}->set_fraction(0.4 + (($current / $self->{total}) * 0.3));
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgressForItemsSort
+ {
+ my ($self, $current) = @_;
+ if (! $self->{total})
+ {
+ $self->{progress}->set_fraction(0.8);
+ }
+ else
+ {
+ return if ($current % $self->{step});
+ $self->setLabel($self->{parent}->{lang}->{SplashSort}." <span color='#cdad00'>($current/".$self->{total}.')</span>');
+ $self->{progress}->set_fraction(0.7 + (($current / $self->{total}) * 0.2));
+ }
+ GCUtils::updateUI;
+ }
+
+ sub setProgress
+ {
+ my ($self, $current) = @_;
+ $self->{progress}->set_fraction($current);
+ GCUtils::updateUI;
+ }
+
+ sub destroyMe
+ {
+ my $self = shift;
+
+ $self->destroy;
+ return 0;
+ }
+
+ sub show
+ {
+ my $self = shift;
+
+ $self->SUPER::show_all;
+ $self->{phase} = 0;
+ Glib::Timeout->add(10 ,\&init, $self);
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCStats.pm b/lib/gcstar/GCStats.pm
new file mode 100644
index 0000000..439c6d1
--- /dev/null
+++ b/lib/gcstar/GCStats.pm
@@ -0,0 +1,464 @@
+package GCStats;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+use utf8;
+use Gtk2;
+
+use strict;
+
+our $statisticsActivated;
+BEGIN {
+ $statisticsActivated = 1;
+ # Trick for depencies checker. Don't remove these commented lines.
+ #eval 'use GD';
+ #eval 'use GD::Graph::bars';
+ #eval 'use GD::Graph::pie';
+ #eval 'use GD::Graph::area';
+ #eval 'use GD::Text';
+ #eval 'use Date::Calc';
+ foreach my $module (qw/GD GD::Graph::bars GD::Graph::pie GD::Graph::area GD::Text Date::Calc/)
+ {
+ eval "use $module";
+ if ($@)
+ {
+ $statisticsActivated = 0;
+ last;
+ }
+ }
+}
+
+{
+ package GCStatsImageGenerator;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {parent => $parent};
+ bless ($self, $class);
+
+ GD::Text->font_path($ENV{GCS_SHARE_DIR}.'/fonts');
+
+ return $self;
+ }
+
+ sub setData
+ {
+ my ($self, $items, $sort, $type, $useNumbers) = @_;
+ my %stats;
+ foreach my $item(@$items)
+ {
+ if (ref($item) eq 'ARRAY')
+ {
+ $stats{$_}++ foreach (@$item);
+ }
+ else
+ {
+ $stats{$item}++;
+ }
+ }
+ my (@val1, @val2);
+ my @sortedKeys;
+ if ($sort)
+ {
+ @sortedKeys = sort {$stats{$a} <=> $stats{$b}} keys %stats;
+ }
+ else
+ {
+ # TODO This sort should be more complicated, depending on the type of field
+ @sortedKeys = sort {$a cmp $b} keys %stats;
+ }
+ my $val;
+ foreach my $key(@sortedKeys)
+ {
+ $val = $key;
+ $val .= ' ('.$stats{$key}.')' if $useNumbers;
+ push @val1, $val;
+ push @val2, $stats{$key};
+ }
+ $self->{data} = [\@val1, \@val2];
+ }
+
+ sub generate
+ {
+ my ($self, %options) = @_;
+ my $graph;
+
+ # Plot the graph twice as large as desired, so we can resample it down later, and eliminate
+ # the jagged lines caused by GD::Graph's lack of anti-aliasing
+ my $scaledWidth = $options{width} * 2;
+ my $scaledHeight = $options{height} * 2;
+ my $scaledFontSize = $options{fontSize} * 2;
+
+ if ($options{type} eq 'bars')
+ {
+ $graph = GD::Graph::bars->new($scaledWidth, $scaledHeight);
+ $graph->set(
+ x_labels_vertical => 1,
+ );
+ $graph->set_x_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_x_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_legend_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_values_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ }
+ elsif ($options{type} eq 'area')
+ {
+ $graph = GD::Graph::area->new($scaledWidth, $scaledHeight);
+ $graph->set(
+ x_labels_vertical => 1,
+ );
+ $graph->set_x_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_x_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_legend_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_values_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ }
+ elsif ($options{type} eq 'history')
+ {
+ $graph = GD::Graph::area->new($scaledWidth, $scaledHeight);
+ $graph->set_x_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_x_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_y_axis_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_legend_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_values_font('LiberationSans-Regular.ttf', $scaledFontSize);
+
+ # Modify data to accumulate
+ if ($options{accumulate})
+ {
+ my $prev = 0;
+ foreach (@{$self->{data}->[1]})
+ {
+ $_ += $prev;
+ $prev = $_;
+ }
+ }
+ # Transform dates into numbers of days
+ # Reference is the 1st one as they are ordered
+ # Or the 2nd one if there are items without value
+ my @refDate;
+ if ($self->{data}->[0]->[0])
+ {
+ @refDate = split m|/|, $self->{data}->[0]->[0];
+ }
+ else
+ {
+ @refDate = split m|/|, $self->{data}->[0]->[1];
+ # We consider items without value as being the day before
+ @refDate = Date::Calc::Add_Delta_Days(@refDate, -1);
+ $self->{data}->[0]->[0] = sprintf('%d/%02d/%02d', @refDate);
+ }
+ my $prev = -1;
+ my @newDates;
+ my $dateFormat = $self->{parent}->{options}->dateFormat;
+ foreach my $date(@{$self->{data}->[0]})
+ {
+ push @newDates, GCUtils::timeToStr(GCPreProcess::restoreDate($date), $dateFormat);
+ if (!$date)
+ {
+ $prev = 0;
+ next;
+ }
+ my @cmpDate = split m|/|, $date;
+ my $diff = Date::Calc::Delta_Days(@refDate, @cmpDate);
+ if ($diff > $prev + 1)
+ {
+ my @filler;
+ $#filler = $diff - $prev - 2;
+ if (!$options{accumulate})
+ {
+ @filler = map {''} @filler;
+ }
+ splice (@newDates, $prev + 1, 0, @filler);
+ splice (@{$self->{data}->[1]}, $prev + 1, 0, @filler);
+ }
+ $prev = $diff;
+ }
+ $self->{data}->[0] = \@newDates;
+ if (!$options{showAllDates})
+ {
+ for my $idx(0..$#newDates)
+ {
+ my @date = Date::Calc::Add_Delta_Days(@refDate, $idx);
+ my $value;
+ if ($date[2] == 1)
+ {
+ my $dateStr = sprintf('%d/%02d/%02d', @date);
+ $value = GCUtils::timeToStr(GCPreProcess::restoreDate($dateStr), $dateFormat);
+ }
+ else
+ {
+ if ($self->{data}->[1]->[$idx])
+ {
+ $value = '';
+ }
+ }
+ $self->{data}->[0]->[$idx] = $value;
+ }
+ }
+ $graph->set(
+ #x_label_skip => 5,
+ x_labels_vertical => 1,
+ show_values => 1,
+ );
+ }
+ else
+ {
+ $graph = GD::Graph::pie->new($scaledWidth, $scaledHeight);
+ $graph->set_value_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set_label_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set('3d' => ($options{type} eq '3dpie'));
+ }
+ $graph->set_title_font('LiberationSans-Regular.ttf', $scaledFontSize);
+ $graph->set(
+ title => $options{title},
+ show_values => $options{showValues},
+ transparent => 0,
+ bgclr => '#ffffff',
+ dclrs => ['#ffdf33', '#1c86ee', '#cdad00', '#6c7b8b', '#ffb618'],
+ cycle_clrs => 1,
+ t_margin => 20,
+ b_margin => 20,
+ l_margin => 20,
+ r_margin => 20,
+ text_space => 20,
+ );
+
+ my $gd = $graph->plot($self->{data});
+
+ # Now, resample the graph down to the desired size, effectively anti-aliasing the sharp edges
+ my $aaImage = GD::Image->new($options{width}, $options{height}, 1);
+ $aaImage->copyResampled($gd, 0, 0, 0, 0, $options{width}, $options{height}, $scaledWidth, $scaledHeight);
+
+ return $aaImage->png;
+ }
+}
+
+{
+ package GCStatsDialog;
+ use base "Gtk2::Dialog";
+
+ use GCUtils;
+ use GCDialogs;
+
+ sub new
+ {
+ my ($proto, $parent) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new($parent->{lang}->{MenuStatistics},
+ $parent,
+ [qw/destroy-with-parent/],
+ $parent->{lang}->{StatsGenerate} => 'apply',
+ 'gtk-save-as' => 'ok',
+ 'gtk-close' => 'close'
+ );
+ bless($self, $class);
+
+ $self->{parent} = $parent;
+ $self->{generator} = new GCStatsImageGenerator($parent);
+
+ $self->{choices} = [
+ {value => 'bars', displayed => $parent->{lang}->{StatsBars}},
+ {value => 'pie', displayed => $parent->{lang}->{StatsPie}},
+ {value => '3dpie', displayed => $parent->{lang}->{Stats3DPie}},
+ {value => 'area', displayed => $parent->{lang}->{StatsArea}},
+ {value => 'history', displayed => $parent->{lang}->{StatsHistory}},
+ ];
+ $self->{typeOption} = new GCMenuList($self->{choices}, 4);
+ $self->{typeOption}->setValue('3dpie');
+ my $typeLabel = new GCLabel($parent->{lang}->{StatsKindOfGraph});
+ $self->{fieldLabel} = new GCLabel($parent->{lang}->{StatsFieldToUse});
+ $self->{fieldOption} = new GCFieldSelector(0, undef, 1);
+ $self->{dateLabel} = new GCLabel($parent->{lang}->{StatsFieldDate});
+ $self->{dateOption} = new GCFieldSelector(0, undef, 1, 0, 0, 'date');
+ $self->{sortByNumberOption} = new GCCheckBox($parent->{lang}->{StatsSortByNumber});
+ $self->{sortByNumberOption}->setValue(0);
+ $self->{accumulateOption} = new GCCheckBox($parent->{lang}->{StatsAccumulate});
+ $self->{accumulateOption}->setValue(1);
+ $self->{useNumberOption} = new GCCheckBox($parent->{lang}->{StatsDisplayNumber});
+ $self->{useNumberOption}->setValue(0);
+
+ my $widthLabel = new GCLabel($parent->{lang}->{StatsWidth});
+ $self->{widthOption} = new GCCheckedText('0-9');
+ $self->{widthOption}->setValue(600);
+ my $heightLabel = new GCLabel($parent->{lang}->{StatsHeight});
+ $self->{heightOption} = new GCCheckedText('0-9');
+ $self->{heightOption}->setValue(600);
+ my $fontLabel = new GCLabel($parent->{lang}->{StatsFontSize});
+ $self->{fontOption} = new GCNumeric(12, 1, 100, 1);
+
+ $self->{typeOption}->signal_connect('changed' => sub {
+ $self->checkVisible;
+ });
+
+ my $table = new Gtk2::Table(3, 11, 0);
+ $table->set_row_spacings($GCUtils::margin);
+ $table->set_col_spacings($GCUtils::margin);
+ $table->set_border_width($GCUtils::halfMargin);
+
+ $table->attach($typeLabel, 0, 1, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{typeOption}, 1, 2, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($widthLabel, 3, 4, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{widthOption}, 4, 5, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($heightLabel, 6, 7, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{heightOption}, 7, 8, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($fontLabel, 9, 10, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{fontOption}, 10, 11, 0, 1, 'fill', 'fill', 0, 0);
+ $table->attach($self->{fieldLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{fieldOption}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{dateLabel}, 0, 1, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{dateOption}, 1, 2, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{sortByNumberOption}, 3, 5, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{accumulateOption}, 3, 5, 1, 2, 'fill', 'fill', 0, 0);
+ $table->attach($self->{useNumberOption}, 6, 8, 1, 2, 'fill', 'fill', 0, 0);
+
+ $self->{image} = Gtk2::Image->new;
+
+ $self->vbox->pack_start($self->{image},1,1,0);
+ $self->vbox->pack_start($table,0,0,0);
+
+ ($self->action_area->get_children)[1]->set_sensitive(0);
+
+ return $self;
+ }
+
+ sub checkVisible
+ {
+ my $self = shift;
+ my $val = $self->{typeOption}->getValue;
+ if ($val eq 'history')
+ {
+ $self->{fieldLabel}->hide;
+ $self->{fieldOption}->hide;
+ $self->{dateLabel}->show_all;
+ $self->{dateOption}->show_all;
+ $self->{sortByNumberOption}->hide;
+ $self->{accumulateOption}->show_all;
+ }
+ else
+ {
+ $self->{fieldLabel}->show_all;
+ $self->{fieldOption}->show_all;
+ $self->{dateLabel}->hide;
+ $self->{dateOption}->hide;
+ $self->{sortByNumberOption}->show_all;
+ $self->{accumulateOption}->hide;
+ }
+ }
+
+ sub setData
+ {
+ my ($self, $model, $data, $title) = @_;
+ $self->{model} = $model;
+ $self->{data} = $data;
+ $self->{title} = $title;
+ $self->{fieldOption}->setModel($model);
+ $self->{fieldOption}->setValue('genre');
+ $self->{dateOption}->setModel($model);
+ $self->{dateOption}->setValue('added');
+ }
+
+ sub show
+ {
+ my ($self) = @_;
+
+ #$self->generatePicture;
+ $self->SUPER::show();
+ $self->show_all;
+ $self->checkVisible;
+ $self->set_position('center');
+ my $response = 'cancel';
+ while (!(($response eq 'close') || ($response eq 'delete-event')))
+ {
+ $response = $self->run;
+ $self->generatePicture if $response eq 'apply';
+ $self->save if $response eq 'ok';
+ }
+ $self->hide;
+ }
+
+ sub generatePicture
+ {
+ my $self = shift;
+
+ my $graphType = $self->{typeOption}->getValue;
+ my $sortField = ($graphType eq 'history')
+ ? $self->{dateOption}->getValue
+ : $self->{fieldOption}->getValue;
+ my $sortByNumber = $self->{sortByNumberOption}->getValue;
+ my $accumulate = $self->{accumulateOption}->getValue;
+ my $useNumber = ($graphType =~ /pie/) && $self->{useNumberOption}->getValue;
+ my $showValues = ($graphType !~ /pie/) && $self->{useNumberOption}->getValue;
+ my $width = $self->{widthOption}->getValue;
+ my $height = $self->{heightOption}->getValue;
+ my $fontSize = $self->{fontOption}->getValue;
+
+ my $type = $self->{parent}->{model}->{fieldsInfo}->{$sortField}->{type};
+ my @valuesList;
+ if ($type eq 'date')
+ {
+ @valuesList = map {GCPreProcess::reverseDate($_->{$sortField})} @{$self->{data}};
+ }
+ else
+ {
+ @valuesList = map {$self->{parent}->transformValue($_->{$sortField}, $sortField, 1)} @{$self->{data}};
+ }
+ $self->{generator}->setData(\@valuesList, $sortByNumber, $type, $useNumber);
+ #$self->{generator}->setData($self->{data}, $sortField);
+ my $png = $self->{generator}->generate(type => $graphType,
+ showValues => $showValues,
+ accumulate => $accumulate,
+ title => $self->{title},
+ width => $width,
+ height => $height,
+ fontSize => $fontSize,
+ showAllDates => 0);
+
+ my $loader = Gtk2::Gdk::PixbufLoader->new;
+ $loader->write($png);
+ $loader->close;
+ $self->{pixbuf} = $loader->get_pixbuf;
+ $self->{image}->set_from_pixbuf($self->{pixbuf});
+ ($self->action_area->get_children)[1]->set_sensitive(1);
+ }
+
+ sub save
+ {
+ my $self = shift;
+ my $fileDialog = new GCFileChooserDialog($self->{parent}->{lang}->{StatsSave}, $self, 'save', 1);
+ $fileDialog->set_pattern_filter(['PNG (.png)', '*.png']);
+ $fileDialog->set_filename($self->{filename});
+ my $response = $fileDialog->run;
+ if ($response eq 'ok')
+ {
+ $self->{filename} = $fileDialog->get_filename;
+ $self->{pixbuf}->save($self->{filename}, 'png');
+ }
+ $fileDialog->destroy;
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCStyle.pm b/lib/gcstar/GCStyle.pm
new file mode 100644
index 0000000..f8cfb32
--- /dev/null
+++ b/lib/gcstar/GCStyle.pm
@@ -0,0 +1,67 @@
+{
+ package GCStyle;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+ use strict;
+
+ use base 'Exporter';
+ our @EXPORT = qw(%styles @lists $defaultList @readOnlyStyles);
+
+ use File::Basename;
+ use GCUtils 'glob';
+
+ our %styles;
+ our @lists;
+ our $defaultList;
+ our @readOnlyStyles;
+
+ sub initStyles
+ {
+ foreach (glob $ENV{GCS_SHARE_DIR}.'/style/*')
+ {
+ my $style = basename($_);
+ next if $style eq 'CVS';
+ my %tmpStyle;
+ $tmpStyle{dir} = $_;
+ $tmpStyle{rcFile} = $tmpStyle{dir}.'/gtkrc';
+ $tmpStyle{name} = $style;
+ $styles{$style} = \%tmpStyle;
+ }
+ foreach (glob $ENV{GCS_SHARE_DIR}.'/list_bg/*')
+ {
+ my $bg = basename($_);
+ next if $bg eq 'CVS';
+ push @lists, $bg;
+ }
+ foreach (glob $ENV{GCS_SHARE_DIR}.'/panels/*')
+ {
+ my $style = basename($_);
+ next if $style eq 'CVS';
+ push @readOnlyStyles, $style;
+ }
+ $defaultList = 'Wood';
+ }
+}
+
+1;
diff --git a/lib/gcstar/GCUpdater.pm b/lib/gcstar/GCUpdater.pm
new file mode 100644
index 0000000..6b3f537
--- /dev/null
+++ b/lib/gcstar/GCUpdater.pm
@@ -0,0 +1,174 @@
+package GCUpdater;
+
+###################################################
+#
+# Copyright 2005 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+use strict;
+
+use LWP;
+
+my $BASE_URL = 'http://www.gcstar.org/update/';
+my $INDEX_FILE = 'list.php';
+
+{
+ package GCRealUpdater;
+
+ use File::Basename;
+ use File::Path;
+
+ sub abort
+ {
+ my ($self, $msg) = @_;
+ print "$msg\n";
+ exit 1;
+ }
+
+ sub getNextFile
+ {
+ my $self = shift;
+
+ return $self->{filesList}->[$self->{next}];
+ }
+
+ sub createBrowser
+ {
+ my ($self, $proxy) = @_;
+
+ $self->{browser} = LWP::UserAgent->new;
+ $self->{browser}->proxy(['http'], $proxy) if $proxy;
+ }
+
+ sub checkFile
+ {
+ my ($self, $file) = @_;
+
+ return 1 if $self->{toBeUpdated}->{all};
+ foreach ('plugins', 'import', 'export', 'lang', 'models', 'extract')
+ {
+ return 1 if ($self->{toBeUpdated}->{$_}) && ($file =~ /$_/i);
+ }
+ return 0;
+ }
+
+ sub updateNext
+ {
+ my $self = shift;
+
+ my $file = $self->{filesList}->[$self->{next}];
+ print "Saving in ",$self->{baseInstallation}.$file,"\n";
+ mkpath(dirname($self->{baseInstallation}.$file));
+ my $response = $self->{browser}->get($self->{baseUrl}.$file, ':content_file' => $self->{baseInstallation}.$file);
+ if (!$response->is_success)
+ {
+ print $response->message, "\n";
+ #print $self->{lang}->{UpdateFileNotFound},"\n";
+ }
+ $self->{next}++;
+ }
+
+ sub getIndex
+ {
+ my $self = shift;
+ my $response = $self->{browser}->get($self->{baseUrl}.$INDEX_FILE, ':content_file' => $self->{baseInstallation}.$INDEX_FILE);
+ $self->abort($self->{lang}->{UpdateNone}) if !$response->is_success;
+ open INDEX, $self->{baseInstallation}.$INDEX_FILE;
+ $self->{filesList} = [];
+ while (<INDEX>)
+ {
+ chomp;
+ push @{$self->{filesList}}, $_
+ if $self->checkFile($_);
+ }
+ close INDEX;
+ $self->{total} = scalar @{$self->{filesList}};
+ }
+
+ sub total
+ {
+ my $self = shift;
+ $self->getIndex if ( !defined $self->{total});
+ return $self->{total};
+ }
+
+ sub new
+ {
+ my ($proto, $lang, $baseDir, $toBeUpdated, $version) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ lang => $lang,
+ baseUrl => $BASE_URL.$version.'/',
+ baseInstallation => $baseDir.'/',
+ toBeUpdated => $toBeUpdated
+ };
+ bless ($self, $class);
+ $self->abort($self->{lang}->{UpdateNoPermission}.$baseDir) if (! -w $baseDir);
+ $self->{next} = 0;
+ $self->{total} = undef;
+
+ return $self;
+ }
+}
+
+{
+ package GCTextUpdater;
+
+ sub new
+ {
+ my ($proto, $lang, $baseDir, $toBeUpdated, $noProxy, $version) = @_;
+ my $class = ref($proto) || $proto;
+ my $self = {
+ lang => $lang,
+ noProxy => $noProxy,
+ updater => GCRealUpdater->new($lang, $baseDir, $toBeUpdated, $version)
+ };
+ bless ($self, $class);
+ return $self;
+ }
+
+ sub update
+ {
+ my $self = shift;
+
+ my $proxy;
+ if (!$self->{noProxy})
+ {
+ print $self->{lang}->{UpdateUseProxy};
+ $proxy = <STDIN>;
+ chomp $proxy;
+ }
+
+ $self->{updater}->createBrowser($proxy);
+
+ my $count = $self->{updater}->total;
+ print $self->{lang}->{UpdateNone},"\n" if !$count;
+ for (my $i = 0; $i < $count; $i++)
+ {
+ print $i+1," / $count : ",$self->{updater}->getNextFile,"\n";
+ $self->{updater}->updateNext;
+ }
+ }
+}
+
+
+
+1;
diff --git a/lib/gcstar/GCUtils.pm b/lib/gcstar/GCUtils.pm
new file mode 100644
index 0000000..cc0e0d9
--- /dev/null
+++ b/lib/gcstar/GCUtils.pm
@@ -0,0 +1,640 @@
+package GCUtils;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use Exporter;
+use Cwd 'abs_path';
+use Gtk2;
+
+use base 'Exporter';
+our @EXPORT_OK = qw(glob);
+
+our $margin = 12;
+our $halfMargin = $margin / 2;
+our $quarterMargin = $margin / 4;
+
+sub updateUI
+{
+ my $loopCount = 0;
+ my $nbEvent = Gtk2->events_pending;
+ while ($nbEvent && ($loopCount < 30))
+ {
+ Gtk2->main_iteration;
+ $loopCount++;
+ $nbEvent = Gtk2->events_pending;
+ }
+}
+
+sub printStack
+{
+ my $number = shift;
+ $number ||= 1;
+ my ($package, $filename, $line, $subroutine) = caller(1);
+ my $output = "$package::$subroutine";
+ my $frame = 2;
+ while (($number + 1) >= $frame)
+ {
+ ($package, $filename, $line, $subroutine) = caller($frame);
+ $output .= " from $package::$subroutine";
+ $frame++;
+ }
+ print "$output\n";
+}
+
+sub dumpList
+{
+ my ($list, @fields) = @_;
+ my $i = 0;
+ foreach my $item(@$list)
+ {
+ print $i, ': ';
+ print $item->{$_}, ", " foreach (@fields);
+ print "\n";
+ $i++;
+ }
+}
+
+sub formatOpenSaveError
+{
+ my ($lang, $filename, $error) = @_;
+
+ my $errorText = (exists $lang->{$error->[0]})
+ ? $lang->{$error->[0]}
+ : $error->[0];
+ return "$filename\n\n$errorText".($error->[1] ? "\n\n".$error->[1] : '');
+}
+
+sub glob
+{
+ my ($pattern) = @_;
+ $pattern = '"'.$pattern.'"' if $pattern =~ /[^\\] /;
+ return glob "$pattern";
+}
+
+sub pathToUnix
+{
+ my ($path, $canonical) = @_;
+ $path =~ s|\\|/|g if ($^O =~ /win32/i);
+ $path = abs_path($path) if $canonical;
+ return $path;
+}
+
+sub sizeToHuman
+{
+ my ($size, $sizesSymbols) = @_;
+
+ #my @prefixes = ('', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y');
+ my $i = 0;
+ while ((($size / 1024) > 1) && ($i < scalar @$sizesSymbols))
+ {
+ $size /= 1024;
+ $i++;
+ }
+ return sprintf("%.1f %s%s", $size, $sizesSymbols->[$i]);
+}
+
+sub getSafeFileName
+{
+ my $file = shift;
+
+ $file =~ s/[^-a-zA-Z0-9_.]/_/g;
+ return $file;
+}
+
+sub boolToText
+{
+ my $value = shift;
+
+ return $value ? 'true' : 'false';
+}
+
+sub listNameToNumber
+{
+ my $value = shift;
+
+ return 1 if $value =~ /single/;
+ return 2 if $value =~ /double/;
+ return 3 if $value =~ /triple/;
+ return 4 if $value =~ /quadruple/;
+ return 0;
+}
+
+sub encodeEntities
+{
+ my $value = shift;
+ $value =~ s/&/&amp;/g;
+ $value =~ s/</&lt;/g;
+ $value =~ s/>/&gt;/g;
+ $value =~ s/"/&quot;/g;
+ #"
+ return $value;
+}
+
+sub compactHistories
+{
+ my $histories;
+ foreach (keys %$histories)
+ {
+ my %allKeys;
+ @allKeys{@{$histories->{$_}}} = ();
+ my @unique = keys %allKeys;
+ $histories->{$_} = \@unique;
+ }
+}
+
+use HTML::Entities;
+# Strips readable text from RTF formatted strings
+sub RtfToString
+{
+ my ($rtfString) = @_;
+
+ my $str = $rtfString;
+
+ # First, decode any symbols present
+ $str = decode_entities($str);
+ # Strip leading {
+ $str =~ s/^\{//;
+ # Strip out all the formatting within {}'s
+ $str =~ s/\{(.)*;\}//gs;
+ # Strip trailing }
+ $str =~ s/\}$//;
+ # Get the text from "\'d5" type tags
+ $str =~ s/\\(.)d\d/$1/g;
+ # Strip out all the remaining formatting
+ $str =~ s/\\(\H)*[\s]//g;
+ # And any newlines, since they'll be randomly placed now
+ $str =~ s/\n//g;
+
+ return $str;
+}
+
+
+{
+ package GCPreProcess;
+
+ use Text::Wrap;
+
+ sub singleList
+ {
+ my $value = shift;
+ if (ref($value) eq 'ARRAY')
+ {
+ my $string = '';
+ foreach (@{$value})
+ {
+ $string .= $_->[0].', ';
+ }
+ $string =~ s/ \(\)//g;
+ $string =~ s/, $//;
+ return $string;
+ }
+ else
+ {
+ $value =~ s/,*$//;
+ $value =~ s/,([^ ])/, $1/g;
+ return $value;
+ }
+ }
+
+ sub doubleList
+ {
+ my $value = shift;
+ if (ref($value) eq 'ARRAY')
+ {
+ my $string = '';
+ foreach (@{$value})
+ {
+ my $val0 = (exists $_->[0]) ? $_->[0] : '';
+ my $val1 = '';
+ $val1 = '('.$_->[1].')' if defined ($_->[1]);
+ $string .= "$val0 $val1, ";
+ }
+ $string =~ s/ \(\)//g;
+ $string =~ s/, $//;
+ return $string;
+ }
+ else
+ {
+ $value =~ s/;/,/g if $value !~ /,/;
+ $value =~ s/;(.*?)(,|$)/ ($1)$2/g;
+ $value =~ s/,([^ ])/, $1/g;
+ $value =~ s/ \(\)//g;
+ $value =~ s/(, ?)*$//;
+ return $value;
+ }
+ }
+
+ sub otherList
+ {
+ my $value = shift;
+ if (ref($value) eq 'ARRAY')
+ {
+ my $string = '';
+ foreach my $line(@{$value})
+ {
+ $string .= $_.'|' foreach (@{$line});
+ $string .= ', ';
+ }
+ $string =~ s/, $//;
+ return $string;
+ }
+ else
+ {
+ $value =~ s/,([^ ])/, $1/g;
+ $value =~ s/(, ?)*$//;
+ return $value;
+ }
+ }
+
+ sub multipleList
+ {
+ my ($value, $number) = @_;
+
+ $number = GCUtils::listNameToNumber($number) if $number !~ /^[0-9]+$/;
+
+ return singleList($value) if $number == 1;
+ return doubleList($value) if $number == 2;
+ #We only return the first column of each line in a string
+ return otherList($value);
+ }
+
+ sub multipleListToArray
+ {
+ my $value = shift;
+ my @result;
+ if (ref($value) eq 'ARRAY')
+ {
+ foreach (@{$value})
+ {
+ push @result, $_->[0];
+ }
+ }
+ else
+ {
+ @result = split /,\s*/, $value;
+ }
+ return \@result;
+ }
+
+ sub wrapText
+ {
+ my ($widget, $text) = @_;
+ my $width = $widget->allocation->width;
+ $width -= 30;
+ (my $oneline = $text) =~ s/\n/ /gm;
+ my $layout = $widget->create_pango_layout($oneline);
+ my (undef, $rect) = $layout->get_pixel_extents;
+ my $textWidth = $rect->{width};
+ my $lines = $textWidth / $width;
+ $lines = 1 if $lines <= 0;
+ my $columns = length($text) / $lines;
+ use integer;
+ $Text::Wrap::columns = $columns - 5;
+ $Text::Wrap::columns = 1 if $Text::Wrap::columns <= 0;
+ no integer;
+ $text = Text::Wrap::wrap('', '', $text);
+ return $text;
+ }
+
+ # Useful to compare date
+ sub reverseDate
+ {
+ (my $date = shift) =~ s|([0-9]{2})/([0-9]{2})/([0-9]{4})|$3/$2/$1|;
+ return $date;
+ }
+
+ sub restoreDate
+ {
+ (my $date = shift) =~ s|([0-9]{4})/([0-9]{2})/([0-9]{2})|$3/$2/$1|;
+ return $date;
+ }
+
+ sub extractYear
+ {
+ my $date = shift;
+
+ return 0 if $date !~ /[0-9]{4}/;
+ (my $year = $date) =~ s/.*?(([0-9]{4})).*?/$1/;
+
+ return $year;
+ }
+
+ sub noNullNumber
+ {
+ my $num = shift;
+ return 0 if ($num eq '') || (! defined($num));
+ return $num;
+ }
+}
+
+sub round
+{
+ my $number = shift;
+ return int($number + .5);
+}
+
+sub urlDecode
+{
+ my $text = shift;
+ $text =~ tr/+/ /;
+ $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ return $text;
+}
+
+sub scaleMaxPixbuf
+{
+ my ($pixbuf, $maxWidth, $maxHeight, $forceScale, $quick) = @_;
+
+ my $algorithm = $quick ? 'nearest' : 'bilinear';
+
+ if ($forceScale)
+ {
+ $pixbuf = $pixbuf->scale_simple($maxWidth, $maxHeight, $algorithm);
+ }
+ else
+ {
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ if (($height > $maxHeight) || ($width > $maxWidth))
+ {
+ my ($newWidth, $newHeight);
+ my $ratio = $height / $width;
+ if (($width) * ($maxHeight / $height) < $maxWidth)
+ {
+ $newHeight = $maxHeight;
+ $newWidth = $newHeight / $ratio;
+ }
+ else
+ {
+ $newWidth = $maxWidth;
+ $newHeight = $newWidth * $ratio;
+ }
+
+ $pixbuf = $pixbuf->scale_simple($newWidth, $newHeight, $algorithm);
+ }
+ }
+
+ return $pixbuf;
+}
+
+sub findPosition
+{
+ use locale;
+ my ($label, $menu) = @_;
+
+ my @children = $menu->get_children;
+ my $i = 0;
+ my $child;
+ foreach $child(@children)
+ {
+ return $i if (($i !=0) && ($child->child->get_label() gt $label));
+ $i++;
+ }
+ return $i;
+}
+
+sub inArray
+{
+ my $val = shift;
+
+ my $i = 0;
+ my $elem;
+ foreach $elem(@_)
+ {
+ if($val eq $elem)
+ {
+ return $i;
+ }
+ $i++;
+ }
+ return undef;
+}
+
+sub inArrayTest
+{
+ my $val = shift;
+ my $elem;
+ foreach $elem(@_)
+ {
+ return 1 if($val eq $elem);
+ }
+ return 0;
+}
+
+my $rc_style = Gtk2::RcStyle->new;
+
+sub setWidgetPixmap
+{
+ my ($widget, $imageFile) = @_;
+ $rc_style->bg_pixmap_name('normal', $imageFile);
+ $rc_style->bg_pixmap_name('insensitive', $imageFile);
+ $widget->modify_style($rc_style);
+
+# my $style = $widget->parent->get_style->copy;
+# $style->bg_pixmap('normal', $image);
+# $style->bg_pixmap('insensitive', $image);
+# $style->bg_pixmap('active', $image);
+# $style->bg_pixmap('prelight', $image);
+# $style->bg_pixmap('selected', $image);
+# $widget->parent->set_style($style);
+
+}
+
+use File::Basename;
+
+sub getDisplayedImage
+{
+ my ($displayedImage, $default, $file, $fileDir) = @_;
+
+ if (!File::Spec->file_name_is_absolute($displayedImage))
+ {
+ my $dir;
+ if ($file)
+ {
+ $dir = ($fileDir || dirname($file));
+ }
+ else
+ {
+ $dir = '.';
+ }
+ if (-f "$dir/$displayedImage")
+ {
+ $displayedImage = $dir.'/'.$displayedImage;
+ }
+ else
+ {
+ $displayedImage = $default unless (-e $displayedImage);
+ }
+ }
+ $displayedImage = $default if ! -f $displayedImage;
+
+ return GCUtils::pathToUnix($displayedImage);
+}
+
+use LWP::UserAgent;
+sub downloadFile
+{
+ my ($url, $dest, $settings) = @_;
+ my $browser = LWP::UserAgent->new;
+ $browser->proxy(['http'], $settings->{options}->proxy);
+ $browser->cookie_jar(HTTP::Cookies::Netscape->new(
+ 'file' => $settings->{options}->cookieJar));
+ $browser->agent($settings->{agent});
+ $browser->default_headers->referer($url);
+ $browser->get($url, ':content_file' => $dest);
+}
+
+use POSIX qw/strftime/;
+sub timeToStr
+{
+ my ($date, $format) = @_;
+ my @array=split("/", $date);
+ return $date if $#array != 2;
+ return strftime($format, 0, 0, 0, $array[0], $array[1]-1, $array[2]-1900);
+}
+
+sub TimePieceStrToTime
+{
+ my ($date, $format) = @_;
+ my $str;
+ eval {
+ my $t = Time::Piece->strptime($date, $format);
+ $str = sprintf('%02d/%02d/%4d', $t->mday, $t->mon, $t->year);
+ };
+ if ($@)
+ {
+ return $date;
+ }
+ return $str;
+}
+
+sub DateTimeFormatStrToTime
+{
+ my ($date, $format) = @_;
+ my $str;
+ eval {
+ my $dt = new DateTime::Format::Strptime(
+ pattern => $format,
+ locale => $ENV{LANG});
+ my $dt2 = $dt->parse_datetime($date);
+ $dt->pattern('%d/%m/%Y');
+ $str = $dt->format_datetime($dt2);
+ };
+ if ($@)
+ {
+ return $date;
+ }
+ return $str;
+}
+
+# Our custom natural sort function
+sub gccmp
+{
+ use locale;
+ my ($string1, $string2) = @_;
+
+ my $test1 = $string1;
+ my $test2 = $string2;
+
+ # Split strings into arrays by seperating strings from numbers
+ my $nb1 = ($test1 =~ s/(\d+)/\|$+\|/g);
+ my $nb2 = ($test2 =~ s/(\d+)/\|$+\|/g);
+
+ # If there are no numbers in the test strings, just directly compare
+ return $test1 cmp $test2
+ if ($nb1 == 0) || ($nb2 == 0);
+
+ my @test = split(/\|/,$test1);
+ my @test2 = split(/\|/,$test2);
+
+ # Compare each element in the strings
+ my $result = 0;
+ for (my $pass = 0; $pass < scalar @test; $pass++)
+ {
+ # Elements are the same, so keep searching
+ next if ($test[$pass] eq $test2[$pass]);
+
+ # If both elements are numbers, do a numerical compare
+ if (($test[$pass] =~ /\d+/) && ($test2[$pass] =~ /\d+/))
+ {
+ # Number test
+ $result = $test[$pass] <=> $test2[$pass];
+ }
+ else
+ {
+ # Test elements as strings
+ $result = lc($test[$pass]) cmp lc($test2[$pass]);
+ }
+ last;
+ }
+
+ return $result;
+}
+
+# Extended version of gccmp that also supports dates
+# Only useful for image mode as text mode handles that in a better way
+sub gccmpe
+{
+ my ($string1, $string2) = @_;
+
+ my $test1 = $string1;
+ my $test2 = $string2;
+
+ if (($test1 =~ m|([0-9]{2})/([0-9]{2})/([0-9]{4})|)
+ && ($test2 =~ m|([0-9]{2})/([0-9]{2})/([0-9]{4})|))
+ {
+ return (GCPreProcess::reverseDate($test1) cmp GCPreProcess::reverseDate($test2));
+ }
+ else
+ {
+ return gccmp($test1, $test2);
+ }
+}
+
+our $hasTimeConversion;
+BEGIN {
+ $hasTimeConversion = 1;
+ eval 'use DateTime::Format::Strptime qw/strptime/';
+ if (!$@)
+ {
+ *strToTime = \&DateTimeFormatStrToTime;
+ }
+ else
+ {
+ eval 'use Time::Piece';
+ if (!$@)
+ {
+ *strToTime = \&TimePieceStrToTime;
+ }
+ else
+ {
+ $hasTimeConversion = 0;
+ *strToTime = sub {return $_[0]};
+ *timeToStr = sub {return $_[0]};
+ }
+ }
+
+}
+
+
+1;
diff --git a/lib/gcstar/GCWidgets.pm b/lib/gcstar/GCWidgets.pm
new file mode 100644
index 0000000..f45c606
--- /dev/null
+++ b/lib/gcstar/GCWidgets.pm
@@ -0,0 +1,429 @@
+package GCWidgets;
+
+###################################################
+#
+# Copyright 2005-2010 Christian Jodar
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use utf8;
+use strict;
+
+{
+ package GCRatingWidget;
+ use Gtk2;
+ use POSIX;
+ use Gtk2::Gdk::Keysyms;
+
+
+ use Glib::Object::Subclass
+ Gtk2::DrawingArea::,
+ signals => {
+ changed => {
+ method => 'do_rating_changed',
+ flags => [qw/run-first/],
+ return_type => undef, # void return
+ param_types => [], # instance and data are automatic
+ },
+ button_press_event => \&on_click,
+ button_release_event => \&on_release,
+ motion_notify_event => \&on_move,
+ leave_notify_event => \&on_leave,
+ size_request => \&do_size_request,
+ expose_event => \&on_expose,
+ focus_in_event => \&on_focus,
+ key_press_event => \&on_keypress
+ },
+ properties => [
+ Glib::ParamSpec->int (
+ 'maxStars', # name
+ 'Max Stars', # nickname
+ 'Maximum number of stars to show', #blurb
+ 0, # min
+ 100, # max
+ 10, # default
+ [qw/readable writable/] #flags
+ ),
+ Glib::ParamSpec->int (
+ 'rating', # name
+ 'Rating', # nickname
+ 'Current rating', #blurb
+ 0, # min
+ 100, # max
+ 0, # default
+ [qw/readable writable/] #flags
+ ),
+ Glib::ParamSpec->string (
+ 'direction', # name
+ 'Direction', # nickname
+ 'Direction of stars', #blurb
+ 'LTR', # default
+ [qw/readable writable/] #flags
+ ),
+ ];
+
+ use constant {
+ BORDER_WIDTH => 0,
+ };
+
+
+ sub INIT_INSTANCE {
+ my $self = shift;
+ $self->{maxStars} = 10;
+ $self->{rating} = 0;
+ $self->{direction} = 'LTR';
+
+ # Load into some pixbufs the graphics for the stars
+ $self->{pixbuf} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/star.png');
+ $self->{pixbufDark} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/stardark.png');
+ $self->{pixbufHover} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/star_hover.png');
+ $self->{pixbufDarkHover} = Gtk2::Gdk::Pixbuf->new_from_file($ENV{GCS_SHARE_DIR}.'/icons/stardark_hover.png');
+
+ # Grab width and height of pixbuf
+ $self->{pixbufWidth} = $self->{pixbuf}->get_width;
+ $self->{pixbufHeight} = $self->{pixbuf}->get_height;
+
+ # Allow focus
+ $self->can_focus(1);
+
+ $self->{tooltips} = Gtk2::Tooltips->new();
+
+ $self->add_events(['exposure-mask',
+ 'visibility-notify-mask',
+ 'button-press-mask',
+ 'button-motion-mask',
+ 'button-release-mask',
+ 'pointer-motion-mask',
+ 'leave-notify-mask',
+ 'key-press-mask',
+ 'enter-notify-mask']);
+ }
+
+ sub GET_PROPERTY
+ {
+ my ($self, $pspec) = @_;
+
+ if ($pspec->get_name eq 'rating')
+ {
+ return $self->{rating};
+ }
+ }
+
+ sub do_size_request
+ {
+ # Let gtk know how large we want the control to be
+ my ($self, $requisition) = @_;
+
+ $requisition->width(($self->{pixbufWidth} * $self->{maxStars}) + (BORDER_WIDTH * 2));
+ $requisition->height($self->{pixbufHeight});
+
+ # chain up to the parent class.
+ shift->signal_chain_from_overridden(@_);
+ }
+
+ sub convert_color_to_string
+ {
+ # Convert a gdk::color to an rrggbbaa hex
+ my ($color, $alpha) = @_;
+ my $color_string;
+
+ $color_string = sprintf("%.2X", floor($color->red /256))
+ . sprintf("%.2X", floor($color->green/256))
+ . sprintf("%.2X", floor($color->blue /256))
+ . sprintf("%.2X", $alpha);
+
+ return $color_string;
+ }
+
+ sub draw_stars
+ {
+ # Draw the stars on the control
+ my ($self, $coloredStars, $glowingStars) = @_;
+
+ # Make sure we don't try to draw the control before the background has been saved
+ if ( $self->{blankPixbuf} )
+ {
+
+ my $targetPixbuf = $self->{blankPixbuf}->copy;
+ my $starPixbuf;
+
+ # For each star, determine which pixbuf to use
+
+ for(my $count = 0; $count < $self->{maxStars}; $count++)
+ {
+ if ($count < $glowingStars)
+ {
+ $starPixbuf = ($count < $coloredStars) ? $self->{pixbufHover}
+ : $self->{pixbufDarkHover};
+ }
+ else
+ {
+ $starPixbuf = ($count < $coloredStars) ? $self->{pixbuf}
+ : $self->{pixbufDark};
+ }
+
+ # Put the star in the proper place
+ if ($self->{direction} eq 'LTR')
+ {
+ # Left to Right
+ $starPixbuf->composite($targetPixbuf,
+ (($count * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ $self->{pixbufWidth} , $self->{pixbufHeight},
+ (($count * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ 1, 1,
+ 'nearest', 255);
+ }
+ else
+ {
+ # Right to Left
+ $starPixbuf->composite($targetPixbuf,
+ $self->allocation->width - ((($count + 1) * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ $self->{pixbufWidth} , $self->{pixbufHeight},
+ $self->allocation->width - ((($count + 1) * $self->{pixbufWidth}) + BORDER_WIDTH), 0,
+ 1, 1,
+ 'nearest', 255);
+ }
+ }
+
+ # Fill the drawable with our generated pixbuf of the stars
+ $self->realize;
+ my $windowgc = Gtk2::Gdk::GC->new($self->window);
+ $targetPixbuf->render_to_drawable($self->window,
+ $windowgc,
+ 0, 0, 0, 0,
+ $self->allocation->width,
+ $self->allocation->height,
+ 'normal', 0,0);
+ }
+ }
+
+ sub coordToNumberStars
+ {
+ # Translate an x-coordinate to how many stars it represents
+ my ($self, $x) = @_;
+
+ if ($self->{direction} ne 'LTR')
+ {
+ # Right to Left, easiest just to flip to coordinate over
+ $x = $self->allocation->width - $x;
+ }
+
+ if ($x < ($self->{pixbufWidth} / 3))
+ {
+ # We reserve the first 1/3 of a star to mean "no stars selected"
+ return 0;
+ }
+ else
+ {
+ my $value = ceil($x / $self->{pixbufWidth});
+ return ($value <= $self->{maxStars}) ? $value : $self->{maxStars};
+ }
+ }
+
+ sub on_expose
+ {
+ # Called when control is first drawn
+ my ($self, $event) = @_;
+
+ # Make a small (1x1) pixbuf of the empty control
+ $self->{blankPixbuf} = Gtk2::Gdk::Pixbuf->new('rgb', 1, 8,
+ 1,
+ 1);
+
+ # Now, grab the first tiny section of the empty region. We can't grab the whole
+ # thing, because it might not be visible, and it would get filled with random data
+ $self->{blankPixbuf}->get_from_drawable($self->window, $self->get_colormap(),
+ 0, 0, 0, 0,
+ 1,
+ 1);
+
+ # Now, resize this pixbuf to the full size of the control
+ $self->{blankPixbuf} = $self->{blankPixbuf}->scale_simple($self->allocation->width,
+ $self->allocation->height,
+ 'nearest');
+
+ # Draw the initial control
+ if ($self->has_focus)
+ {
+ # If control is initially focused, make sure we highlight selected stars
+ my $starsSelected;
+ $starsSelected = ($self->{rating} eq 0) ? 1
+ : $self->{rating};
+ $self->draw_stars($self->{rating}, $starsSelected);
+ }
+ else
+ {
+ $self->draw_stars($self->{rating}, 0);
+ }
+
+ return 0;
+ }
+
+ sub on_leave
+ {
+ # Called when mouse leaves the control, remove all highlighting
+ my ($self, $event) = @_;
+
+ if ($self->has_focus)
+ {
+ # If control is still focused, leave highlight on selected stars
+ my $starsSelected;
+ $starsSelected = ($self->{rating} eq 0) ? 1
+ : $self->{rating};
+ $self->draw_stars($self->{rating}, $starsSelected );
+ }
+ elsif ($event->mode() eq "normal")
+ {
+ # React to mouse leaving the control when control not focused, clear all highlights
+ $self->{starsGlowing} = 0;
+ $self->draw_stars($self->{rating}, 0);
+ }
+ }
+
+ sub on_click
+ {
+ # Called when mouse button pressed down, set rating
+ my ($self, $event) = @_;
+
+ my $starsSelected = $self->coordToNumberStars($event->x);
+
+ if ($starsSelected ne $self->{rating})
+ {
+ $self->{rating} = $starsSelected;
+ $self->{starsGlowing} = $starsSelected;
+ $self->draw_stars($self->{rating}, $self->{starsGlowing});
+ $self->signal_emit ("changed");
+ }
+
+ $self->grab_focus;
+ }
+
+ sub on_release
+ {
+ # Called when mouse button released, set rating
+ my ($self, $event) = @_;
+
+ my $starsSelected = $self->coordToNumberStars($event->x);
+
+ if ($starsSelected ne $self->{rating})
+ {
+ $self->{rating} = $starsSelected;
+ $self->{starsGlowing} = $starsSelected;
+ $self->draw_stars($self->{rating}, $self->{starsGlowing});
+ $self->signal_emit ("changed");
+ }
+ }
+
+ sub on_move
+ {
+ # Called when mouse moves on control, change star highlighting if needed
+ my ($self, $event) = @_;
+
+ my $starsSelected = $self->coordToNumberStars($event->x);
+
+ if ($starsSelected ne $self->{starsGlowing})
+ {
+ $self->{starsGlowing} = $starsSelected;
+ $self->draw_stars($self->{rating}, $self->{starsGlowing});
+ $self->createTooltip($self->{starsGlowing});
+ }
+ }
+
+ sub createTooltip
+ {
+ my ($self, $tipValue) = @_;
+
+ if ($self->{direction} eq 'LTR')
+ {
+ $self->{tooltips}->set_tip($self, $tipValue."/".$self->{maxStars});
+ }
+ else
+ {
+ # Hmmm - not sure if a / is the right symbol to use for rtl languages, perhaps it should be a \ ?
+ $self->{tooltips}->set_tip($self, $self->{maxStars}."/".$tipValue);
+ }
+ }
+
+ sub on_focus
+ {
+ # Called when control focused, change star highlighting
+ my ($self, $event) = @_;
+
+ if ($self->{rating} > 0)
+ {
+ $self->draw_stars($self->{rating}, $self->{rating});
+ }
+ else
+ {
+ # If no stars are filled in, we'll just highlight the first star to show control is focused
+ $self->draw_stars($self->{rating}, 1);
+ }
+
+ }
+
+ sub on_keypress
+ {
+ # Called when key pressed
+ my ($self, $event) = @_;
+
+ if ( ($event->keyval eq $Gtk2::Gdk::Keysyms{Right}) && ($self->{direction} eq 'LTR') ||
+ ($event->keyval eq $Gtk2::Gdk::Keysyms{Left}) && ($self->{direction} ne 'LTR') )
+ {
+ # Increase rating
+ $self->{rating}++ if $self->{rating} < $self->{maxStars};
+ $self->draw_stars($self->{rating}, $self->{rating});
+ $self->signal_emit ("changed");
+
+ # Cancel key propagation
+ return 1;
+ }
+ elsif ( ($event->keyval eq $Gtk2::Gdk::Keysyms{Left}) && ($self->{direction} eq 'LTR') ||
+ ($event->keyval eq $Gtk2::Gdk::Keysyms{Right}) && ($self->{direction} ne 'LTR') )
+ {
+ # Decrease rating
+ $self->{rating}-- if $self->{rating} > 0;
+ if ($self->{rating} > 0)
+ {
+ # If no stars are filled in, we'll just highlight the first star to show control is focused
+ $self->draw_stars($self->{rating}, $self->{rating});
+ }
+ else
+ {
+ $self->draw_stars($self->{rating}, 1);
+ }
+ $self->signal_emit ("changed");
+
+ # Cancel propagation
+ return 1;
+ }
+ }
+
+ sub set_rating
+ {
+ # Manual way of setting rating
+ my ($self, $rating) = @_;
+
+ $self->{rating} = $rating;
+ $self->draw_stars($self->{rating}, 0);
+ $self->signal_emit ('changed');
+ }
+}
+
+1;
+
diff --git a/man/gcstar.1 b/man/gcstar.1
new file mode 100644
index 0000000..bb0fa1b
--- /dev/null
+++ b/man/gcstar.1
@@ -0,0 +1,92 @@
+.TH GCSTAR 1 "17 August 2006" "GCstar" "Linux User's Manual"
+.SH NAME
+GCstar \- Personal collection manager
+.SH SYNOPSIS
+.B gcstar
+[\-u UPDATE-OPTIONS] [\-x EXECUTE-OPTIONS] [FILENAME]
+.SH DESCRIPTION
+.B GCstar
+is a Gtk2 program used to manage personal collections.
+.SH OPTIONS
+Without any option, it will open FILENAME if specified or the previously
+opened file. There are also two groups of options.
+
+.SS UPDATE-OPTIONS
+.TP
+.B "\-u, \-\-update"
+Tell GCstar to look for available updates
+.TP
+.B "\-a, \-\-all"
+Update all components
+.TP
+.B "\-c, \-\-collection"
+Update collection models
+.TP
+.B "\-w, \-\-website"
+Update plugins to download information
+.TP
+.B "\-i, \-\-import"
+Update plugins to import data
+.TP
+.B "\-e, \-\-export"
+Update plugins to export data
+.TP
+.B "\-l, \-\-lang"
+Update translations
+.TP
+.B "\-n, \-\-noproxy"
+Don't ask for a proxy
+.SS EXECUTE-OPTIONS
+.TP
+.B "\-x, \-\-execute"
+Enter non-interactive mode
+.TP
+.B "\-c, \-\-collection MODEL"
+Specify the collection type
+.TP
+.B "\-w, \-\-website PLUGIN"
+Specify the plugin to use to download information
+.TP
+.B "\-i, \-\-import PLUGIN"
+Specify the plugin to use to import a collection
+.TP
+.B "\-e, \-\-export PLUGIN"
+Specify the plugin to use to export the collection
+.TP
+.B "\-f, \-\-fields FILENAME"
+File containing fields list to use for import/export
+.TP
+.B "\-o, \-\-output FILENAME"
+Write output in FILENAME instead of standard output
+.TP
+.B "\-\-download TITLE"
+Search for the item with TITLE as name
+.TP
+.B "\-\-importprefs PREFERENCES"
+Preferences for the import plugin
+.TP
+.B "\-\-exportprefs PREFERENCES"
+Preferences for the export plugin
+.P
+.TP
+Preferences for import/export plugins are specified using this schema
+Key1=>Value1,Key2=>Value2
+.SH ENVIRONMENT
+.TP
+.B HOME
+Used to define following variables if needed
+.TP
+.B XDG_CONFIG_HOME
+Where configuration files should be stored. If not defined: $HOME/.config
+.TP
+.B XDG_DATA_HOME
+Where some data will be stored. If not defined: $HOME/.local/share
+.SH BUGS REPORTING
+To report bugs, please use this forum:
+.P
+http://forums.gcstar.org/viewforum.php?id=4
+.SH AUTHORS
+.TP
+Tian <tian@c-sait.net>
+.P
+http://www.gcstar.org/
diff --git a/packages/GCstar_Packaging_Policy.txt b/packages/GCstar_Packaging_Policy.txt
new file mode 100644
index 0000000..3e3ba41
--- /dev/null
+++ b/packages/GCstar_Packaging_Policy.txt
@@ -0,0 +1,33 @@
+****************************
+* GCstar PACKAGING POLICY *
+****************************
+
+-= 0. INTRODUCTION =-
+This file is intented to show distributors how we like GCstar to be included in distributions. This includes Description, Logo images, classification under menus, etc.
+
+-= 1. SHORT DESCRIPTION =-
+Manage your collections of movies, games, books, music and more
+
+-= 2. LONG DESCRIPTION =-
+GCstar is an application for managing your collections. It supports many types of collections, including movies, books, games, comics, stamps, coins, and many more. You can even create your own collection type for whatever unique thing it is that you collect! Detailed information on each item can be automatically retrieved from the internet and you can store additional data, such as the location or who you've lent it to. You may also search and filter your collections by many criteria.
+
+-= 3. LOGO ICON =-
+You can find icons under:
+PNG Version -> gcstar_src/share/gcstar/icons/gcstar_*.png (several sizes available)
+ICO Version -> gcstar_src/share/gcstar/icons/GCstar.ico
+
+-= 4. APPLICATIONS MENU CATEGORY =-
+Following freedesktop standards, GCstar should be located under the Office categories on menus.
+There's also the option to be under Databases, where there's no office section.
+
+FreeDesktop.org (GNOME/KDE/.desktop) -> Categories=Office;
+Debian (and related, debian/menu) -> section="Apps/Databases"
+
+
+
+-= ChangeLog =-
+
+2007-02-11 Christian Jodar <tian@gcstar.org>
+ * Adaptation to GCstar
+2005-08-27 19:21 Adolfo González Blázquez <agblazquez@telefonica.net>
+ * Initial release
diff --git a/packages/debian/changelog b/packages/debian/changelog
new file mode 100644
index 0000000..11e8c4d
--- /dev/null
+++ b/packages/debian/changelog
@@ -0,0 +1,5 @@
+gcstar (1.5.0-1ubuntu1) jaunty; urgency=low
+
+ * Initial release
+
+ -- Nyall <nyall@zombiepigs.net> Sun, 20 Sep 2009 10:27:40 -0300
diff --git a/packages/debian/compat b/packages/debian/compat
new file mode 100644
index 0000000..7f8f011
--- /dev/null
+++ b/packages/debian/compat
@@ -0,0 +1 @@
+7
diff --git a/packages/debian/control b/packages/debian/control
new file mode 100644
index 0000000..2085fb1
--- /dev/null
+++ b/packages/debian/control
@@ -0,0 +1,25 @@
+Source: gcstar
+Section: x11
+Priority: optional
+Maintainer: Alexander Wirt <formorer@debian.org>, Nyall <nyall@zombiepigs.net>
+Build-Depends-Indep: libgtk2-perl, libwww-perl, libxml-parser-perl, libxml-simple-perl, libmp3-tag-perl, libogg-vorbis-header-pureperl-perl
+Build-Depends: debhelper (>= 7), dpatch
+Standards-Version: 3.8.0
+Homepage: http://www.gcstar.org/
+
+Package: gcstar
+Architecture: all
+Depends: libgtk2-perl, libwww-perl, libarchive-tar-perl, libxml-simple-perl, libxml-parser-perl, libarchive-zip-perl, libmp3-tag-perl, libogg-vorbis-header-pureperl-perl, libgd-gd2-perl, libgd-graph-perl, libgd-text-perl, libdate-calc-perl, ${perl:Depends}
+Recommends: libgtk2-spell-perl, libdatetime-format-strptime-perl, libmp3-info-perl, libcddb-perl, libnet-freedb-perl
+Provides: gcfilms
+Replaces: gcfilms
+Conflicts: gcfilms (<= 6.4)
+Description: Manage your collections of movies, games, books, music and more
+ GCstar is an application for managing your collections. It supports
+ many types of collections, including movies, books, games, comics,
+ stamps, coins, and many more. You can even create your own
+ collection type for whatever unique thing it is that you collect!
+ Detailed information on each item can be automatically retrieved
+ from the internet and you can store additional data, such as the
+ location or who you've lent it to. You may also search and filter
+ your collections by many criteria.
diff --git a/packages/debian/copyright b/packages/debian/copyright
new file mode 100644
index 0000000..13dd2bf
--- /dev/null
+++ b/packages/debian/copyright
@@ -0,0 +1,26 @@
+This package was debianized by Alexander Wirt <formorer@debian.org> on
+Sat, 14 Okt 2006 10:26:18 +0200.
+
+It was downloaded from http://download.gna.org/gcstar/
+
+Copyright Holder: Tian tian@c-sait.net
+
+License:
+
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ MA 02110-1301, USA.
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
diff --git a/packages/debian/dirs b/packages/debian/dirs
new file mode 100644
index 0000000..e772481
--- /dev/null
+++ b/packages/debian/dirs
@@ -0,0 +1 @@
+usr/bin
diff --git a/packages/debian/docs b/packages/debian/docs
new file mode 100644
index 0000000..e8d31ce
--- /dev/null
+++ b/packages/debian/docs
@@ -0,0 +1,3 @@
+README
+README.fr
+CHANGELOG.fr
diff --git a/packages/debian/gcstar.install b/packages/debian/gcstar.install
new file mode 100644
index 0000000..e16d720
--- /dev/null
+++ b/packages/debian/gcstar.install
@@ -0,0 +1,2 @@
+share/applications/gcstar.desktop /usr/share/applications/
+debian/gcstar_logo.xpm /usr/share/pixmaps/
diff --git a/packages/debian/gcstar_logo.xpm b/packages/debian/gcstar_logo.xpm
new file mode 100644
index 0000000..d11f79e
--- /dev/null
+++ b/packages/debian/gcstar_logo.xpm
@@ -0,0 +1,291 @@
+/* XPM */
+static char *gcstar_logo[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 253 2",
+" c #05101A",
+". c #195082",
+"X c #255683",
+"o c #2772B9",
+"O c #2872B9",
+"+ c #1A84EC",
+"@ c #1F89ED",
+"# c #2F85D5",
+"$ c #2A84DA",
+"% c #3884CC",
+"& c #3D88C8",
+"* c #3185D4",
+"= c #3189DD",
+"- c #388ED0",
+"; c #3B8EDF",
+": c #3D91CC",
+"> c #2385E2",
+", c #2087ED",
+"< c #238BED",
+"1 c #2887E1",
+"2 c #2C8AE1",
+"3 c #2A8DED",
+"4 c #2391ED",
+"5 c #2B91ED",
+"6 c #328EE6",
+"7 c #3293ED",
+"8 c #3399EE",
+"9 c #3E96E5",
+"0 c #3995EC",
+"q c #3B98E6",
+"w c #3C99ED",
+"e c #3799F0",
+"r c #3D9AF0",
+"t c #3FA0F1",
+"y c #4C86B8",
+"u c #5086B4",
+"i c #669D9E",
+"p c #738EA2",
+"a c #6DA09A",
+"s c #75A28D",
+"d c #71A298",
+"f c #60A0B6",
+"g c #4085C5",
+"h c #4389C9",
+"j c #4695CB",
+"k c #439ADF",
+"l c #4A9CDD",
+"z c #4095E2",
+"x c #459BE5",
+"c c #429CEC",
+"v c #4B9DE4",
+"b c #499EEA",
+"n c #409AF0",
+"m c #519DE1",
+"M c #509FE8",
+"N c #4EA0DE",
+"B c #55A2D3",
+"V c #51A0D9",
+"C c #5BA3D2",
+"Z c #5BA4DC",
+"A c #46A0ED",
+"S c #4CA1E4",
+"D c #4CA1EC",
+"F c #44A2F0",
+"G c #4BA3F0",
+"H c #52A1E3",
+"J c #53A5EC",
+"K c #5BA5E5",
+"L c #59A7EC",
+"P c #5EA9E5",
+"I c #5BA9EB",
+"U c #51A5F1",
+"Y c #56A9F2",
+"T c #59ACF2",
+"R c #62A7CC",
+"E c #60A7D3",
+"W c #61A5DE",
+"Q c #62A8D0",
+"! c #62A9D8",
+"~ c #6BADD5",
+"^ c #6AA9DC",
+"/ c #71AAD8",
+"( c #74B1D5",
+") c #73B2DB",
+"_ c #7AB4D4",
+"` c #61A6E1",
+"' c #62A9E5",
+"] c #63ADEA",
+"[ c #69ADE0",
+"{ c #61ADF2",
+"} c #68AFF2",
+"| c #69B0EA",
+" . c #63B2F3",
+".. c #6CB5F3",
+"X. c #6DB8F4",
+"o. c #75B4E4",
+"O. c #70B7F4",
+"+. c #73BAF4",
+"@. c #7AB7F0",
+"#. c #7DBEF4",
+"$. c #7DC0F5",
+"%. c #8C9576",
+"&. c #899379",
+"*. c #8AA277",
+"=. c #90A671",
+"-. c #AB8F55",
+";. c #A5945B",
+":. c #B28850",
+">. c #BE9D41",
+",. c #ADAB53",
+"<. c #BEA141",
+"1. c #B9A846",
+"2. c #BFBB41",
+"3. c #BBBA4A",
+"4. c #B4AF7E",
+"5. c #C1AE3E",
+"6. c #D6AF2D",
+"7. c #DCA322",
+"8. c #DEA12B",
+"9. c #ED9911",
+"0. c #FD8900",
+"q. c #FD8E0A",
+"w. c #F98F11",
+"e. c #F1950F",
+"r. c #FD9200",
+"t. c #FD9C00",
+"y. c #F79219",
+"u. c #FD9313",
+"i. c #E18F2B",
+"p. c #EE9D37",
+"a. c #F49421",
+"s. c #F09B32",
+"d. c #E2AF1C",
+"f. c #ECA118",
+"g. c #EABF13",
+"h. c #FDA300",
+"j. c #FDAC00",
+"k. c #FDB300",
+"l. c #FDBB00",
+"z. c #FDA133",
+"x. c #D19242",
+"c. c #D6A059",
+"v. c #D4BB5E",
+"b. c #C9A675",
+"n. c #DDB67A",
+"m. c #DDB87F",
+"M. c #E6A754",
+"N. c #FDAC48",
+"B. c #FBAF55",
+"V. c #FDB646",
+"C. c #FDBB4B",
+"Z. c #FDBD5A",
+"A. c #FCB661",
+"S. c #FDBA60",
+"D. c #DBC523",
+"F. c #EFCC0E",
+"G. c #EBC013",
+"H. c #E8C816",
+"J. c #FDC300",
+"K. c #FDCC00",
+"L. c #FDD000",
+"P. c #F7CA47",
+"I. c #FDC55A",
+"U. c #F7D357",
+"Y. c #F8C66D",
+"T. c #F9CC6C",
+"R. c #F9CC78",
+"E. c #F7D873",
+"W. c #909083",
+"Q. c #9FAF90",
+"!. c #8EB4A1",
+"~. c #87B3BE",
+"^. c #AEA488",
+"/. c #A5AF9E",
+"(. c #B0A185",
+"). c #BDBB9B",
+"_. c #87A7C2",
+"`. c #88B4CC",
+"'. c #8BB8CC",
+"]. c #80B7D9",
+"[. c #95BCC9",
+"{. c #81BDF3",
+"}. c #BAC7BD",
+"|. c #83C3F6",
+" X c #89C4F5",
+".X c #89C8F6",
+"XX c #9AC6E5",
+"oX c #96CBF7",
+"OX c #94CDF8",
+"+X c #9ACCF5",
+"@X c #96D0F8",
+"#X c #9BD3F8",
+"$X c #A0C6DD",
+"%X c #A8CCD1",
+"&X c #BDC2C5",
+"*X c #B3D3D3",
+"=X c #A2CAE9",
+"-X c #A4D3F2",
+";X c #A0D5F8",
+":X c #A6D9F9",
+">X c #ADD4F5",
+",X c #A9D6F8",
+"<X c #AEDAF1",
+"1X c #ABDBF9",
+"2X c #B4D8E9",
+"3X c #BDDBE6",
+"4X c #B2DBF6",
+"5X c #B3DCF9",
+"6X c #B7E1F7",
+"7X c #B4E0FA",
+"8X c #B8E0FA",
+"9X c #C6B896",
+"0X c #CCBD9A",
+"qX c #D7B682",
+"wX c #DAB884",
+"eX c #DBBE8D",
+"rX c #D2BF97",
+"tX c #C9CDBF",
+"yX c #C2D1BA",
+"uX c #CAD1B5",
+"iX c #D2C3A0",
+"pX c #D6CCB1",
+"aX c #DCE1BD",
+"sX c #FDCB87",
+"dX c #FECC8E",
+"fX c #FCD180",
+"gX c #FAD49F",
+"hX c #FDD891",
+"jX c #F1CFA8",
+"kX c #FCDDAC",
+"lX c #F2D8BC",
+"zX c #FDDEBD",
+"xX c #F6E19E",
+"cX c #FAE39B",
+"vX c #F9E89F",
+"bX c #EDE2AD",
+"nX c #F3E3A3",
+"mX c #F6E3AC",
+"MX c #FBE3A3",
+"NX c #FBE2AC",
+"BX c #FDE8A5",
+"VX c #FDEAA9",
+"CX c #FCE2B4",
+"ZX c #FDE1BA",
+"AX c #C0D6DA",
+"SX c #D1D8D1",
+"DX c #C1DFF7",
+"FX c #D4E0C9",
+"GX c #C2E2F3",
+"HX c #C6E3F8",
+"JX c #CBE4F8",
+"KX c #D5E9F8",
+"LX c None",
+/* pixels */
+"LXLXLXLXLXLXLXLXLXLXLXLXm m e 8 7 7 9 9 LXLXLXLXLXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXLXLXm 9 < < 3 5 4 4 @ , 6 c LXLXLXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXm 3 < 8 T X.+.+.X.X.Y b e 4 4 0 LXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXZ , < Y $..X.X$.X.T T T T G n 3 4 c LXLXLXLXLXLXLX",
+"LXLXLXLXLXLXb 3 w +.#X@X+.Z h g * $ , 3 w G n e < 5 LXLXLXLXLXLX",
+"LXLXLXLXLX` 3 3 #.#X#Xo.W.:.x.c.b.(.p * @ 8 b n 5 < b LXLXLXLXLX",
+"LXLXLXLXK 3 7 O.1X-X(.i.N.sXCXZXZXzXZXjX_.6 6 U t 5 < x LXLXLXLX",
+"LXLXLXLX0 < L #X<X9Xa.Z.kXzXZXCXzXzXzXzXlX&X6 n .8 4 5 LXLXLXLX",
+"LXLXLXJ 3 5 @X7X0Xa.dXZXzXNXZXCXCXCXCXzXZXkXtXv ] X.5 4 S LXLXLX",
+"LXLXK 0 < G 5X5Xp.B.ZXZXzXNXCXCXkXNXNXNXCXkXkX}.c XF @ 8 I LXLX",
+"LXLXK 3 7 #.4X0Xz.jXCXCXNXNXBXMXxXMXnXMXMXMXMXBX`.@.|.8 4 P LXLX",
+"LXLXc 3 w oX3XM.Z.NXNXVXMXMXMXBXcXgXvXgXMXMXBXMXuXo.>XU 4 S LXLX",
+"LXLXr < U :XSXy.hXVXxXnXvXnXxXcXcXcXcXcXvXBXBXVXmX'.KX#.4 q LXLX",
+"LXLX6 < { 1XiXw.hXVXgXMXbXFXaXnXvXcXcXcXBXBXVXVXVXyXJX,X4 5 LXLX",
+"LXLX1 , ..8XwX0.Z.fXR.Y.[.) [ /.V.C.I.T.%X*XxXBXVXnX<XHX4 4 LXLX",
+"LXLX1 , O.5Xm.0.q.u.u.u.= + @ u r.t.h.7.5 q v.P.E.U.=XJX5 4 LXLX",
+"LXLX2 , ..8XwX0.0.0.0.0.$ + + # t.t.h.<.+ + 1.l.l.J.$XDX5 5 LXLX",
+"LXLX1 , } 5XeX0.0.0.0.0.y + + & t.h.j.<.+ + 5.J.K.K.XX>X5 5 LXLX",
+"LXLX6 , b 1XpXy.0.0.0.0.-.# > &.h.j.k.d.> > g.K.K.H.+X X8 5 LXLX",
+"LXLXe < n oXSXs.0.0.r.r.9.;.%.7.j.k.k.l.*.*.K.K.K.3.>X+.5 w LXLX",
+"LXLXr < 3 O.DXwXr.r.t.t.h.h.j.k.l.l.l.J.K.K.L.L.H.!.@XY 5 N LXLX",
+"LXLXb 3 , U <XAXe.r.t.t.h.j.k.k.l.l.J.K.K.K.L.L.3._ $.A 5 C LXLX",
+"LXLXm n , 3 |.8X).f.h.j.j.k.l.l.J.J.K.L.L.L.L.D.C |.Y 8 q C LXLX",
+"LXLXLXm , @ Y OX2X4.j.k.k.l.l.l.J.K.L.L.L.L.D.a .+.A 4 N LXLXLX",
+"LXLXLXLX7 < 3 Y ;X,X/.6.l.l.K.K.L.L.L.L.F.v.j G O.T < 7 LXLXLXLX",
+"LXLXLXLXx < , 7 +.;X-X~.,.g.K.L.L.L.L.D.s : b .. .e 4 l LXLXLXLX",
+"LXLXLXLXLXx , , 7 T oX1X|.L f d s i : < q T +. .5 < l LXLXLXLXLX",
+"LXLXLXLXLXLX7 , < 3 T {.#X;X|.X.Y G T .$.$.G 8 < 5 LXLXLXLXLXLX",
+"LXLXLXLXLXLXLXx , , , 0 G } #.|..X.X$...b 7 4 < 9 LXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXn 3 , , 3 7 e r w w 7 8 5 < 3 w LXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXLXLXc 7 < 3 3 7 5 3 3 4 5 q LXLXLXLXLXLXLXLXLXLX",
+"LXLXLXLXLXLXLXLXLXLXLXLXr r 3 7 7 7 r n c LXLXLXLXLXLXLXLXLXLXLX"
+};
diff --git a/packages/debian/lintian/gcstar b/packages/debian/lintian/gcstar
new file mode 100644
index 0000000..41006db
--- /dev/null
+++ b/packages/debian/lintian/gcstar
@@ -0,0 +1,2 @@
+gcstar: script-not-executable ./usr/share/gcstar/helpers/xdg-open
+gcstar: script-not-executable ./usr/share/gcstar/xslt/applyXSLT.pl
diff --git a/packages/debian/menu b/packages/debian/menu
new file mode 100644
index 0000000..d61295c
--- /dev/null
+++ b/packages/debian/menu
@@ -0,0 +1 @@
+?package(gcfilms):needs="X11" section="Apps/Office" title="gcfilms" command="/usr/bin/gcfilms" icon="/usr/share/gcfilms/gcfilms.png"
diff --git a/packages/debian/patches/00list b/packages/debian/patches/00list
new file mode 100644
index 0000000..f67ce62
--- /dev/null
+++ b/packages/debian/patches/00list
@@ -0,0 +1,5 @@
+01-set_usr_lib.dpatch
+02gzip-manpage.dpatch
+03_change_default_browser.dpatch
+04-install-set_usr_lib
+07_fix_manpath.dpatch
diff --git a/packages/debian/patches/01-set_usr_lib.dpatch b/packages/debian/patches/01-set_usr_lib.dpatch
new file mode 100644
index 0000000..8fd45ca
--- /dev/null
+++ b/packages/debian/patches/01-set_usr_lib.dpatch
@@ -0,0 +1,26 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## test.dpatch by <nyall@crackfox>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstarzombiepig-1.6~/bin/gcstar gcstarzombiepig-1.6/bin/gcstar
+--- gcstarzombiepig-1.6~/bin/gcstar 2009-09-20 17:12:25.000000000 -0300
++++ gcstarzombiepig-1.6/bin/gcstar 2009-09-20 17:29:43.000000000 -0300
+@@ -44,12 +44,12 @@
+ use POSIX qw(locale_h);
+
+ $ENV{GCS_BIN_DIR} = $RealBin;
+-($ENV{GCS_LIB_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/lib\/gcstar/;
++($ENV{GCS_LIB_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/share\/gcstar\/lib/;
+ ($ENV{GCS_SHARE_DIR} = $ENV{GCS_BIN_DIR}) =~ s/bin\/?$/share\/gcstar/;
+-use lib File::Spec->canonpath("$RealBin/../lib/gcstar");
++use lib File::Spec->canonpath("$RealBin/../share/gcstar/lib");
+ if (exists $ENV{PAR_TEMP})
+ {
+- unshift @INC, "$RealBin/../lib/gcstar";
++ unshift @INC, "$RealBin/../share/gcstar/lib";
+ }
+
+ # For win32, redirect all the output to files
diff --git a/packages/debian/patches/02gzip-manpage.dpatch b/packages/debian/patches/02gzip-manpage.dpatch
new file mode 100644
index 0000000..6829218
--- /dev/null
+++ b/packages/debian/patches/02gzip-manpage.dpatch
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 02gzip-manpage.dpatch by Alexander Wirt <formorer@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstar-0.4.1~/install gcstar-0.4.1/install
+--- gcstar-0.4.1~/install 2006-10-14 09:25:28.000000000 +0200
++++ gcstar-0.4.1/install 2006-10-14 09:25:36.000000000 +0200
+@@ -145,7 +145,7 @@
+ mkpath $baseDir.'/man/man1';
+ my $manPage = "$baseDir/man/man1/$binName.1";
+ copy 'man/gcstar.1', $manPage;
+- `gzip -f $manPage 2>&1 >/dev/null`;
++ `gzip -f -9 $manPage 2>&1 >/dev/null`;
+
+ chmod 0755, $baseDir.'/bin/'.$binName;
+
diff --git a/packages/debian/patches/03_change_default_browser.dpatch b/packages/debian/patches/03_change_default_browser.dpatch
new file mode 100644
index 0000000..fbc093b
--- /dev/null
+++ b/packages/debian/patches/03_change_default_browser.dpatch
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 03_change_default_browser.dpatch by Alexander Wirt <formorer@debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstar-1.2.0~/lib/gcstar/GCOptions.pm gcstar-1.2.0/lib/gcstar/GCOptions.pm
+--- gcstar-1.2.0~/lib/gcstar/GCOptions.pm 2007-08-18 14:41:14.000000000 +0200
++++ gcstar-1.2.0/lib/gcstar/GCOptions.pm 2007-09-08 22:33:51.000000000 +0200
+@@ -122,7 +122,7 @@
+ autosave => 1,
+ noautoload => 0,
+ programs => "system",
+- browser => "firefox",
++ browser => "x-www-browser",
+ player => "mplayer",
+ audio => "xmms",
+ file => "",
diff --git a/packages/debian/patches/04-install-set_usr_lib.dpatch b/packages/debian/patches/04-install-set_usr_lib.dpatch
new file mode 100644
index 0000000..0a8dc3a
--- /dev/null
+++ b/packages/debian/patches/04-install-set_usr_lib.dpatch
@@ -0,0 +1,21 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## test.dpatch by <nyall@crackfox>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstar~/install gcstar/install
+--- gcstar~/install 2009-09-20 20:49:02.000000000 -0300
++++ gcstar/install 2009-09-20 20:50:50.000000000 -0300
+@@ -196,8 +196,8 @@
+ chmod 0755, $baseDir.'/bin/'.$binName;
+
+ #Copying lib
+- verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/lib/gcstar';
+- recursiveCopy('lib/gcstar', $baseDir.'/lib/gcstar');
++ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/share/gcstar/lib';
++ recursiveCopy('lib/gcstar', $baseDir.'/share/gcstar/lib');
+
+ #Copying share
+ verbosePrint $lang{InstallCopyDirectory}, $baseDir.'/share/gcstar';
diff --git a/packages/debian/patches/07_fix_manpath.dpatch b/packages/debian/patches/07_fix_manpath.dpatch
new file mode 100644
index 0000000..53fb281
--- /dev/null
+++ b/packages/debian/patches/07_fix_manpath.dpatch
@@ -0,0 +1,19 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## test.dpatch by <nyall@crackfox>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: No description.
+
+@DPATCH@
+diff -urNad gcstarzombiepig-1.6~/install gcstarzombiepig-1.6/install
+--- gcstarzombiepig-1.6~/install 2009-09-20 17:32:03.000000000 -0300
++++ gcstarzombiepig-1.6/install 2009-09-20 17:33:56.000000000 -0300
+@@ -107,7 +107,7 @@
+ }
+
+ unlink $baseDir.'/bin/'.$binName;
+- unlink $baseDir.'/man/man1/'.$binName.'.1.gz';
++ unlink $baseDir.'/share/man/man1/'.$binName.'.1.gz';
+
+ # remove menu and mime items
+
diff --git a/packages/debian/postinst b/packages/debian/postinst
new file mode 100644
index 0000000..80dc2f0
--- /dev/null
+++ b/packages/debian/postinst
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+update-desktop-database
+update-mime-database /usr/share/mime
+gtk-update-icon-cache /usr/share/icons/hicolor
+
+exit 0
+
diff --git a/packages/debian/postrm b/packages/debian/postrm
new file mode 100644
index 0000000..80dc2f0
--- /dev/null
+++ b/packages/debian/postrm
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+update-desktop-database
+update-mime-database /usr/share/mime
+gtk-update-icon-cache /usr/share/icons/hicolor
+
+exit 0
+
diff --git a/packages/debian/rules b/packages/debian/rules
new file mode 100644
index 0000000..edacc8a
--- /dev/null
+++ b/packages/debian/rules
@@ -0,0 +1,112 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+export DH_VERBOSE=1
+
+export LANG=C
+export LC_ALL=C
+
+build: patch build-stamp
+
+build-stamp:
+ dh_testdir
+
+ touch build-stamp
+
+clean: clean1 unpatch
+
+clean1:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp configure-stamp
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+ ./install --text --prefix=$(CURDIR)/debian/gcstar/usr
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_16x16.png \
+ debian/gcstar/usr/share/icons/hicolor/16x16/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_22x22.png \
+ debian/gcstar/usr/share/icons/hicolor/22x22/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_24x24.png \
+ debian/gcstar/usr/share/icons/hicolor/24x24/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_32x32.png \
+ debian/gcstar/usr/share/icons/hicolor/32x32/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_36x36.png \
+ debian/gcstar/usr/share/icons/hicolor/36x36/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_48x48.png \
+ debian/gcstar/usr/share/icons/hicolor/48x48/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_64x64.png \
+ debian/gcstar/usr/share/icons/hicolor/64x64/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_72x72.png \
+ debian/gcstar/usr/share/icons/hicolor/72x72/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_96x96.png \
+ debian/gcstar/usr/share/icons/hicolor/96x96/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_128x128.png \
+ debian/gcstar/usr/share/icons/hicolor/128x128/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_192x192.png \
+ debian/gcstar/usr/share/icons/hicolor/192x192/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_256x256.png \
+ debian/gcstar/usr/share/icons/hicolor/256x256/apps/gcstar.png
+ install -D -m 0644 debian/gcstar/usr/share/gcstar/icons/gcstar_scalable.svg \
+ debian/gcstar/usr/share/icons/hicolor/scalable/apps/gcstar.svg
+ install -D -m 0644 share/applications/gcstar.xml \
+ debian/gcstar/usr/share/mime/packages/gcstar.xml
+
+ #this is also in the copyright file
+ -rm debian/gcstar/usr/share/gcstar/LICENSE
+
+ # Installing lintian overrides
+ for LINTIAN in debian/lintian/*; \
+ do \
+ install -D -m 644 $$LINTIAN debian/`basename $$LINTIAN`/usr/share/lintian/overrides/`basename $$LINTIAN` || exit 1; \
+ done
+
+
+# Build architecture-independent files here.
+binary-arch: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-indep: build install patch
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs CHANGELOG
+ dh_installdocs
+ dh_installexamples
+ dh_install
+ dh_installmenu
+ dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+ dh_perl
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+patch: patch-stamp
+patch-stamp:
+ dpatch apply-all
+ #dpatch call-all -a=pkg-info >patch-stamp #I don't understand this one.
+ echo patched > patch-stamp
+
+unpatch:
+ dpatch deapply-all
+ rm -rf patch-stamp debian/patched
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
diff --git a/packages/fedora/gcstar.spec b/packages/fedora/gcstar.spec
new file mode 100644
index 0000000..2244363
--- /dev/null
+++ b/packages/fedora/gcstar.spec
@@ -0,0 +1,111 @@
+Name: gcstar
+Version: 1.7.0
+Release: 4%{?dist}
+Summary: Personal collections manager
+
+Group: Applications/Databases
+License: GPL
+URL: http://www.gcstar.org/
+Source0: http://download.gna.org/gcstar/gcstar-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+BuildArch: noarch
+
+BuildRequires: desktop-file-utils
+Requires: perl-Gtk2
+
+%define desktop_vendor fedora
+
+%description
+GCstar is an application for managing your personal collections.
+Detailed information on each item can be automatically retrieved
+from the internet and you can store additional data, depending on
+the collection type. And also who you've lent your them to. You
+may also search and filter your collection by criteria.
+
+%prep
+%setup -q -n gcstar
+
+
+%build
+
+%install
+rm -rf %{buildroot}
+%{__mkdir_p} %{buildroot}%{_prefix}
+%{__install} -d %{buildroot}%{_bindir}
+%{__install} bin/gcstar %{buildroot}%{_bindir}
+%{__install} -d %{buildroot}%{_libdir}
+%{__cp} -a lib/gcstar %{buildroot}%{_libdir}
+%{__install} -d %{buildroot}%{_datadir}
+%{__cp} -a share/gcstar %{buildroot}%{_datadir}
+%{__install} -d %{buildroot}%{_mandir}/man1
+%{__install} man/gcstar.1 %{buildroot}%{_mandir}/man1
+gzip %{buildroot}%{_mandir}/man1/gcstar.1
+
+# Install menu entry
+%{__cat} > %{name}.desktop << EOF
+[Desktop Entry]
+Name=GCstar
+Comment=Manage your collections
+GenericName=Personal collections manager
+Exec=gcstar
+Icon=%{_datadir}/gcstar/icons/gcstar_64x64.png
+Terminal=false
+Type=Application
+MimeType=application/x-gcstar
+Categories=Application;Office;
+Encoding=UTF-8
+EOF
+
+%{__mkdir_p} %{buildroot}%{_datadir}/applications
+desktop-file-install \
+ --vendor %{desktop_vendor} \
+ --dir %{buildroot}%{_datadir}/applications \
+ %{name}.desktop
+
+#Mime Type
+%{__cat} > %{name}.xml <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-gcstar">
+ <comment>GCstar collection</comment>
+ <glob pattern="*.gcs"/>
+ </mime-type>
+</mime-info>
+EOF
+
+%{__mkdir_p} %{buildroot}%{_datadir}/mime/packages
+cp %{name}.xml %{buildroot}%{_datadir}/mime/packages
+
+
+%clean
+rm -rf %{buildroot}
+
+%post
+update-desktop-database &> /dev/null ||:
+update-mime-database %{_datadir}/mime &> /dev/null || :
+
+%postun
+update-desktop-database &> /dev/null ||:
+update-mime-database %{_datadir}/mime &> /dev/null || :
+
+%files
+%defattr(-,root,root)
+%doc CHANGELOG README LICENSE
+%{_libdir}/gcstar
+%{_datadir}/gcstar
+%{_mandir}/man1/gcstar.1.gz
+%attr(0755,root,root) %{_bindir}/gcstar
+%{_datadir}/applications/%{desktop_vendor}-%{name}.desktop
+%{_datadir}/mime/packages/%{name}.xml
+
+%changelog
+* Sat Oct 28 2006 Tian <tian@c-sait.net> - 0.5.0-4
+ - Re-creation of the module because of a problem with previous import
+* Sun Oct 22 2006 Tian <tian@c-sait.net> - 0.5.0-3
+ - Restored BuildRequires
+* Sat Oct 21 2006 Tian <tian@c-sait.net> - 0.5.0-2
+ - Changed desktop vendor
+ - Removed desktop-file-utils and shared-mime-info from required
+ - Fixed icon path in desktop file
+* Sat Oct 21 2006 Tian <tian@c-sait.net> - 0.5.0-1
+ - First Fedora Extras version.
diff --git a/packages/rpm/gcstar.spec b/packages/rpm/gcstar.spec
new file mode 100644
index 0000000..b4df656
--- /dev/null
+++ b/packages/rpm/gcstar.spec
@@ -0,0 +1,41 @@
+# Initial spec file created by autospec ver. 0.8 with rpm 3 compatibility
+Summary: GCstar, Collection manager
+Name: gcstar
+Version: 1.7.0
+Release: 1
+Group: Applications/Databases
+License: GPL
+Source: gcstar-%{version}.tar.gz
+Requires: perl-Gtk2 >= 1.054
+BuildRoot: %{_tmppath}/%{name}-root
+URL: https://gna.org/projects/gcstar/
+BuildArch: noarch
+
+%description
+GCstar - Application that can be used to manage some collections.
+
+#%description -l fr
+GCstar - Application permettant de gérer des collections.
+
+%prep
+#%setup -c RPM
+%setup -q -n %{name}
+
+%install
+#%__cp -a . "${RPM_BUILD_ROOT-/}"
+./install --prefix=${RPM_BUILD_ROOT}/usr/ >/dev/null
+
+
+%clean
+[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT"
+
+%files
+%defattr(-,root,root)
+/usr/lib/gcstar/
+/usr/share/gcstar/
+/usr/man/man1/gcstar.1.gz
+%attr(0755,root,root) /usr/bin/gcstar
+
+%changelog
+* Tue Feb 08 2005 Tian <tian@c-sait.net>
+- Initial spec file created by autospec ver. 0.8 with rpm 3 compatibility
diff --git a/packages/win32/createExe.bat b/packages/win32/createExe.bat
new file mode 100644
index 0000000..3605a24
--- /dev/null
+++ b/packages/win32/createExe.bat
@@ -0,0 +1 @@
+C:\Perl\bin\pp -o gcstar.exe -g -B -M filetest -M Glib::Object::Subclass -M locale -M Digest::MD5 -M MIME::Base64 -M LWP -M LWP::Simple -M LWP::UserAgent -M Net::SMTP -M URI::Escape -M HTTP::Cookies::Netscape -M HTML::Entities -M Gtk2::SimpleList -M Text::Wrap -M XML::Simple -M MP3::Info -M MP3::Tag -M Net::FreeDB -M DateTime::Format::Strptime -M Archive::Tar -M Archive::Zip -M Compress::Zlib -M Time::Piece -M Ogg::Vorbis::Header::PurePerl -M Getopt::Long -M FindBin -M Gtk2::Gdk::Keysyms -M Unicode::Normalize -M GD -M GD::Text -M GD::Graph::bars -M GD::Graph::area -M GD::Graph::pie -M Date::Calc -a "..\lib\gcstar;lib" -a "..\share\gcstar;share" --link=C:\Perl\site\lib\auto\Cairo\Cairo.dll --link=C:\Perl\site\lib\auto\Glib\Glib.dll --link=C:\Perl\site\lib\auto\Gtk2\Gtk2.dll -vvv --icon=..\share\gcstar\icons\GCstar.ico --info="ProductName=GCstar;ProductVersion=1.6.1;FileVersion=1.6.1;FileDescription=GCstar, Personal Collections Manager;Comments=http://www.gcstar.org;LegalCopyright=GNU GPL" gcstar \ No newline at end of file
diff --git a/packages/win32/gcs_lang.nsh b/packages/win32/gcs_lang.nsh
new file mode 100644
index 0000000..42ca6a6
--- /dev/null
+++ b/packages/win32/gcs_lang.nsh
@@ -0,0 +1,65 @@
+;Title Lang support for GCstar installer. Made from AbiWord one.
+;FileDesc functions/macros/etc for supporting multi-language text within installer
+
+
+!ifndef _GCS_LANG_NSH_
+!define _GCS_LANG_NSH_
+
+ ; Languages, include MUI & NSIS language support
+ ; then include app install specific language support
+
+ ; indicate default language definitions to use if a translation is missing a string
+ !define DEF_LANG "ENGLISH"
+
+ ; actually sets the LangString
+ !macro SETLSTR NAME VALUE ; e.g. English sectID sectDesc
+ !echo "${LANG} ( ${LANG_${LANG}} )"
+ !define "STRING_ISSET_${LANG}_${NAME}"
+ LangString "${NAME}" "${LANG_${LANG}}" "${VALUE}"
+ !macroend
+ !define SETLSTR "!insertmacro SETLSTR"
+
+ ; macro to set string, assumes LANG already defined (call within context of LANG_LOAD)
+ !macro LSTR NAME VALUE ; e.g. sectID sectDesc
+ !ifdef SETDEFLANG
+ ; if string is already set, we do nothing, otherwise we set to default value and warn user
+ !ifndef "STRING_ISSET_${LANG}_${NAME}"
+ !ifndef APPSET_LANGUAGEFILE_DEFAULT_USED ; flag default value must be used
+ !define APPSET_LANGUAGEFILE_DEFAULT_USED
+ !endif
+ ${SETLSTR} "${NAME}" "${VALUE}" ; set to default value
+ !endif
+ !else ; just set the value
+ ${SETLSTR} "${NAME}" "${VALUE}"
+ !endif
+ !macroend
+ !define LSTR "!insertmacro LSTR"
+
+ ; macro to include necessary language files
+ ; Usage:
+ ; ${LANG_LOAD} "<nsis language name>"
+ ; e.g. ${LANG_LOAD} "English"
+ ;
+ !macro LANG_LOAD LANG
+ !insertmacro MUI_LANGUAGE "${LANG}"
+ !echo "Loading language ${LANG} ( ${LANG_${LANG}} )"
+ ; Specify the license text to use (for multilang support, must come after MUI_LANGUAGE)
+ ;LicenseLangString LicenseTXT "${LANG_${LANG}}" "..\AbiSuite\Copying"
+ !verbose push
+ !verbose 3
+ !include "langs\gcs_${LANG}.nsh" ; Localized Installer Messages (Language Strings)
+ !define SETDEFLANG
+ ;!include "gcs_${DEF_LANG}.nsh"
+ !verbose pop
+ !ifdef APPSET_LANGUAGEFILE_DEFAULT_USED
+ !undef APPSET_LANGUAGEFILE_DEFAULT_USED
+ !warning "${LANG} Installation language file incomplete. Using default texts for missing strings."
+ !endif
+ !undef SETDEFLANG
+ !echo "End loading language ${LANG}"
+ !undef LANG
+ !macroend
+ !define LANG_LOAD "!insertmacro LANG_LOAD"
+
+!endif ; _GCS_LANG_NSH_
+; End of file
diff --git a/packages/win32/gcstar.bat b/packages/win32/gcstar.bat
new file mode 100644
index 0000000..81142a1
--- /dev/null
+++ b/packages/win32/gcstar.bat
@@ -0,0 +1,3 @@
+@echo off
+cd %0\..
+set PATH=..\usr\bin;..\usr\lib;%PATH%
diff --git a/packages/win32/gcstar.nsi b/packages/win32/gcstar.nsi
new file mode 100644
index 0000000..e426da2
--- /dev/null
+++ b/packages/win32/gcstar.nsi
@@ -0,0 +1,362 @@
+; NSIS for GCstar ( http://www.gcstar.org/ )
+; Based on Frozen Bubble NSIS
+
+; Helper defines
+!define PRODUCT_NAME "GCstar"
+!define PRODUCT_VERSION "1.7.0"
+!define PRODUCT_PUBLISHER "Tian"
+!define PRODUCT_WEB_SITE "http://www.gcstar.org/"
+!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
+
+; MUI 1.67 compatible ------
+!include "MUI.nsh"
+
+; MUI Settings
+!define MUI_ABORTWARNING
+!define MUI_ICON "img\icon_install.ico"
+!define MUI_UNICON "img\icon_uninstall.ico"
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_RIGHT
+!define MUI_HEADERIMAGE_BITMAP "img\banner_top.bmp"
+!define MUI_HEADERIMAGE_UNBITMAP "img\uninstall_top.bmp"
+
+!define MUI_COMPONENTSPAGE_CHECKBITMAP "img\checks.bmp"
+
+!define MUI_FINISHPAGE_RUN
+!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchGCstar"
+!define MUI_FINISHPAGE_RUN_TEXT "$(FINISH_LAUNCH)"
+
+!define MUI_FINISHPAGE_LINK "$(FINISH_WEBSITE)"
+!define MUI_FINISHPAGE_LINK_LOCATION "${PRODUCT_WEB_SITE}"
+!define MUI_FINISHPAGE_LINK_COLOR "1C86EE"
+
+;COLORS
+!define MUI_BGCOLOR "FFFFFF"
+!define MUI_LICENSEPAGE_BGCOLOR "FFFFFF"
+!define MUI_INSTALLCOLORS "1C86EE FFFFFF"
+!define MUI_INSTFILESPAGE_COLORS "1C86EE FFFFFF"
+
+; Language Selection Dialog Settings
+!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"
+
+; Welcome page
+!define MUI_WELCOMEFINISHPAGE_BITMAP "img\banner_left.bmp"
+!insertmacro MUI_PAGE_WELCOME
+; License page
+!define MUI_LICENSEPAGE_CHECKBOX
+!insertmacro MUI_PAGE_LICENSE "LICENSE"
+; Components page
+!insertmacro MUI_PAGE_COMPONENTS
+; Directory page
+!insertmacro MUI_PAGE_DIRECTORY
+; Start menu page
+var ICONS_GROUP
+;!define MUI_STARTMENUPAGE_NODISABLE
+!define MUI_STARTMENUPAGE_DEFAULTFOLDER "GCstar"
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
+!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
+; Instfiles page
+!insertmacro MUI_PAGE_INSTFILES
+; Finish page
+!insertmacro MUI_PAGE_FINISH
+
+; Uninstaller pages
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; MUI end ------
+
+; Languages
+!include "gcs_lang.nsh"
+
+${LANG_LOAD} "Bulgarian"
+${LANG_LOAD} "Czech"
+${LANG_LOAD} "German"
+${LANG_LOAD} "English"
+${LANG_LOAD} "Spanish"
+${LANG_LOAD} "French"
+${LANG_LOAD} "Italian"
+${LANG_LOAD} "Polish"
+${LANG_LOAD} "Romanian"
+${LANG_LOAD} "Russian"
+${LANG_LOAD} "SerbianLatin"
+${LANG_LOAD} "Turkish"
+
+Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
+OutFile "${PRODUCT_NAME}_${PRODUCT_VERSION}_Setup.exe"
+InstallDir "$PROGRAMFILES\GCstar"
+InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
+ShowInstDetails hide
+ShowUnInstDetails hide
+
+InstType "$(INSTALL_APP_DEP)"
+InstType "$(INSTALL_APP_ONLY)"
+InstType "$(INSTALL_FULL)"
+
+Function .onInit
+ SetShellVarContext all
+ !define MUI_LANGDLL_ALWAYSSHOW
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ ;Prevent Multiple Instances:
+ System::Call 'kernel32::CreateMutexA(i 0, i 0, t "GCstarSetup") i .r1 ?e'
+ Pop $R0
+ StrCmp $R0 0 +3
+ MessageBox MB_OK|MB_ICONEXCLAMATION "$(PRE_MULTIPLE)"
+ Abort
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" NoRemove
+ Return
+ NoRemove:
+ SectionSetText 0 "" ; and make invisible so user doesn't see it
+ Return
+FunctionEnd
+
+Function LaunchGCstar
+ SetOutPath "$INSTDIR\bin"
+ Exec "$\"$INSTDIR\bin\gcstar.bat$\""
+FunctionEnd
+
+Section "$(SEC_UN)" SEC01
+ SetShellVarContext all
+ SectionIn 3
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" NoRemove
+ call RemovePrevious
+ NoRemove:
+SectionEnd
+
+Section "!GCstar" SEC02
+ SetShellVarContext all
+ SectionIn 1 2 3 RO
+ SetOutPath "$INSTDIR"
+ SetOverwrite try
+ File /r "lib"
+ File /r "share"
+ File /r "usr"
+
+ SetOutPath "$INSTDIR\bin"
+ File "bin\gcstar.exe"
+ File "bin\gcstar.bat"
+ File "bin\update.bat"
+
+ FileOpen $1 "$INSTDIR\bin\gcstar.bat" a
+ FileSeek $1 0 END
+ FileWrite $1 "set LANG=$(LANG_CODE)$\r$\n"
+ FileWrite $1 "start gcstar.exe %1$\r$\n"
+ FileClose $1
+
+ Call SetFileAssociation
+
+; Shortcuts
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+ CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_APPLICATION).lnk" '"$INSTDIR\bin\gcstar.bat"' "" $INSTDIR\share\gcstar\icons\GCstar.ico "" SW_SHOWMINIMIZED "" "$(LINK_APPLICATION_DESCRIPTION)"
+ !insertmacro MUI_STARTMENU_WRITE_END
+SectionEnd
+
+SectionGroup "$(SEC_ICONS)" GroupSec02
+
+Section "$(SEC_DSK)" SEC05
+ SetShellVarContext all
+ SectionIn 1 3
+ SetOutPath "$INSTDIR\bin"
+ CreateShortCut "$DESKTOP\$(LINK_APPLICATION).lnk" '"$INSTDIR\bin\gcstar.bat"' "" $INSTDIR\share\gcstar\icons\GCstar.ico "" SW_SHOWMINIMIZED "" "$(LINK_APPLICATION_DESCRIPTION)"
+SectionEnd
+
+Section "$(SEC_QUICK)" SEC06
+ SetShellVarContext all
+ SectionIn 1 3
+ StrCmp $QUICKLAUNCH $TEMP +3
+ SetOutPath "$INSTDIR\bin"
+ CreateShortCut "$QUICKLAUNCH\$(LINK_APPLICATION).lnk" '"$INSTDIR\bin\gcstar.bat"' "" $INSTDIR\share\gcstar\icons\GCstar.ico "" SW_SHOWMINIMIZED "" "$(LINK_APPLICATION_DESCRIPTION)"
+SectionEnd
+
+SectionGroupEnd
+
+Section -AdditionalIcons
+ SetShellVarContext all
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_UPDATE).lnk" '"$INSTDIR\bin\update.bat"' "" $INSTDIR\share\gcstar\icons\icon_install.ico "" "" "" "$(LINK_UPDATE_DESCRIPTION)"
+ WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_SITE).lnk" "$INSTDIR\${PRODUCT_NAME}.url" "" $INSTDIR\share\gcstar\icons\web.ico "" "" "" "$(LINK_SITE_DESCRIPTION)"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(LINK_REMOVE).lnk" "$INSTDIR\uninst.exe" "" "" "" "" "" "$(LINK_REMOVE_DESCRIPTION)"
+ !insertmacro MUI_STARTMENU_WRITE_END
+SectionEnd
+
+Section -Post
+ SetShellVarContext all
+ WriteUninstaller "$INSTDIR\uninst.exe"
+ WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\gcstar"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+SectionEnd
+
+; Section descriptions
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+; !insertmacro MUI_DESCRIPTION_TEXT ${GroupSec00} "$(DESC_DEPENDENCIES)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${SEC00} "$(DESC_ACTIVEPERL)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${GroupSec01} "$(DESC_GTKPERL)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${SEC03} "$(DESC_GTK)"
+; !insertmacro MUI_DESCRIPTION_TEXT ${SEC04} "$(DESC_PERL)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "$(DESC_UN)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "$(DESC_APP)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${GroupSec02} "$(DESC_ICONS)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC05} "$(DESC_DESKTOP)"
+ !insertmacro MUI_DESCRIPTION_TEXT ${SEC06} "$(DESC_QUICK)"
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+
+Function un.onUninstSuccess
+ HideWindow
+ MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) has been successfullly removed from your computer."
+FunctionEnd
+
+Function un.onInit
+ !insertmacro MUI_UNGETLANGUAGE
+FunctionEnd
+
+Section Uninstall
+ SetShellVarContext all
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UN_QUESTION)" IDYES DoUnInstall
+
+ Abort "$(UN_ABORTED)"
+ Quit
+
+ DoUnInstall:
+
+ !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
+
+ Delete "$DESKTOP\$(LINK_APPLICATION).lnk"
+ Delete "$QUICKLAUNCH\$(LINK_APPLICATION).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_APPLICATION).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_UPDATE).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_SITE).lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\$(LINK_REMOVE).lnk"
+ RMDir "$SMPROGRAMS\$ICONS_GROUP"
+
+ RMDir /r "$INSTDIR\bin"
+ RMDir /r "$INSTDIR\lib"
+ RMDir /r "$INSTDIR\share"
+ RMDir /r "$INSTDIR\usr"
+
+ Delete "$INSTDIR\*"
+
+ MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(UN_PERSO)" IDNO ContinueUnInstall
+
+ RMDir /r "$INSTDIR\data"
+ RMDir /r "$INSTDIR\config"
+
+ ContinueUninstall:
+
+ Call un.RemoveFileAssociation
+
+ StrCpy $5 "all"
+ Push "$INSTDIR\bin"
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+ DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
+
+ RMDir "$INSTDIR"
+
+ SetAutoClose true
+SectionEnd
+
+;----------------------------------------
+; based upon a script of "Written by KiCHiK 2003-01-18 05:57:02"
+;----------------------------------------
+!verbose 3
+!include "WinMessages.nsh"
+!verbose 4
+;====================================================
+; Usefull for file association
+;====================================================
+Function SetFileAssociation
+ !define Index "Line${__LINE__}"
+ ReadRegStr $1 HKCR ".gcs" ""
+ StrCmp $1 "" "${Index}-NoBackup"
+ StrCmp $1 "GCstarFile" "${Index}-NoBackup"
+ WriteRegStr HKCR ".gcs" "backup_val" $1
+ "${Index}-NoBackup:"
+ WriteRegStr HKCR ".gcs" "" "GCstarFile"
+ ReadRegStr $0 HKCR "GCstarFile" ""
+ StrCmp $0 "" 0 "${Index}-Skip"
+ WriteRegStr HKCR "GCstarFile" "" "$(FILE_DESC)"
+ WriteRegStr HKCR "GCstarFile\shell" "" "open"
+ WriteRegStr HKCR "GCstarFile\DefaultIcon" "" "$INSTDIR\share\gcstar\icons\GCstar.ico"
+ "${Index}-Skip:"
+ WriteRegStr HKCR "GCstarFile\shell\open\command" "" \
+ '"$INSTDIR\bin\gcstar.bat" "%1"'
+ !undef Index
+ Call RefreshShellIcons
+FunctionEnd
+
+Function un.RemoveFileAssociation
+ !define Index "Line${__LINE__}"
+ ReadRegStr $1 HKCR ".gcs" ""
+ StrCmp $1 "GCstarFile" 0 "${Index}-NoOwn" ; only do this if we own it
+ ReadRegStr $1 HKCR ".gcs" "backup_val"
+ StrCmp $1 "" 0 "${Index}-Restore" ; if backup="" then delete the whole key
+ DeleteRegKey HKCR ".gcs"
+ Goto "${Index}-NoOwn"
+ "${Index}-Restore:"
+ WriteRegStr HKCR ".gcs" "" $1
+ DeleteRegValue HKCR ".gcs" "backup_val"
+
+ "${Index}-NoOwn:"
+ DeleteRegKey HKCR "GCstarFile" ;Delete key with association settings
+ !undef Index
+ Call un.RefreshShellIcons
+FunctionEnd
+
+!define SHCNE_ASSOCCHANGED 0x08000000
+!define SHCNF_IDLIST 0
+
+Function RefreshShellIcons
+ ; By jerome tremblay - april 2003
+ System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \
+ (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
+FunctionEnd
+
+Function un.RefreshShellIcons
+ ; By jerome tremblay - april 2003
+ System::Call 'shell32.dll::SHChangeNotify(i, i, i, i) v \
+ (${SHCNE_ASSOCCHANGED}, ${SHCNF_IDLIST}, 0, 0)'
+FunctionEnd
+
+Function RemovePrevious
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "DisplayVersion"
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+
+ ;Run the uninstaller
+ ClearErrors
+ ExecWait '$R0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file
+
+ IfErrors no_remove_uninstaller
+ ;You can either use Delete /REBOOTOK in the uninstaller or add some code
+ ;here to remove to remove the uninstaller. Use a registry key to check
+ ;whether the user has chosen to uninstall. If you are using an uninstaller
+ ;components page, make sure all sections are uninstalled.
+ no_remove_uninstaller:
+
+FunctionEnd
+
diff --git a/packages/win32/img/banner_left.bmp b/packages/win32/img/banner_left.bmp
new file mode 100644
index 0000000..539a239
--- /dev/null
+++ b/packages/win32/img/banner_left.bmp
Binary files differ
diff --git a/packages/win32/img/banner_top.bmp b/packages/win32/img/banner_top.bmp
new file mode 100644
index 0000000..da5aadc
--- /dev/null
+++ b/packages/win32/img/banner_top.bmp
Binary files differ
diff --git a/packages/win32/img/checks.bmp b/packages/win32/img/checks.bmp
new file mode 100644
index 0000000..53e8e14
--- /dev/null
+++ b/packages/win32/img/checks.bmp
Binary files differ
diff --git a/packages/win32/img/icon_install.ico b/packages/win32/img/icon_install.ico
new file mode 100644
index 0000000..6fe942e
--- /dev/null
+++ b/packages/win32/img/icon_install.ico
Binary files differ
diff --git a/packages/win32/img/icon_uninstall.ico b/packages/win32/img/icon_uninstall.ico
new file mode 100644
index 0000000..488f3a3
--- /dev/null
+++ b/packages/win32/img/icon_uninstall.ico
Binary files differ
diff --git a/packages/win32/img/uninstall_top.bmp b/packages/win32/img/uninstall_top.bmp
new file mode 100644
index 0000000..517c461
--- /dev/null
+++ b/packages/win32/img/uninstall_top.bmp
Binary files differ
diff --git a/packages/win32/img/website.ico b/packages/win32/img/website.ico
new file mode 100644
index 0000000..9cdd1d9
--- /dev/null
+++ b/packages/win32/img/website.ico
Binary files differ
diff --git a/packages/win32/langs/gcs_Bulgarian.nsh b/packages/win32/langs/gcs_Bulgarian.nsh
new file mode 100644
index 0000000..b352346
--- /dev/null
+++ b/packages/win32/langs/gcs_Bulgarian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "BG"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Czech.nsh b/packages/win32/langs/gcs_Czech.nsh
new file mode 100644
index 0000000..6cb63a5
--- /dev/null
+++ b/packages/win32/langs/gcs_Czech.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "CS"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_English.nsh b/packages/win32/langs/gcs_English.nsh
new file mode 100644
index 0000000..0145d67
--- /dev/null
+++ b/packages/win32/langs/gcs_English.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "EN"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_French.nsh b/packages/win32/langs/gcs_French.nsh
new file mode 100644
index 0000000..55e7c68
--- /dev/null
+++ b/packages/win32/langs/gcs_French.nsh
@@ -0,0 +1,68 @@
+${LSTR} LANG_CODE "FR"
+
+${LSTR} INSTALL_APP_DEP "Défaut"
+${LSTR} INSTALL_FULL "Complète"
+${LSTR} INSTALL_APP_ONLY "Seulement ${PRODUCT_NAME}"
+
+${LSTR} PRE_MULTIPLE "Le programme d'installation de ${PRODUCT_NAME} ${PRODUCT_VERSION} est déjà lancé."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Gestionnaire de collections personnelles"
+${LSTR} LINK_UPDATE "Mettre à jour les modules"
+${LSTR} LINK_UPDATE_DESCRIPTION "Télécharge et installe les corrections dans les modules (ne modifie pas l'application elle-même)"
+${LSTR} LINK_SITE "Site web"
+${LSTR} LINK_SITE_DESCRIPTION "Visiter le site Web de ${PRODUCT_NAME}"
+${LSTR} LINK_REMOVE "Désinstaller"
+${LSTR} LINK_REMOVE_DESCRIPTION "Supprimer ${PRODUCT_NAME} du système"
+
+${LSTR} FILE_DESC "Collection ${PRODUCT_NAME}"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Téléchargement de %s"
+${LSTR} DOWNLOAD_CONNECTING "Connection en cours..."
+${LSTR} DOWNLOAD_SECOND "seconde"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "heure"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dko (%d%%) sur %dko"
+${LSTR} DOWNLOAD_REMAINING " (Temps restant : %d %s%s)"
+
+${LSTR} PERL_VERIFYING "Verification des modules Perl disponibles..."
+${LSTR} PERL_INSTALLING "Installation du module"
+${LSTR} PERL_UPDATING "Mise a jour du module"
+${LSTR} PERL_WAIT "Veuillez patientez, cela peut durer un certain temps..."
+${LSTR} PERL_INSTALLERROR "ActivePerl n'a pas été installé.$\r$\n \
+Sans ce programme ${PRODUCT_NAME} ne pourra pas fonctionner.$\r$\n \
+Veuillez l'installer manuellement et relancer cette installation.$\r$\n \
+Voulez-vous vous rendre sur la page de téléchargement d'ActivePerl ?"
+
+${LSTR} SEC_DEPENDENCIES "Dépendances"
+${LSTR} SEC_ACTIVEPERL "Installer ActivePerl"
+${LSTR} SEC_LIB "Bibliothèques Gtk2"
+${LSTR} SEC_PPM "Modules Perl"
+${LSTR} SEC_UN "Supprimer version précédente"
+${LSTR} SEC_ICONS "Icones"
+${LSTR} SEC_DSK "Icone sur le bureau"
+${LSTR} SEC_QUICK "Icone de lancement rapide"
+
+${LSTR} DESC_DEPENDENCIES "Installer d'autres programmes utilisés par ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Télécharger (environ 12.5 Mo) et installer ActivePerl."
+${LSTR} DESC_GTKPERL "Installer les dépendances Gtk2. Si vous n'êtes pas sûr, installez les."
+${LSTR} DESC_GTK "Installer les librairies Gtk2 utilisées par ${PRODUCT_NAME}."
+${LSTR} DESC_PERL "Installer les liaisons pour Perl (Modules ActivePerl)."
+${LSTR} DESC_UN "Supprimer la précédente installation."
+${LSTR} DESC_APP "Installer les composants de ${PRODUCT_NAME} (Obligatoire)."
+${LSTR} DESC_ICONS "Ajouter des icones de lancement."
+${LSTR} DESC_DESKTOP "Ajoute une icone sur le bureau."
+${LSTR} DESC_QUICK "Ajoute une icone dans la barre de lancement rapide (si disponible)."
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} nécessite un changement dans l'environnement pour pouvoir fonctionner. Voulez vous que ce soit fait pour tous les utilisateurs ?$\r$\nEn répondant Non, cela sera uniquement fait pour l'utilisateur courant.$\r$\n(Des permissions administrateur sont nécessaires pour le faire pour tous les utilisateurs)"
+${LSTR} INSTALL_ALL_ERROR "L'environnement ne peut être changé pour tous les utilisateurs$\r$\nVoulez vous essayer de le changer pour celui courant?"
+${LSTR} INSTALL_USER_ERROR "L'environnement ne peut pas être changé pour l'utilisateur courant."
+
+${LSTR} FINISH_LAUNCH "Lancer ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visiter le site web ${PRODUCT_NAME}"
+
+${LSTR} UN_QUESTION "Voulez vous vraiment supprimer $(^Name) et tous ses composants ?"
+${LSTR} UN_PERSO "Voulez-vous aussi supprimer vos informations personnelles (collections et configuration) ?"
+${LSTR} UN_SUCESS "$(^Name) a été supprimé avec succès de votre ordinateur."
+${LSTR} UN_ABORTED "La désinstallation a été arrêtée."
diff --git a/packages/win32/langs/gcs_German.nsh b/packages/win32/langs/gcs_German.nsh
new file mode 100644
index 0000000..8bd6445
--- /dev/null
+++ b/packages/win32/langs/gcs_German.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "DE"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Italian.nsh b/packages/win32/langs/gcs_Italian.nsh
new file mode 100644
index 0000000..a6c1c52
--- /dev/null
+++ b/packages/win32/langs/gcs_Italian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "IT"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Polish.nsh b/packages/win32/langs/gcs_Polish.nsh
new file mode 100644
index 0000000..b1bbd21
--- /dev/null
+++ b/packages/win32/langs/gcs_Polish.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "PL"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Romanian.nsh b/packages/win32/langs/gcs_Romanian.nsh
new file mode 100644
index 0000000..a0b3406
--- /dev/null
+++ b/packages/win32/langs/gcs_Romanian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "RO"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Russian.nsh b/packages/win32/langs/gcs_Russian.nsh
new file mode 100644
index 0000000..655b6b5
--- /dev/null
+++ b/packages/win32/langs/gcs_Russian.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "RU"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_SerbianLatin.nsh b/packages/win32/langs/gcs_SerbianLatin.nsh
new file mode 100644
index 0000000..3f6df2d
--- /dev/null
+++ b/packages/win32/langs/gcs_SerbianLatin.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "SR"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Spanish.nsh b/packages/win32/langs/gcs_Spanish.nsh
new file mode 100644
index 0000000..71b02ea
--- /dev/null
+++ b/packages/win32/langs/gcs_Spanish.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "ES"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/langs/gcs_Turkish.nsh b/packages/win32/langs/gcs_Turkish.nsh
new file mode 100644
index 0000000..3fe329f
--- /dev/null
+++ b/packages/win32/langs/gcs_Turkish.nsh
@@ -0,0 +1,70 @@
+${LSTR} LANG_CODE "TR"
+
+${LSTR} REMOVE_PREVIOUS "A previous installation of ${PRODUCT_NAME} has been detected. Do you want to uninstall it before continuing?"
+${LSTR} INSTALL_APP_DEP "Default"
+${LSTR} INSTALL_FULL "Full"
+${LSTR} INSTALL_APP_ONLY "${PRODUCT_NAME} only"
+
+${LSTR} PRE_MULTIPLE "The ${PRODUCT_NAME} ${PRODUCT_VERSION} installer is already running."
+
+${LSTR} LINK_APPLICATION "${PRODUCT_NAME}"
+${LSTR} LINK_APPLICATION_DESCRIPTION "Personal collections manager"
+${LSTR} LINK_UPDATE "Update plugins"
+${LSTR} LINK_UPDATE_DESCRIPTION "Download and install bug fixes in plugins (do not change the application itself)"
+${LSTR} LINK_SITE "Website"
+${LSTR} LINK_SITE_DESCRIPTION "Visit ${PRODUCT_NAME} website"
+${LSTR} LINK_REMOVE "Uninstall"
+${LSTR} LINK_REMOVE_DESCRIPTION "Remove ${PRODUCT_NAME} from the system"
+
+${LSTR} FILE_DESC "${PRODUCT_NAME} Collection"
+
+${LSTR} DOWNLOAD_DOWNLOADING "Downloading %s"
+${LSTR} DOWNLOAD_CONNECTING "Connecting..."
+${LSTR} DOWNLOAD_SECOND "second"
+${LSTR} DOWNLOAD_MINUTE "minute"
+${LSTR} DOWNLOAD_HOUR "hour"
+${LSTR} DOWNLOAD_PLURAL "s"
+${LSTR} DOWNLOAD_PROGRESS "%dkB (%d%%) of %dkB"
+${LSTR} DOWNLOAD_REMAINING " (%d %s%s remaining)"
+
+${LSTR} PERL_VERIFYING "Checking available Perl modules..."
+${LSTR} PERL_INSTALLING "Installing module:"
+${LSTR} PERL_UPDATING "Updating module:"
+${LSTR} PERL_WAIT "Please wait as it could take a long time..."
+${LSTR} PERL_INSTALLERROR "ActivePerl has not been installed.$\r$\n \
+This software is required by ${PRODUCT_NAME}.$\r$\n \
+Please install it manually and launch again this installation.$\r$\n \
+Do you want to go to ActivePerl download page?"
+
+${LSTR} SEC_DEPENDENCIES "Dependencies"
+${LSTR} SEC_ACTIVEPERL "Install ActivePerl"
+${LSTR} SEC_LIB "Gtk2 libraries"
+${LSTR} SEC_PPM "Perl Modules"
+${LSTR} SEC_UN "Uninstall previous version"
+${LSTR} SEC_ICONS "Icons"
+${LSTR} SEC_DSK "Desktop icon"
+${LSTR} SEC_QUICK "Quick launch icon"
+
+${LSTR} DESC_DEPENDENCIES "Install softwares needed by ${PRODUCT_NAME}."
+${LSTR} DESC_ACTIVEPERL "Download (around 12.5 MB) and install ActivePerl."
+${LSTR} DESC_GTKPERL "Install all needed dependancies (Optional). If you are not sure, install them"
+${LSTR} DESC_GTK "Install Gtk2 libraries needed by ${PRODUCT_NAME}"
+${LSTR} DESC_PERL "Install Perl bindings (ActivePerl modules)"
+${LSTR} DESC_UN "Remove the previous ${PRODUCT_NAME} installation."
+${LSTR} DESC_APP "Install ${PRODUCT_NAME} components (Mandatory)."
+${LSTR} DESC_ICONS "Add some shortcut icons."
+${LSTR} DESC_DESKTOP "Add an icon on the desktop."
+${LSTR} DESC_QUICK "Add an icon in the quick launch bar (when available)"
+
+${LSTR} INSTALL_USER "${PRODUCT_NAME} needs some changes in environment to be able to run. Do you these changes to be perfomed for all users?$\r$\nSaying no here will change the environment for the current user only.$\r$\n(Administrator permissions required for all users)"
+${LSTR} INSTALL_ALL_ERROR "The environment could not be changed for all users$\r$\nShould I try for the current user?"
+${LSTR} INSTALL_USER_ERROR "The environment could not be changed for the current user."
+
+${LSTR} FINISH_LAUNCH "Launch ${PRODUCT_NAME}"
+${LSTR} FINISH_WEBSITE "Visit ${PRODUCT_NAME} website"
+
+${LSTR} UN_QUESTION "Are you sure to want to totaly remove $(^Name) and all of his composants?"
+${LSTR} UN_PERSO "Do you want also to remove your personal data (collections and configuration)?"
+${LSTR} UN_SUCESS "$(^Name) has been successfullly removed from your computer."
+${LSTR} UN_ABORTED "Uninstall has been aborted."
+
diff --git a/packages/win32/update.bat b/packages/win32/update.bat
new file mode 100644
index 0000000..7dcfb6c
--- /dev/null
+++ b/packages/win32/update.bat
@@ -0,0 +1,4 @@
+@echo off
+cd %0\..
+set PATH=..\usr\bin;..\usr\lib;%PATH%
+start "" gcstar.exe -u -n
diff --git a/share/applications/gcstar-thumbnailer b/share/applications/gcstar-thumbnailer
new file mode 100644
index 0000000..ff054fe
--- /dev/null
+++ b/share/applications/gcstar-thumbnailer
@@ -0,0 +1,260 @@
+#!/usr/bin/perl
+use strict;
+
+use XML::Simple;
+use URI::file;
+use Gtk2;
+
+{
+ # GCS file to load
+ my $uriIn = URI->new($ARGV[0]);
+ my $fileIn = $uriIn->file;
+
+ my $maxIcons = 16;
+ my $itemsPerRow = 4;
+ my $skin;
+ my $skinFile;
+
+ # Find user selected skin
+ # Fix - hardcoded path
+ open (CONF, $ENV{'HOME'}.'/.config/gcstar/GCstar.conf');
+ my $line;
+ foreach $line (<CONF>) {
+ if ($line =~ /listImgSkin=(.*)/)
+ {
+ $skinFile= $1;
+ }
+ }
+ if (!$skinFile)
+ {
+ $skinFile = "Wood";
+ }
+ close (CONF);
+
+ # Fix - hardcoded path
+ $skin = "/usr/local/share/gcstar/list_bg/".$skinFile."/list_bg.png";
+
+ # Load the collection file temporarily, to grab the model type
+ my $collectionXML= XMLin($fileIn, forcearray => 1);
+
+ # Load the collection model to determine id and cover fields
+ # Fix - hardcoded path
+ my $collectionModel = XMLin("/usr/local/lib/gcstar/GCModels/".$collectionXML->{type}.".gcm");
+ my $idField = $collectionModel->{options}->{fields}->{id};
+ my $picField = $collectionModel->{options}->{fields}->{cover};
+
+ # Now that we now the id field, reopen collection xml using proper id
+ $collectionXML= XMLin($fileIn, forcearray => 1, keyattr=>$idField);
+ my $collectionItems=$collectionXML->{item};
+
+ my $count;
+ my $favCount;
+ my $nonFavCount;
+ my @images;
+ my @favourites;
+ my @nonFavourites;
+
+ # Hacky part, but for some reason items won't load as an array, so just jump through collection grabbing the first few covers
+ # (Prefer favourites - so I don't see romantic comedies as the thumbnail for my films!!)
+
+ foreach my $collectionItem (values %$collectionItems)
+ {
+ if ($collectionItem->{$picField})
+ {
+ if ($collectionItem->{favourite})
+ {
+ if ($favCount < $maxIcons)
+ {
+ @favourites[$favCount] = $collectionItem->{$picField};
+ $favCount++;
+ }
+ }
+ else
+ {
+ @nonFavourites[$nonFavCount] = $collectionItem->{$picField};
+ $nonFavCount++;
+ }
+
+ }
+ }
+
+ # Load a few pixbufs
+ my $gcstarIconPixBuf;
+ my $backgroundPixBuf;
+
+ # Fix - hardcoded path
+ $gcstarIconPixBuf = Gtk2::Gdk::Pixbuf->new_from_file("/usr/local/share/gcstar/icons/gcstar_24x24.png");
+ $backgroundPixBuf = Gtk2::Gdk::Pixbuf->new_from_file($skin);
+
+
+ my $tempPixbuf;
+ my @pixBuf;
+ my $bgWidth = $backgroundPixBuf->get_width;
+ my $bgHeight = $backgroundPixBuf->get_height;
+ my $maxHeight;
+
+ # Load covers to pixbufs, scale them to fit in background
+ for (my $imgCount = 0; $imgCount < $maxIcons; $imgCount++)
+ {
+ if (@favourites[$imgCount])
+ {
+ @pixBuf[$imgCount] = Gtk2::Gdk::Pixbuf->new_from_file(@favourites[$imgCount]);
+ # Scale to 80% of background size (seems like a good size)
+ @pixBuf[$imgCount] = scaleMaxPixbuf(@pixBuf[$imgCount], $bgWidth*.80, $bgHeight*.80);
+ if (@pixBuf[$imgCount]->get_height > $maxHeight)
+ {
+ $maxHeight = @pixBuf[$imgCount]->get_height;
+ }
+ }
+ elsif (@nonFavourites[$imgCount - $favCount])
+ {
+ @pixBuf[$imgCount] = Gtk2::Gdk::Pixbuf->new_from_file(@nonFavourites[$imgCount - $favCount]);
+ # Scale to 80% of background size (seems like a good size)
+ @pixBuf[$imgCount] = scaleMaxPixbuf(@pixBuf[$imgCount], $bgWidth*.80, $bgHeight*.80);
+ if (@pixBuf[$imgCount]->get_height > $maxHeight)
+ {
+ $maxHeight = @pixBuf[$imgCount]->get_height;
+ }
+ }
+ else
+ {
+ # If we run out of items in the collection with covers, just make empty pixbufs for simplicity
+ @pixBuf[$imgCount] = Gtk2::Gdk::Pixbuf->new('rgb',1,8,$bgWidth * .80,$bgHeight * .80);
+ @pixBuf[$imgCount]->fill(0x00000000);
+ }
+ }
+
+ my $factor;
+ my $rows;
+ my $destHeight;
+
+ # Change the positioning slightly if it's a reflection type skin (items sit higher on shelf)
+ # Work out number of rows of pictures, and desired height of rows (not much logic to these numbers,
+ # it's just what looks good)
+ if ($skinFile =~ /Glass/)
+ {
+ $factor = 40;
+ if ($maxHeight < 70)
+ {
+ $rows = 4;
+ $destHeight = $bgHeight - 145;
+ }
+ elsif ($maxHeight < 130)
+ {
+ $rows = 3;
+ $destHeight = $bgHeight - 100;
+ }
+ else
+ {
+ $rows = 2;
+ $destHeight = $bgHeight;
+ }
+ }
+ else
+ {
+ $factor = 10;
+ if ($maxHeight < 70)
+ {
+ $rows = 4;
+ $destHeight = $bgHeight - 60;
+ }
+ elsif ($maxHeight < 130)
+ {
+ $rows = 3;
+ $destHeight = $bgHeight - 15;
+ }
+ else
+ {
+ $rows = 3;
+ $destHeight = $bgHeight;
+ }
+ }
+
+ # Put covers on background
+ for (my $imgCount = 0; $imgCount < $itemsPerRow * $rows; $imgCount++)
+ {
+ $tempPixbuf = $backgroundPixBuf->copy;
+ @pixBuf[$imgCount]->composite($tempPixbuf,
+ ( $bgWidth - @pixBuf[$imgCount]->get_width ) / 2,
+ $bgHeight - @pixBuf[$imgCount]->get_height - $factor,
+ @pixBuf[$imgCount]->get_width, @pixBuf[$imgCount]->get_height,
+ ( $bgWidth - @pixBuf[$imgCount]->get_width ) / 2,
+ $bgHeight - @pixBuf[$imgCount]->get_height - $factor,
+ 1, 1,
+ 'nearest', 255);
+
+ if ($rows > 2)
+ {
+ # If needed, crop image to avoid wasted space
+ $tempPixbuf = $tempPixbuf->new_subpixbuf(0,$bgHeight-$destHeight,$bgWidth,$destHeight);
+ }
+ @pixBuf[$imgCount] = $tempPixbuf;
+ }
+
+ # Get pixbuf ready for final image
+ $tempPixbuf = Gtk2::Gdk::Pixbuf->new('rgb',1,8,$bgWidth * $itemsPerRow,$destHeight * $rows);
+ $tempPixbuf->fill(0x00000000);
+
+ # Put each cover in place
+ for (my $imgCount = 0; $imgCount < $itemsPerRow * $rows; $imgCount++)
+ {
+ @pixBuf[$imgCount]->composite($tempPixbuf,
+ @pixBuf[0]->get_width * ($imgCount % $itemsPerRow),
+ @pixBuf[0]->get_height * int($imgCount / $itemsPerRow),
+ @pixBuf[5]->get_width,
+ @pixBuf[5]->get_height,
+ @pixBuf[0]->get_width * ($imgCount % $itemsPerRow),
+ @pixBuf[0]->get_height * int($imgCount / $itemsPerRow),
+ 1, 1, 'nearest', 255);
+ }
+
+ # Scale to specified size, or else to max 128 pixels wide/high
+ if ($ARGV[2])
+ {
+ $tempPixbuf = scaleMaxPixbuf($tempPixbuf,$ARGV[2],$ARGV[2]);
+ }
+ else
+ {
+ $tempPixbuf = scaleMaxPixbuf($tempPixbuf,128,128);
+ }
+
+ # Place little gcstar icon in corner
+ $gcstarIconPixBuf->composite($tempPixbuf,
+ $tempPixbuf->get_width - $gcstarIconPixBuf->get_width - 4,
+ $tempPixbuf->get_height - $gcstarIconPixBuf->get_height - 5,
+ $gcstarIconPixBuf->get_width,
+ $gcstarIconPixBuf->get_height,
+ $tempPixbuf->get_width - $gcstarIconPixBuf->get_width - 4,
+ $tempPixbuf->get_height - $gcstarIconPixBuf->get_height - 5,
+ 1,1,'nearest',255);
+
+ # Save pixbuf
+ $tempPixbuf->save($ARGV[1],"png");
+
+}
+
+sub scaleMaxPixbuf
+{
+ my ($pixbuf, $maxWidth, $maxHeight) = @_;
+
+ my ($width, $height) = ($pixbuf->get_width, $pixbuf->get_height);
+ if (($height > $maxHeight) || ($width > $maxWidth))
+ {
+ my ($newWidth, $newHeight);
+ my $ratio = $height / $width;
+ if (($width) * ($maxHeight / $height) < $maxWidth)
+ {
+ $newHeight = $maxHeight;
+ $newWidth = $newHeight / $ratio;
+ }
+ else
+ {
+ $newWidth = $maxWidth;
+ $newHeight = $newWidth * $ratio;
+ }
+
+ $pixbuf = $pixbuf->scale_simple($newWidth, $newHeight, 'bilinear');
+ }
+
+ return $pixbuf;
+}
diff --git a/share/applications/gcstar.desktop b/share/applications/gcstar.desktop
new file mode 100644
index 0000000..aa6a46d
--- /dev/null
+++ b/share/applications/gcstar.desktop
@@ -0,0 +1,18 @@
+[Desktop Entry]
+Version=1.0
+Name=GCstar Collections Manager
+Name[es]=Gestor de colecciones GCstar
+Name[fr]=GCstar gestionnaire de collections
+GenericName=Personal Collections Manager
+Comment=Manage your collections of movies, games, books, music and more
+Comment[en]=Manage your collections of movies, games, books, music and more
+Comment[es]=Organice sus colecciones de películas, juegos, libros, música y más
+Comment[fr]=Gérer vos collections de films, jeux vidéos, livres, musique,...
+Comment[pt]=Organize as suas colecções de filmes, jogos, vídeos, livros e música...
+Exec=gcstar %f
+Icon=gcstar
+Terminal=false
+StartupNotify=true
+Type=Application
+Categories=Office;
+MimeType=application/x-gcstar
diff --git a/share/applications/gcstar.xml b/share/applications/gcstar.xml
new file mode 100644
index 0000000..c342767
--- /dev/null
+++ b/share/applications/gcstar.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ <mime-type type="application/x-gcstar">
+ <comment>GCstar collection</comment>
+ <glob pattern="*.gcs"/>
+ </mime-type>
+</mime-info>
diff --git a/share/gcstar/LICENSE b/share/gcstar/LICENSE
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/share/gcstar/LICENSE
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/share/gcstar/fonts/AUTHORS b/share/gcstar/fonts/AUTHORS
new file mode 100644
index 0000000..8448d44
--- /dev/null
+++ b/share/gcstar/fonts/AUTHORS
@@ -0,0 +1,8 @@
+Designer:
+
+ Steve Matteson (Ascender Corp.)
+ http://www.ascendercorp.com/typedesigners.html
+
+Maintainer:
+
+ Caius 'kaio' Chance <k AT kaio.me>
diff --git a/share/gcstar/fonts/COPYING b/share/gcstar/fonts/COPYING
new file mode 100644
index 0000000..846b7da
--- /dev/null
+++ b/share/gcstar/fonts/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/share/gcstar/fonts/ChangeLog b/share/gcstar/fonts/ChangeLog
new file mode 100644
index 0000000..4ceea3f
--- /dev/null
+++ b/share/gcstar/fonts/ChangeLog
@@ -0,0 +1,176 @@
+* Tue 14 Jul 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Generated TTFs with tradition kern table, with fontforge ver 20090408.
+- Added make target alias dist-src as dist-sfd.
+
+* Mon 13 Jul 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Updated for generation of traditional kern table via scripts.
+
+* Mon 06 Jul 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Reconverted SFDs from original TTFs with traditional kern table.
+- Updated "clean" target in Makefile.
+
+* Tue 30 Jun 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Reconverted SFDs from original TTFs with traditional kern table.
+- Updated "clean" target in Makefile.
+
+* Tue 30 Jun 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Generated cleaner SFD from original TTFs.
+- Include Makefile in sources tarball.
+
+* Wed 24 Jun 2009 Caius 'kaio' Chance <me AT kaio.me>
+- Makefile: pack SFD files as source tarball.
+- Makefile: pack TTF files as ttf packs.
+- Tidy up repository.
+- Updated documents.
+
+* Mon 12 Jan 2009 Caius Chance <cchance@redhat.com>
+- Fixed copyright holder name typo for Sans Regular font (rhbz#479521).
+
+* Tue 09 Dec 2008 Caius Chance <cchance@redhat.com>
+- Changed cent sign glyph (U+00A2) to be coressed in Sans and Mono
+ (rhbz#474522).
+
+* Wed 03 Dec 2008 Caius Chance <cchance@redhat.com>
+- Started 1.04.93.devel.
+- Fixed blurriness of U+03BC for Sans Regular font (rhbz#473481).
+- Fixed src tarball mis-inclusion of dist files in Makefile.
+
+* Fri 28 Nov 2008 Caius Chance <cchance@redhat.com>
+- Corrected version number in Makefile.
+- Fixed make target of source tarball.
+- Uploaded 1.04.92 source tarball to release area.
+
+* Wed 15 Oct 2008 Caius Chance <cchance@redhat.com>
+- Fixed blurred 'u' and 'W' for Sans Bold font (rhbz#463036).
+- Released as version 1.04.92
+
+* Wed 17 Sep 2008 Caius Chance <cchance@redhat.com>
+- Fixed missing hinting instructions for all Mono fonts (rhbz#460090).
+- Fixed missing hinting instructions for all Sans fonts (rhbz#460090).
+- Fixed missing hinting instructions for all Serif fonts (rhbz#460090).
+- Released as version 1.04.91
+
+* Tue 09 Sep 2008 Caius Chance <cchance@redhat.com>
+- Backed up all released files in ./dist directory.
+
+* Fri 05 Sep 2008 Caius Chance <cchance@redhat.com>
+- Fixed incorrect glyph points and missing hinting instructions for:
+ Mono Bold Italic (up to U+2012) (rhbz#460090).
+
+* Mon 25 Aug 2008 Caius Chance <cchance@redhat.com>
+- Fixed incorrect glyph points and missing hinting instructions for:
+ U+0079, U+03BC, U+0431, U+2010..2012, U+1114117 (rhbz#458592).
+- Released as version 1.04.90.
+
+* Thu 13 Jul 2008 Caius Chance <cchance@redhat.com>
+- Released as version 1.04.
+
+* Thu 12 Jun 2008 Caius Chance <cchance@redhat.com>
+- Released as version 1.04.beta2 (1.03.99).
+- Added ZIP package building for non-tar users.
+- rhbz#440992:
+ - Created Romanian "T/t/S/s with comma below" (U+0218..021B) on all fonts.
+ - Fixed "T/s with cedilla below" (U+0162/0163) on all fonts.
+ - Created "Hyphen" and "Non-Breaking Hyphen" (U+2010..2011) on all fonts.
+
+* Wed 11 Jun 2008 Caius Chance <cchance@redhat.com>
+- Added last Version 1.03 from original manufacturer.
+- Renamed directory 'archive' to 'sandbox'.
+- Added directory description in hosting home directory.
+- Created ZIP packages for Version 1.03 and 1.04.beta.
+
+* Tue 04 Jun 2008 Caius Chance <cchance@redhat.com>
+- rhbz#440992:
+ - Created "Hyphen" and "Non-Breaking Hyphen" (U+2010..2011) on Sans Regular.
+
+* Mon 03 Jun 2008 Caius Chance <cchance@redhat.com>
+- rhbz#440992:
+ - Created Romanian "T/t/S/s with comma below" (U+0218..021B) on Sans Regular.
+ - Fixed "T/s with cedilla below" (U+0162/0163) on Sans Regular.
+
+* Fri 30 May 2008 Caius Chance <cchance@redhat.com>
+- Release Version 1.04.beta (liberation-fonts-1_04_beta).
+
+* Thu 29 May 2008 Caius Chance <cchance@redhat.com>
+- Correct SFD version numbers in "TTF Info" categor for correct version
+ number during export to TTFs.
+
+* Wed 28 May 2008 Caius Chance <cchance@redhat.com>
+- Reencoded with "Glyph Order" by FontForge.
+- Corrected font name for all Regular fonts.
+- Generated TTFs (experimantal, in "archive") with old stle kern and dummy
+ DSIG table.
+- Updated README in 1.04b TTFs (experimental, in "archive").
+
+* Tue 27 May 2008 Caius Chance <cchance@redhat.com>
+- Fixed Unicode name mis-mapping of Sans and Serif TTF files.
+- Regenerate SFD files from Unicode name mis-mapping fixed Sans and Serif TTF
+ files.
+
+* Mon 26 May 2008 Caius Chance <cchance@redhat.com>
+- Fixed Unicode name mis-mapping of Mono TTF files.
+- Regenerate SFD files from Unicode name mis-mapping fixed Mono TTF files.
+==========
+- Applied following patches submitted by Nicolas Spalinger
+ <nicolas_spalinger sil org>:
+ - We-need-versioned-tarballs.
+ - Add-ignore-file-so-the-VCS-does-not-track-the-folder.
+ - Adjust-path-for-various-Makefile-targets-subfolders.
+ - Fix-versionning-mismatch-in-the-binary-font-metadata.
+ - Add-some-description-and-extra-lines-to-the-build-ta.
+ - Reword-and-restructure-maintainers-recommendations.
+ - Some-rewording-of-the-readme-file.
+==========
+
+* Thu May 22 2008 Caius Chance <cchance@redhat.com>
+- Added latest (1.03) TTF files from Ascender. (in 'archive')
+
+* Fri May 16 2008 Caius Chance <cchance@redhat.com>
+- Change source tree as 'trunk', 'tags', 'branches'.
+==========
+- Applied following patches submitted by Nicolas Spalinger
+ <nicolas_spalinger sil org>:
+ - Add-more-information-about-the-upstream-designer.
+ - Minor-typo-and-layout-fixes.
+ - Adjust-fontforge-path-with-env-as-a-source-build.
+==========
+
+* Wed May 14 2008 Caius Chance <cchance@redhat.com>
+- Renamed target 'ttf' to 'build'.
+- Removed 'Re-Package' chapter from README and refine contents.
+- Changed AUTHORS contents.
+- Created maintainer documentation MAINTAINER.
+
+* Tue May 06 2008 Caius Chance <cchance@redhat.com>
+- Refined clean target.
+- Removed TTFs from git.
+
+* Fri May 02 2008 Caius Chance <cchance@redhat.com>
+- Imported into fedorahosted.org repository and be hosted.
+ https://fedorahosted.org/liberation-fonts/
+- Modified source root directory name definition in Makefile.
+- Created 'dist' target for binary TTF tarball and 'src' for source tarball.
+- Corrected Regular fonts filenames.
+- Added TTF -> SFD make target.
+
+* Thu May 01 2008 Caius Chance <cchance@redhat.com>
+- Converted previous TTF files into SFD files to be open source.
+- Created fontforge SFD -> TTF scripts.
+- Created Makefile.
+- Added documentations: AUTHORS, ChangeLog, README.
+
+* Thu Apr 10 2008 Caius Chance <cchance@redhat.com>
+- Fixed exchanged and incomplete glyphs (from Ascender).
+- Repacked source tarball.
+- Released version 1.03.
+
+* Tue Mar 25 2008 Caius Chance <cchance@redhat.com>
+- Fixed alignment mismatch of dot accents (from Ascender).
+- Released version 1.02.
+
+* Mon Jan 14 2008 Caius Chance <cchance@redhat.com>
+- Updated new source tarball from Ascender.
+- Released version 1.0.
+
+* Thu Jun 14 2007 Caius Chance <cchance@redhat.com>
+- Updated new source tarball from Ascender.
diff --git a/share/gcstar/fonts/LiberationSans-Regular.ttf b/share/gcstar/fonts/LiberationSans-Regular.ttf
new file mode 100644
index 0000000..4b2ebce
--- /dev/null
+++ b/share/gcstar/fonts/LiberationSans-Regular.ttf
Binary files differ
diff --git a/share/gcstar/fonts/License.txt b/share/gcstar/fonts/License.txt
new file mode 100644
index 0000000..f178728
--- /dev/null
+++ b/share/gcstar/fonts/License.txt
@@ -0,0 +1,19 @@
+LICENSE AGREEMENT AND LIMITED PRODUCT WARRANTY
+LIBERATION FONT SOFTWARE
+
+This agreement governs the use of the Software and any updates to the Software, regardless of the delivery mechanism. Subject to the following terms, Red Hat, Inc. ("Red Hat") grants to the user ("Client") a license to this work pursuant to the GNU General Public License v.2 with the exceptions set forth below and such other terms as are set forth in this End User License Agreement.
+
+ 1. The Software and License Exception. LIBERATION font software (the "Software") consists of TrueType-OpenType formatted font software for rendering LIBERATION typefaces in sans-serif, serif, and monospaced character styles. You are licensed to use, modify, copy, and distribute the Software pursuant to the GNU General Public License v.2 with the following exceptions:
+
+ (a) As a special exception, if you create a document which uses this font, and embed this font or unaltered portions of this font into the document, this font does not by itself cause the resulting document to be covered by the GNU General Public License. This exception does not however invalidate any other reasons why the document might be covered by the GNU General Public License. If you modify this font, you may extend this exception to your version of the font, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.
+
+ (b) As a further exception, any distribution of the object code of the Software in a physical product must provide you the right to access and modify the source code for the Software and to reinstall that modified version of the Software in object code form on the same physical product on which you received it.
+
+ 2. Intellectual Property Rights. The Software and each of its components, including the source code, documentation, appearance, structure and organization are owned by Red Hat and others and are protected under copyright and other laws. Title to the Software and any component, or to any copy, modification, or merged portion shall remain with the aforementioned, subject to the applicable license. The "LIBERATION" trademark is a trademark of Red Hat, Inc. in the U.S. and other countries. This agreement does not permit Client to distribute modified versions of the Software using Red Hat's trademarks. If Client makes a redistribution of a modified version of the Software, then Client must modify the files names to remove any reference to the Red Hat trademarks and must not use the Red Hat trademarks in any way to reference or promote the modified Software.
+
+ 3. Limited Warranty. To the maximum extent permitted under applicable law, the Software is provided and licensed "as is" without warranty of any kind, expressed or implied, including the implied warranties of merchantability, non-infringement or fitness for a particular purpose. Red Hat does not warrant that the functions contained in the Software will meet Client's requirements or that the operation of the Software will be entirely error free or appear precisely as described in the accompanying documentation.
+
+ 4. Limitation of Remedies and Liability. To the maximum extent permitted by applicable law, Red Hat or any Red Hat authorized dealer will not be liable to Client for any incidental or consequential damages, including lost profits or lost savings arising out of the use or inability to use the Software, even if Red Hat or such dealer has been advised of the possibility of such damages.
+
+ 5. General. If any provision of this agreement is held to be unenforceable, that shall not affect the enforceability of the remaining provisions. This agreement shall be governed by the laws of the State of North Carolina and of the United States, without regard to any conflict of laws provisions, except that the United Nations Convention on the International Sale of Goods shall not apply.
+Copyright © 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark of Red Hat, Inc.
diff --git a/share/gcstar/fonts/README b/share/gcstar/fonts/README
new file mode 100644
index 0000000..13d1bd4
--- /dev/null
+++ b/share/gcstar/fonts/README
@@ -0,0 +1,90 @@
+ 1. What's this?
+=================
+
+ The Liberation Fonts is font collection which aims display compatibility to
+ document files that used Times New Roman, Arial, Courier New as fonts.
+
+
+ 2. Requirements
+=================
+
+ * fontforge to be installed.
+ (http://fontforge.sourceforge.net)
+
+
+ 3. Install
+============
+
+ 3.1 Decompress tarball
+
+ You can extract the files by following command:
+
+ $ tar zxvf liberation-fonts-[VERSION].tar.gz
+
+ 3.2 Build from the source
+
+ Change into directory liberation-fonts-[VERSION]/ and build from sources by
+ following commands:
+
+ $ cd liberation-fonts-[VERSION]
+ $ make
+
+ The built font files will be available in 'build' directory.
+
+ 3.3 Install to system
+
+ You can manually install the fonts by copying the TTFs to ~/.fonts for user
+ wide usage, or to /usr/share/fonts/truetype/liberation for system-wide
+ availability.
+
+
+ 4. Usage
+==========
+
+ The fonts should be installed and detected by the system after installation.
+ Simply select preferred liberation font in applications and start using.
+
+
+ 5. License
+============
+
+ For redistribution information, please read the GPL license file 'COPYING'.
+
+ For EULA information, please read file 'License.txt'.
+
+
+ 6. Maintainers
+================
+
+ (FIXME)
+ Before packaging a new release based on a new source tarball, you have to
+ update the version number in the Makefile:
+
+ VER = [VERSION]
+
+ Make sure that the defined version corresponds to the font software metadata
+which you can check with ftinfo/otfinfo or fontforge itself. It is highly recommended that file 'ChangeLog' is updated to reflect
+changes.
+
+Create a tarball with the following command:
+$ make dist
+
+The new versionned tarball will be available in the dist/ folder as
+'liberation-fonts-[NEW_VERSION].tar.gz'.
+ (FIXME)
+
+ 7. Credits
+============
+
+Special thanks to all involved to the proejct of Liberation Fonts!
+
+ * Caius 'kaio' Chance <k AT kaio.me>
+ - Current project maintainer.
+
+ * Mark Webbink <mwebbink AT redhat.com>
+ - Release coordinator, Red Hat Inc.
+
+ * Steve Matteson
+ - Designer, Ascender Corp.
+
+ * And, all other anonymous participants.
diff --git a/share/gcstar/genres/EN.genres b/share/gcstar/genres/EN.genres
new file mode 100644
index 0000000..83074cb
--- /dev/null
+++ b/share/gcstar/genres/EN.genres
@@ -0,0 +1,12 @@
+Science Fiction|Sci-Fi,SF
+Fantasy|Fantastic,Fantastique,Fantastico,Fantascienza
+Comedy|Comedie,Commedia,Comédie
+Adventure|Avventura,Aventure,Action-Adventure
+Animation|Anime,Cartoon,Animated
+Music|Musical
+Thriller|Suspense
+Action|Martial Arts
+Family|Children,Kids
+Classic|Classics
+Television|TV
+War|Military \ No newline at end of file
diff --git a/share/gcstar/genres/ES.genres b/share/gcstar/genres/ES.genres
new file mode 100644
index 0000000..ead23a3
--- /dev/null
+++ b/share/gcstar/genres/ES.genres
@@ -0,0 +1,12 @@
+Ciencia Ficción|Sci-Fi,SF
+Fantástico|Fantastic,Fantastique,Fantastico,Fantascienza
+Comedia|Comedie,Commedia,Comédie,Comedy,Commedia
+Aventuras|Avventura,Aventure,Action-Adventure
+Animación|Anime,Cartoon,Animated
+Musical|Musical
+Thriller|Suspense
+Acción|Martial Arts
+Familiar|Children,Kids
+Clásico|Classics
+Televisión|TV
+Bélico|Military
diff --git a/share/gcstar/genres/FR.genres b/share/gcstar/genres/FR.genres
new file mode 100644
index 0000000..a450b52
--- /dev/null
+++ b/share/gcstar/genres/FR.genres
@@ -0,0 +1,4 @@
+Comédie|Comedie,Comedy,Commedia
+Aventure|Avventura,Adventure
+Fantastique|Fantastico,Fantascienza,Fantastic
+Science Fiction|SF,Sci-Fi \ No newline at end of file
diff --git a/share/gcstar/helpers/xdg-open b/share/gcstar/helpers/xdg-open
new file mode 100644
index 0000000..e25e67f
--- /dev/null
+++ b/share/gcstar/helpers/xdg-open
@@ -0,0 +1,469 @@
+#!/bin/sh
+#---------------------------------------------
+# xdg-open
+#
+# Utility script to open a URL in the registered default application.
+#
+# Refer to the usage() function below for usage.
+#
+# Copyright 2006, Kevin Krammer <kevin.krammer@gmx.at>
+# Copyright 2006, Jeremy White <jwhite@codeweavers.com>
+#
+# LICENSE:
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+#
+#---------------------------------------------
+
+manualpage()
+{
+cat << _MANUALPAGE
+Name
+
+xdg-open ? opens a file or URL in the user's preferred application
+
+Synopsis
+
+xdg-open { file | URL }
+
+xdg-open { --help | --manual | --version }
+
+Description
+
+xdg-open opens a file or URL in the user's preferred application. If a URL is
+provided the URL will be opened in the user's preferred web browser. If a file
+is provided the file will be opened in the preferred application for files of
+that type. xdg-open supports file, ftp, http and https URLs.
+
+xdg-open is for use inside a desktop session only. It is not recommended to use
+xdg-open as root.
+
+Options
+
+--help
+ Show command synopsis.
+--manual
+ Show this manualpage.
+--version
+ Show the xdg-utils version information.
+
+Exit Codes
+
+An exit code of 0 indicates success while a non-zero exit code indicates
+failure. The following failure codes can be returned:
+
+1
+ Error in command line syntax.
+2
+ One of the files passed on the command line did not exist.
+3
+ A required tool could not be found.
+4
+ The action failed.
+
+Examples
+
+xdg-open 'http://www.freedesktop.org/'
+
+Opens the Freedesktop.org website in the user's default browser
+
+xdg-open /tmp/foobar.png
+
+Opens the PNG image file /tmp/foobar.png in the user's default image viewing
+application.
+
+_MANUALPAGE
+}
+
+usage()
+{
+cat << _USAGE
+xdg-open ? opens a file or URL in the user's preferred application
+
+Synopsis
+
+xdg-open { file | URL }
+
+xdg-open { --help | --manual | --version }
+
+_USAGE
+}
+
+#@xdg-utils-common@
+
+#----------------------------------------------------------------------------
+# Common utility functions included in all XDG wrapper scripts
+#----------------------------------------------------------------------------
+
+DEBUG()
+{
+ [ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && return 0;
+ [ ${XDG_UTILS_DEBUG_LEVEL} -lt $1 ] && return 0;
+ shift
+ echo "$@" >&2
+}
+
+#-------------------------------------------------------------
+# Exit script on successfully completing the desired operation
+
+exit_success()
+{
+ if [ $# -gt 0 ]; then
+ echo "$@"
+ echo
+ fi
+
+ exit 0
+}
+
+
+#-----------------------------------------
+# Exit script on malformed arguments, not enough arguments
+# or missing required option.
+# prints usage information
+
+exit_failure_syntax()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ echo "Try 'xdg-open --help' for more information." >&2
+ else
+ usage
+ echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
+ fi
+
+ exit 1
+}
+
+#-------------------------------------------------------------
+# Exit script on missing file specified on command line
+
+exit_failure_file_missing()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 2
+}
+
+#-------------------------------------------------------------
+# Exit script on failure to locate necessary tool applications
+
+exit_failure_operation_impossible()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 3
+}
+
+#-------------------------------------------------------------
+# Exit script on failure returned by a tool application
+
+exit_failure_operation_failed()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 4
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to read a specified file
+
+exit_failure_file_permission_read()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 5
+}
+
+#------------------------------------------------------------
+# Exit script on insufficient permission to read a specified file
+
+exit_failure_file_permission_write()
+{
+ if [ $# -gt 0 ]; then
+ echo "xdg-open: $@" >&2
+ fi
+
+ exit 6
+}
+
+check_input_file()
+{
+ if [ ! -e "$1" ]; then
+ exit_failure_file_missing "file '$1' does not exist"
+ fi
+ if [ ! -r "$1" ]; then
+ exit_failure_file_permission_read "no permission to read file '$1'"
+ fi
+}
+
+check_vendor_prefix()
+{
+ file_label="$2"
+ [ -n "$file_label" ] || file_label="filename"
+ file=`basename "$1"`
+ case "$file" in
+ [a-zA-Z]*-*)
+ return
+ ;;
+ esac
+
+ echo "xdg-open: $file_label '$file' does not have a proper vendor prefix" >&2
+ echo 'A vendor prefix consists of alpha characters ([a-zA-Z]) and is terminated' >&2
+ echo 'with a dash ("-"). An example '"$file_label"' is '"'example-$file'" >&2
+ echo "Use --novendor to override or 'xdg-open --manual' for additional info." >&2
+ exit 1
+}
+
+check_output_file()
+{
+ # if the file exists, check if it is writeable
+ # if it does not exists, check if we are allowed to write on the directory
+ if [ -e "$1" ]; then
+ if [ ! -w "$1" ]; then
+ exit_failure_file_permission_write "no permission to write to file '$1'"
+ fi
+ else
+ DIR=`dirname "$1"`
+ if [ ! -w "$DIR" -o ! -x "$DIR" ]; then
+ exit_failure_file_permission_write "no permission to create file '$1'"
+ fi
+ fi
+}
+
+#----------------------------------------
+# Checks for shared commands, e.g. --help
+
+check_common_commands()
+{
+ while [ $# -gt 0 ] ; do
+ parm="$1"
+ shift
+
+ case "$parm" in
+ --help)
+ usage
+ echo "Use 'man xdg-open' or 'xdg-open --manual' for additional info."
+ exit_success
+ ;;
+
+ --manual)
+ manualpage
+ exit_success
+ ;;
+
+ --version)
+ echo "xdg-open 1.0.2"
+ exit_success
+ ;;
+ esac
+ done
+}
+
+check_common_commands "$@"
+
+[ -z "${XDG_UTILS_DEBUG_LEVEL}" ] && unset XDG_UTILS_DEBUG_LEVEL;
+if [ ${XDG_UTILS_DEBUG_LEVEL-0} -lt 1 ]; then
+ # Be silent
+ xdg_redirect_output=" > /dev/null 2> /dev/null"
+else
+ # All output to stderr
+ xdg_redirect_output=" >&2"
+fi
+
+#--------------------------------------
+# Checks for known desktop environments
+# set variable DE to the desktop environments name, lowercase
+
+detectDE()
+{
+ if [ x"$KDE_FULL_SESSION" = x"true" ]; then DE=kde;
+ elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then DE=gnome;
+ elif `dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager > /dev/null 2>&1` ; then DE=gnome;
+ elif xprop -root _DT_SAVE_MODE 2> /dev/null | grep ' = \"xfce4\"$' >/dev/null 2>&1; then DE=xfce;
+ fi
+}
+
+#----------------------------------------------------------------------------
+# kfmclient exec/openURL can give bogus exit value in KDE <= 3.5.4
+# It also always returns 1 in KDE 3.4 and earlier
+# Simply return 0 in such case
+
+kfmclient_fix_exit_code()
+{
+ version=`kde${KDE_SESSION_VERSION}-config --version 2>/dev/null | grep KDE`
+ major=`echo $version | sed 's/KDE: \([0-9]\).*/\1/'`
+ minor=`echo $version | sed 's/KDE: [0-9]*\.\([0-9]\).*/\1/'`
+ release=`echo $version | sed 's/KDE: [0-9]*\.[0-9]*\.\([0-9]\).*/\1/'`
+ test "$major" -gt 3 && return $1
+ test "$minor" -gt 5 && return $1
+ test "$release" -gt 4 && return $1
+ return 0
+}
+
+open_kde()
+{
+ if kde-open -v 2>/dev/null 1>&2; then
+ kde-open "$1"
+ else
+ if [ x"$KDE_SESSION_VERSION" = x"4" ]; then
+ kfmclient openURL "$1"
+ else
+ kfmclient exec "$1"
+ kfmclient_fix_exit_code $?
+ fi
+ fi
+
+ if [ $? -eq 0 ]; then
+ exit_success
+ else
+ exit_failure_operation_failed
+ fi
+}
+
+open_gnome()
+{
+ if gvfs-open --help 2>/dev/null 1>&2; then
+ gvfs-open "$1"
+ else
+ gnome-open "$1"
+ fi
+
+ if [ $? -eq 0 ]; then
+ exit_success
+ else
+ exit_failure_operation_failed
+ fi
+}
+
+open_xfce()
+{
+ exo-open "$1"
+
+ if [ $? -eq 0 ]; then
+ exit_success
+ else
+ exit_failure_operation_failed
+ fi
+}
+
+open_generic()
+{
+ if mimeopen -v 2>/dev/null 1>&2; then
+ mimeopen -n "$1"
+ if [ $? -eq 0 ]; then
+ exit_success
+ fi
+ fi
+
+ if which run-mailcap 2>/dev/null 1>&2 &&
+ (echo "$1" | grep -q '^file://' ||
+ ! echo "$1" | egrep -q '^[a-zA-Z+\.\-]+:'); then
+
+ local file=$(echo "$1" | sed 's%^file://%%')
+ run-mailcap --action=view "$file"
+ if [ $? -eq 0 ]; then
+ exit_success
+ fi
+ fi
+
+ IFS=":"
+ for browser in $BROWSER; do
+ if [ x"$browser" != x"" ]; then
+
+ browser_with_arg=`printf "$browser" "$1" 2>/dev/null`
+ if [ $? -ne 0 ]; then browser_with_arg=$browser;
+ fi
+
+ if [ x"$browser_with_arg" = x"$browser" ]; then "$browser" "$1";
+ else $browser_with_arg;
+ fi
+
+ if [ $? -eq 0 ]; then exit_success;
+ fi
+ fi
+ done
+
+ exit_failure_operation_impossible "no method available for opening '$1'"
+}
+
+[ x"$1" != x"" ] || exit_failure_syntax
+
+url=
+while [ $# -gt 0 ] ; do
+ parm="$1"
+ shift
+
+ case "$parm" in
+ -*)
+ exit_failure_syntax "unexpected option '$parm'"
+ ;;
+
+ *)
+ if [ -n "$url" ] ; then
+ exit_failure_syntax "unexpected argument '$parm'"
+ fi
+ url="$parm"
+ ;;
+ esac
+done
+
+if [ -z "${url}" ] ; then
+ exit_failure_syntax "file or URL argument missing"
+fi
+
+detectDE
+
+if [ x"$DE" = x"" ]; then
+ # if BROWSER variable is not set, check some well known browsers instead
+ if [ x"$BROWSER" = x"" ]; then
+ BROWSER=htmlview:firefox:mozilla:netscape:links:lynx
+ fi
+ DE=generic
+fi
+
+case "$DE" in
+ kde)
+ open_kde "$url"
+ ;;
+
+ gnome)
+ open_gnome "$url"
+ ;;
+
+ xfce)
+ open_xfce "$url"
+ ;;
+
+ generic)
+ open_generic "$url"
+ ;;
+
+ *)
+ exit_failure_operation_impossible "no method available for opening '$url'"
+ ;;
+esac
diff --git a/share/gcstar/html_models/GCboardgames/piwi b/share/gcstar/html_models/GCboardgames/piwi
new file mode 100644
index 0000000..9a32430
--- /dev/null
+++ b/share/gcstar/html_models/GCboardgames/piwi
@@ -0,0 +1,275 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian ( http://www.c-sait.net/ ) - Mods by Piwi -->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du jeu";
+collapseTooltip="Masquer les informations du jeu";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#FEEFCF;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#FF912D ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px dashed #999999;
+ background:#FCCC67;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input, select {
+ border:1px solid #666666;
+ background: #FCCC67;
+ color: #993300;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#FCCC67;
+ color: #993300;
+ }
+ }
+ input:hover, input.submit:hover {
+ background:#FCCC67;
+ color: #993300;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color: #993300;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#FF912D;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px dashed #FF912D;
+ border-bottom:1px dashed #FF912D;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px dashed #990000;
+ width:60%;
+ color: #990000;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#FCCC67;
+ }
+ .tr2 {
+ background:#FCCC67;
+ }
+ a {
+ color:#ffaa00;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ color:#FCCC67;
+ background-color:#ffaa00;
+ }
+ .topl {
+ color:#BBBBBB;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ color:#993300;
+ background:#FEEFCF;
+ border:1px dashed #999999;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ color:#BBBBBB;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ .borrowed1 {
+ color:#BBBBBB;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" size="20" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$TITLE_FIELD$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <img src="$$boxpic$$" alt="$$name$$" title= "$$name$$" height="$$HEIGHT_PIC$$" />
+ <table>
+ <tr class="tr1"><th>$$playingtime_LABEL$$</th><td>$$playingtime$$</td></tr>
+ <tr class="tr2"><th>$$mechanics_LABEL$$</th><td>$$mechanics$$</td></tr>
+ <tr class="tr1"><th>$$suggestedage_LABEL$$</th><td>$$suggestedage$$</td></tr>
+ <tr class="tr2"><th>$$players_LABEL$$</th><td>$$players$$</td></tr>
+ <tr class="tr1"><th>$$publishedby_LABEL$$</th><td>$$publishedby$$</td></tr>
+ <tr class="tr2"><th>$$designedby_LABEL$$</th><td>$$designedby$$</td></tr>
+ <tr class="tr1"><th>$$illustratedby_LABEL$$</th><td>$$illustratedby$$</td></tr>
+ <tr class="tr2"><th>$$original_LABEL$$</th><td>$$original$$</td></tr>
+ <tr class="tr1"><th>$$expandedby_LABEL$$</th><td>$$expandedby$$</td></tr>
+ <tr class="tr2"><th>$$expansionfor_LABEL$$</th><td>$$expansionfor$$</td></tr>
+ <tr class="tr1"><th>$$released_LABEL$$</th><td>$$released$$</td></tr>
+ </table>
+ <p>$$description$$<br /><br /><em>$$comment$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$ - Modèle Piwi - Adapté de Tian</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0; foreach (@items)
+ {
+ my $firstLetter = uc(substr($_->{name}, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a class="letter" href="#$_">$_<\/a> |/;
+ }
+ $header =~ s/\| ([^<|]) /| <span class="letter">$1<\/span> /g;
+ #$header =~ s/\| ([^<]) \|/| <span class="letter">$1<\/span> |/g;
+[/POST] \ No newline at end of file
diff --git a/share/gcstar/html_models/GCboardgames/piwi.png b/share/gcstar/html_models/GCboardgames/piwi.png
new file mode 100644
index 0000000..bbd6ce8
--- /dev/null
+++ b/share/gcstar/html_models/GCboardgames/piwi.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/FloFred b/share/gcstar/html_models/GCbooks/FloFred
new file mode 100644
index 0000000..59c625a
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/FloFred
@@ -0,0 +1,73 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template par Florent pour fred. Adapaté de rootII.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+.borrowed1
+{
+ color:#777777;
+ font-style:italic;
+}
+#legend
+{
+ margin:1em;
+ border:1px solid black;
+ display:inline;
+ padding:0.5em;
+}
+#note
+{
+ border-top:1px solid black;
+ margin:3em 8%;
+ margin-bottom:2em;
+ padding-top:0.5em;
+ text-align:center;
+ font-size:90%;
+}
+#note a
+{
+ color:black ! important;
+ text-decoration:underline;
+ font-weight:bold;
+}
+</style>
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+<table border="0" align="center" cellspacing="0" cellpadding="0" width="80%">
+<tr><td><br><hr></td></tr>
+[/HEADER]
+[ITEM]
+<tr><td>
+<table border="0" cellspacing="10" cellpadding="0" width="100%">
+ <tr><td colspan="3"><strong>$$title$$</strong></td></tr>
+ <tr><td rowspan="5" width="80"><img src="$$cover$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" border="0"/></td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$authors_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$authors$$&nbsp;</td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$publisher_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$publisher$$</td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$publication_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$publication$$</td></tr>
+ <tr><td style="font-size:10pt;" width="100"><b>$$format_LABEL$$$$SEPARATOR$$</b></td><td style="font-size:10pt;">$$format$$</td></tr>
+ <tr><td colspan="3" style="font-size:10pt;">$$description$$</td></tr>
+</table>
+</td></tr>
+<tr><td><br><hr></td></tr>
+[/ITEM]
+[FOOTER]
+</table>
+<p id="note">$$GENERATOR_NOTE$$ - Design Florent</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
+
+
+
diff --git a/share/gcstar/html_models/GCbooks/FloFred.png b/share/gcstar/html_models/GCbooks/FloFred.png
new file mode 100644
index 0000000..050fd0a
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/FloFred.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/NellistosDark b/share/gcstar/html_models/GCbooks/NellistosDark
new file mode 100644
index 0000000..79b983d
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosDark
@@ -0,0 +1,67 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template mady by Nellistos.
+ nellistos@hotmail.com
+-->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>$$PAGETITLE$$</title>
+ <style type="text/css">
+ body{font-family:sans;font-size:0.7em; background-color: #151515; color: #fff;}
+ h1{text-align:center;}
+ label{font-weight:bold;}
+ a {color:#36A0A6;font-weight:bold;}
+
+ .books{margin:50px;}
+ ul.bookslist{list-style:none;margin:0px;padding:0;}
+ ul.bookslist li {margin:35px 0px 0px 0px;padding:5px 5px 5px 5px;border-top:1px solid #555;border-bottom:1px solid #555; background-color: #333;}
+ ul.fieldslist{margin:0;padding:0;}
+ ul.fieldslist li {margin:0;padding:0;border:none;}
+
+ .details{margin-top:5px;padding: 5px 5px 5px 5px;}
+ .image{float:left;padding:0; margin:0px 25px 0px 0px;}
+ .clear{clear:both;}
+ </style>
+</head>
+<body>
+ <h1>$$PAGETITLE$$</h1>
+ <div class="books">
+ <ul class="bookslist">
+[/HEADER]
+[ITEM]
+ <li>
+ <div class="item">
+ <div class="caption"><a href="$$gcsfield1$$">$$title$$</a></div>
+ <div class="details">
+ <div class="image"><img src="$$cover$$" height="$$HEIGHT_PIC$$" alt="Book cover" title="$$title$$"/></div>
+ <div class="fields">
+ <ul class="fieldslist">
+ <li><label>$$authors_LABEL$$$$SEPARATOR$$</label>$$authors$$</li>
+ <li><label>$$publisher_LABEL$$$$SEPARATOR$$</label>$$publisher$$</li>
+ <li><label>$$publication_LABEL$$$$SEPARATOR$$</label>$$publication$$</li>
+ <li><label>$$format_LABEL$$$$SEPARATOR$$</label>$$format$$</li>
+ <li><label>$$tag_LABEL$$$$SEPARATOR$$</label>$$tags$$</li>
+ </ul>
+ </div>
+ </div>
+ <div class="description"><small>$$description$$</small> </div>
+ </div>
+ <div class="clear"/>
+ </li>
+[/ITEM]
+[FOOTER]
+ </ul>
+ </div>
+ <div align="center">Design <a href="mailto:nellistos@hotmail.com">Nellistos</a>
+ <br/>
+ <small><i>based on microFormats Spec</i></small></div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
+
+
+
diff --git a/share/gcstar/html_models/GCbooks/NellistosDark.png b/share/gcstar/html_models/GCbooks/NellistosDark.png
new file mode 100644
index 0000000..ca505cd
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosDark.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/NellistosLight b/share/gcstar/html_models/GCbooks/NellistosLight
new file mode 100644
index 0000000..2cf897d
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosLight
@@ -0,0 +1,66 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template mady by Nellistos.
+ nellistos@hotmail.com
+-->
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <title>$$PAGETITLE$$</title>
+ <style type="text/css">
+ body{font-family:sans;font-size:0.7em; background-color: #fff; color: #000;}
+ h1{text-align:center;}
+ label{font-weight:bold;}
+
+ .books{margin:50px;}
+ ul.bookslist{list-style:none;margin:0px;padding:0;}
+ ul.bookslist li {margin:35px 0px 0px 0px;padding:5px 5px 5px 5px;border-top:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd; background-color: #fff;}
+ ul.fieldslist{margin:0;padding:0;}
+ ul.fieldslist li {margin:0;padding:0;border:none;}
+
+ .details{margin-top:5px;padding: 5px 5px 5px 5px;}
+ .image{float:left;padding:0; margin:0px 25px 0px 0px;}
+ .clear{clear:both;}
+ </style>
+</head>
+<body>
+ <h1>$$PAGETITLE$$</h1>
+ <div class="books">
+ <ul class="bookslist">
+[/HEADER]
+[ITEM]
+ <li>
+ <div class="item">
+ <div class="caption"><a href="$$gcsfield1$$">$$title$$</a></div>
+ <div class="details">
+ <div class="image"><img src="$$cover$$" height="$$HEIGHT_PIC$$" alt="Book cover" title="$$title$$"/></div>
+ <div class="fields">
+ <ul class="fieldslist">
+ <li><label>$$authors_LABEL$$$$SEPARATOR$$</label>$$authors$$</li>
+ <li><label>$$publisher_LABEL$$$$SEPARATOR$$</label>$$publisher$$</li>
+ <li><label>$$publication_LABEL$$$$SEPARATOR$$</label>$$publication$$</li>
+ <li><label>$$format_LABEL$$$$SEPARATOR$$</label>$$format$$</li>
+ <li><label>$$tag_LABEL$$$$SEPARATOR$$</label>$$tags$$</li>
+ </ul>
+ </div>
+ </div>
+ <div class="description"><small>$$description$$</small> </div>
+ </div>
+ <div class="clear"/>
+ </li>
+[/ITEM]
+[FOOTER]
+ </ul>
+ </div>
+ <div align="center">Design <a href="mailto:nellistos@hotmail.com">Nellistos</a>
+ <br/>
+ <small><i>based on microFormats Spec</i></small></div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
+
+
+
diff --git a/share/gcstar/html_models/GCbooks/NellistosLight.png b/share/gcstar/html_models/GCbooks/NellistosLight.png
new file mode 100644
index 0000000..3186e1b
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/NellistosLight.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/Shelf b/share/gcstar/html_models/GCbooks/Shelf
new file mode 100644
index 0000000..72def06
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Shelf
@@ -0,0 +1,12 @@
+<metamodel>
+ <model>Shelf</model>
+ <fields>
+ <field>authors</field>
+ <field>publisher</field>
+ <field>publication</field>
+ <field>description</field>
+ <field>format</field>
+ <field>rating</field>
+ <field>acquisition</field>
+ </fields>
+</metamodel> \ No newline at end of file
diff --git a/share/gcstar/html_models/GCbooks/Shelf.png b/share/gcstar/html_models/GCbooks/Shelf.png
new file mode 100644
index 0000000..a74305b
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCbooks/Simple b/share/gcstar/html_models/GCbooks/Simple
new file mode 100644
index 0000000..b737209
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Simple
@@ -0,0 +1,10 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>title</field>
+ <field>authors</field>
+ <field>publisher</field>
+ <field>publication</field>
+ <field>format</field>
+ </fields>
+</metamodel> \ No newline at end of file
diff --git a/share/gcstar/html_models/GCbooks/Simple.png b/share/gcstar/html_models/GCbooks/Simple.png
new file mode 100644
index 0000000..341a1f7
--- /dev/null
+++ b/share/gcstar/html_models/GCbooks/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCcoins/Simple b/share/gcstar/html_models/GCcoins/Simple
new file mode 100644
index 0000000..2111fe2
--- /dev/null
+++ b/share/gcstar/html_models/GCcoins/Simple
@@ -0,0 +1,11 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>type</field>
+ <field>currency</field>
+ <field>value</field>
+ <field>year</field>
+ <field>country</field>
+ <field>condition</field>
+ </fields>
+</metamodel> \ No newline at end of file
diff --git a/share/gcstar/html_models/GCcoins/Simple.png b/share/gcstar/html_models/GCcoins/Simple.png
new file mode 100644
index 0000000..8052733
--- /dev/null
+++ b/share/gcstar/html_models/GCcoins/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Flat b/share/gcstar/html_models/GCfilms/Flat
new file mode 100644
index 0000000..a33d302
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Flat
@@ -0,0 +1,109 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Yanbab. Flat and compact list.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+
+body {
+ color:black;
+ background-color : white;
+ font-family : arial, sans-serif;
+ font-size : 12px;
+ margin : 10px;
+}
+
+td {
+ font-family : arial, sans-serif;
+ font-size : 12px;
+}
+
+h1 {
+ font-size:130%;
+ font-weight:bold;
+ border-bottom : solid black 1px;
+ margin:0px;
+}
+
+.borrowed1 {
+}
+
+#footer {
+ border-top : solid black 1px;
+ font-size:small;
+ color : #666;
+}
+a {
+ color : #666;
+ text-decoration : none;
+
+}
+a:hover {
+ text-decoration : underline;
+}
+#total {
+ float: right;
+ font-weight: bold;
+}
+.title {
+ font-size : 110%;
+ font-weight : bold;
+}
+
+.synopsis {
+ margin-top : .6em;
+ text-align : justify;
+
+ margin-bottom : 1.5em;
+ color : #333;
+}
+
+.image {
+ margin-bottom : 1.5em;
+}
+
+.detail {
+ float : right;
+ text-align : right;
+ color : #888;
+}
+</style>
+</head>
+<body>
+<div id="total">$$TOTALNUMBER$$ $$ITEMS$$</div>
+<h1>$$PAGETITLE$$</h1>
+<table cellpadding="8" cellspacing="0">
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td valign="top" align="center" bgcolor="#ddd" width="80" >
+ <img align="top" src="$$image$$" height="$$HEIGHT_PIC$$" border="0" alt="$$title$$" title="$$title$$" class="image">
+ </td>
+ <td valign="top">
+ <div class="detail">$$genre$$ - $$country$$ - $$time$$<br>
+ $$date$$</div>
+
+ <div class="title">$$title$$</div>
+ $$director$$ <br>
+
+ <div class="synopsis">$$actors_LABEL$$$$SEPARATOR$$$$actors$$<br>
+ $$synopsis$$
+ </div>
+
+ </td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<div id="footer">
+ $$GENERATOR_NOTE$$
+</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Flat.png b/share/gcstar/html_models/GCfilms/Flat.png
new file mode 100644
index 0000000..5373102
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Flat.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Shelf b/share/gcstar/html_models/GCfilms/Shelf
new file mode 100644
index 0000000..1a7d7ae
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Shelf
@@ -0,0 +1,284 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a shelf display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:left;
+ margin-left:0.5em;
+ font-size:200%;
+ font-weight:bold;
+ color:#6c7b8b;
+}
+h2
+{
+ font-size:150%;
+ text-align:center;
+ color:#1c86ee;
+ font-weight:bold;
+}
+h3
+{
+ font-size:120%;
+ font-weight:bold;
+ margin:1em 0;
+ color:#6c7b8b;
+ border-bottom:1px dashed #6c7b8b;
+}
+#left
+{
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ border:1px dashed #6c7b8b;
+ background:#f0f0f0;
+}
+.imgbox
+{
+ float:left;
+ padding:2em 1em 0em;
+ margin:0;
+}
+img
+{
+ margin:0;
+ padding:0;
+[JAVASCRIPT]
+ cursor:pointer;
+[/JAVASCRIPT]
+}
+.imginfo
+{
+ float:left;
+ margin-top:0.5em;
+[JAVASCRIPT]
+ cursor:default;
+[/JAVASCRIPT]
+}
+.synopsis
+{
+ height:8em;
+ overflow:auto;
+ padding:0.2em;
+ background:#f0f0f0;
+}
+table
+{
+ margin:0 0.5em;
+}
+th
+{
+ font-weight:bold;
+ text-align:left;
+ white-space:nowrap;
+ padding:0.5em;
+ background:#f0f0f0;
+}
+td
+{
+ padding:0.5em;
+ background:#f0f0f0;
+}
+#note
+{
+ text-align:center;
+ padding-top:0.5em;
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ color:#6c7b8b;
+}
+#note a
+{
+ font-weight:bold;
+ color:#1c86ee;
+}
+#note a:hover
+{
+ color:#6c7b8b;
+}
+.spacer
+{
+ clear: both;
+}
+[JAVASCRIPT]
+.expander
+{
+ padding:0;
+ width:1em;
+ display:block;
+ float:left;
+ text-align:center;
+ margin-right:0.5em;
+ cursor:pointer;
+}
+[/JAVASCRIPT]
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.details
+{
+ overflow: auto;
+ height: 500px;
+}
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+function getBoxes()
+{
+ return document.getElementById("left").getElementsByTagName("div")
+}
+function getHeight()
+{
+ //From http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
+ myHeight = 0;
+ if( typeof( window.innerWidth ) == 'number' ) {
+ //Non-IE
+ myHeight = window.innerHeight;
+ } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
+ //IE 6+ in 'standards compliant mode'
+ myHeight = document.documentElement.clientHeight;
+ } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
+ //IE 4 compatible
+ myHeight = document.body.clientHeight;
+ }
+ return myHeight - 150;
+}
+function init()
+{
+ // CSS changes from http://www.quirksmode.org/dom/changess.html
+ if (!document.styleSheets) return;
+ var theRules = new Array();
+ if (document.styleSheets[0].cssRules)
+ theRules = document.styleSheets[0].cssRules
+ else if (document.styleSheets[0].rules)
+ theRules = document.styleSheets[0].rules
+ theRules[theRules.length-1].style.height = getHeight()+'px';
+
+ boxes = getBoxes()
+ for(i=0; i < boxes.length; i++)
+ {
+ box = boxes[i]
+ if (box.className == "movie")
+ {
+ boxes2 = box.getElementsByTagName("div")
+ boxes2[0].onclick = function(evt)
+ {
+ div = this.parentNode
+ showMe(div.getElementsByTagName("div")[1], this)
+ }
+ }
+ }
+ headers = document.getElementById("left").getElementsByTagName("h3")
+ for(i=0; i < headers.length; i++)
+ {
+ header = headers[i]
+ header.style.cursor = 'pointer'
+ header.innerHTML = '<span class="expander">−</span> ' + header.innerHTML
+ header.onclick = function(evt)
+ {
+ table = this.nextSibling
+ while (table.tagName != "TABLE") { table = table.nextSibling }
+ if (table.style.display == "none")
+ {
+ table.style.display = "table"
+ this.innerHTML = this.innerHTML.replace(/\+<\/span>/, '−</span>')
+ }
+ else
+ {
+ table.style.display = "none"
+ this.innerHTML = this.innerHTML.replace(/−<\/span>/, '+</span>')
+ }
+ }
+ }
+}
+var currentBox = 0
+var currentImg = 0
+function showMe(box, img)
+{
+ hidePrevious()
+ box.style.display = "block"
+ img.style.background = "#4b4f63"
+ img.style.padding = "1em"
+ currentBox = box
+ currentImg = img
+}
+function hidePrevious()
+{
+ if (currentBox)
+ {
+ currentBox.style.display = "none"
+ currentImg.style.background = "#f0f0f0"
+ currentImg.style.padding = "2em 1em 0em"
+ }
+}
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body [JAVASCRIPT]onload="init()"[/JAVASCRIPT]>
+<h1>$$PAGETITLE$$</h1>
+<div id="left">
+[/HEADER]
+[ITEM]
+<div class="movie">
+ <div class="imgbox">
+ <img src="$$image$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" />
+ </div>
+ <div class="info">
+ <h2>$$title$$</h2>
+ <div class="details">
+ <h3>$$info_LABEL$$</h3>
+ <table>
+ <tr>
+ <td rowspan="5" width="10%">
+ <img class="imginfo" src="$$image$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" />
+ </td>
+ <th>$$date_LABEL$$</th><td>$$date$$</td>
+ </tr>
+ <tr><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr><th>$$time_LABEL$$</th><td>$$time$$</td></tr>
+ <tr><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr>
+ <td colspan="3">
+ <p class="synopsis">
+ $$synopsis$$
+ </p>
+ </td>
+ </table>
+ <h3>$$details_LABEL$$</h3>
+ <table>
+ <tr><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr><th>$$format_LABEL$$</th><td>$$format$$ ($$number$$)</td></tr>
+ <tr><th>$$borrower_LABEL$$</th><td>$$borrower$$</td></tr>
+ </table>
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div class="spacer">&nbsp;</div>
+</div>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Shelf.png b/share/gcstar/html_models/GCfilms/Shelf.png
new file mode 100644
index 0000000..f4423d0
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Simple b/share/gcstar/html_models/GCfilms/Simple
new file mode 100644
index 0000000..ee5a5f8
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Simple
@@ -0,0 +1,100 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. A really simple list that could be printed
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:center;
+ font-size:200%;
+ font-weight:bold;
+}
+table
+{
+ border-collapse:collapse;
+ margin:1em 5%;
+ margin-bottom:3em;
+ width:90%;
+}
+tr+tr
+{
+ border-top:1px solid black;
+}
+.borrowed1
+{
+ color:#777777;
+ font-style:italic;
+}
+th
+{
+ border-bottom:2px solid black;
+ margin:0;
+ padding:1em;
+ font-weight:bold;
+}
+td
+{
+ padding:0.2em 1em;
+}
+#legend
+{
+ margin:1em;
+ border:1px solid black;
+ display:inline;
+ padding:0.5em;
+}
+#note
+{
+ border-top:1px solid black;
+ margin:3em 8%;
+ margin-bottom:2em;
+ padding-top:0.5em;
+ text-align:center;
+ font-size:90%;
+}
+#note a
+{
+ color:black ! important;
+ text-decoration:underline;
+ font-weight:bold;
+}
+</style>
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+<table>
+<tr>
+ <th>$$title_LABEL$$</th>
+ <th>$$director_LABEL$$</th>
+ <th>$$genre_LABEL$$</th>
+ <th>$$date_LABEL$$</th>
+ <th>$$time_LABEL$$</th>
+</tr>
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td>$$title$$</td>
+ <td>$$director$$</td>
+ <td>$$genre$$</td>
+ <td>$$date$$</td>
+ <td>$$time$$</td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<p id="legend" class="borrowed1">$$BORROWED_ITEMS$$</p>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Simple.png b/share/gcstar/html_models/GCfilms/Simple.png
new file mode 100644
index 0000000..3e23235
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Tabs b/share/gcstar/html_models/GCfilms/Tabs
new file mode 100644
index 0000000..bec3b18
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tabs
@@ -0,0 +1,245 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a notebook display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body {
+ margin:0;
+ padding:0;
+ background:white;
+}
+h1 {
+ text-align:center;
+ color:#7c551a;
+}
+h2 {
+ background:transparent;
+ margin:0 0 1em;
+ color:#ffffff;
+}
+.movie {
+ height:18em;
+ clear:both;
+ margin:1em;
+ padding:0.5em;
+ background:#e3c79e;
+ border:1px dashed #7c551a;
+}
+.imgbox {
+ text-align:center;
+ float:left;
+ margin-right:1em;
+ width:120px;
+}
+h3 {
+ color:#513D23;
+ background:#ffffff;
+ cursor:default;
+ margin:0;
+ padding:0.4em;
+ display:none;
+ font-size:100%;
+ border-left:0.1em solid black;
+ border-bottom:0.1em solid white;
+ border-right:0.1em solid black;
+ border-top:0.1em solid black;
+ -moz-border-radius-topright:2em;
+ z-index:99;
+ position:relative;
+}
+div > h3
+{
+ display:block;
+}
+.details h3, .synopsis h3 {
+ background:#ffffff;
+ border-bottom:0.1em solid black;
+}
+.info, .details, .synopsis {
+ float:left;
+ width:12em;
+}
+.info dl, .details dl, .synopsis p {
+ border:0.1em solid black;
+ padding:1em 0.5em 0.5em;
+ margin:-0.1em 0 0;
+ z-index:1;
+ position:relative;
+ width:45em;
+ height:10em;
+ background:white;
+}
+.details dl, .synopsis p {
+ display:none;
+ margin-left:-11.8em;
+ width:44.8em;
+}
+.synopsis p {
+ margin-left:-23.8em;
+}
+dt {
+ float:left;
+ width:10em;
+ font-weight:bold;
+ height:1.5em;
+ color:#A49480;
+}
+dd {
+ padding:0;
+ margin-left:10em;
+ height:1.5em;
+ color:#555555;
+}
+#note {
+ text-align:center;
+ margin:2em 5em;
+ background:#e3c79e;
+ border:1px solid #7c551a;
+ padding:0.3em;
+}
+#note a {
+ font-weight:bold;
+ color:#7c551a;
+}
+[NOJAVASCRIPT]
+.info:hover dl,.details:hover dl, .synopsis:hover p {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.details:hover dl, .synopsis:hover p {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:9.9em;
+ z-index:100;
+}
+.synopsis:hover p {
+ margin-left:-23.9em;
+}
+.info:hover h3, .details:hover h3, .synopsis:hover h3 {
+ background:#ffffff;
+ border-bottom:0;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+[/NOJAVASCRIPT]
+[JAVASCRIPT]
+h3 {
+ cursor:pointer;
+ background:#e8ded0 ! important;
+}
+.details_active dl, .synopsis_active p {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.details_active dl, .synopsis_active p {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:9.9em;
+ z-index:100;
+}
+.synopsis_active p {
+ margin-left:-23.9em;
+}
+.info_active h3, .details_active h3, .synopsis_active h3 {
+ background:#ffffff ! important;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+.synopsis p {
+ overflow:auto;
+}
+[/JAVASCRIPT]
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+ function showMe(cssClass, objectId)
+ {
+ divs = document.getElementById('movie'+objectId).getElementsByTagName("div")
+ for(i=0; i < divs.length; i++)
+ {
+ if ((divs[i].className != 'imgbox') && (divs[i].className.substr(0,4) != 'note'))
+ {
+ if (divs[i].className.indexOf(cssClass) != -1)
+ {
+ divs[i].className = cssClass + '_active ' + cssClass
+ }
+ else
+ {
+ idx = divs[i].className.indexOf(' ')
+ if (idx != -1)
+ {
+ //alert('Setting ' + divs[i].className.substring(idx + 1))
+ divs[i].className = divs[i].className.substring(idx + 1)
+ }
+ }
+ }
+ }
+ }
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+[/HEADER]
+[ITEM]
+<div class="movie" id="movie$$IDX$$">
+ <h2>$$title$$</h2>
+ <div class="imgbox">
+ <img src="$$image$$" height="$$HEIGHT_PIC$$" alt="$$title$$" title="$$title$$" />
+ </div>
+ <div class="info[JAVASCRIPT]_active info[/JAVASCRIPT]">
+ <h3[JAVASCRIPT] onclick="showMe('info', $$IDX$$)"[/JAVASCRIPT]>$$info_LABEL$$</h3>
+ <dl>
+ <dt>$$date_LABEL$$</dt>
+ <dd>$$date$$</dd>
+ <dt>$$director_LABEL$$</dt>
+ <dd>$$director$$</dd>
+ <dt>$$time_LABEL$$</dt>
+ <dd>$$time$$</dd>
+ <dt>$$genre_LABEL$$</dt>
+ <dd>$$genre$$</dd>
+ <dt>$$actors_LABEL$$</dt>
+ <dd>$$actors$$</dd>
+ </dl>
+ </div>
+ <div class="details">
+ <h3[JAVASCRIPT] onclick="showMe('details', $$IDX$$)"[/JAVASCRIPT]>$$details_LABEL$$</h3>
+ <dl>
+ <dt>$$rating_LABEL$$</dt>
+ <dd><div class="note$$RATING$$">$$rating$$/10</div></dd>
+ <dt>$$format_LABEL$$</dt>
+ <dd>$$format$$ ($$number$$)</dd>
+ <dt>$$audio_LABEL$$</dt>
+ <dd>$$audio$$</dd>
+ <dt>$$borrower_LABEL$$</dt>
+ <dd>$$borrower$$</dd>
+ </dl>
+ </div>
+ <div class="synopsis">
+ <h3[JAVASCRIPT] onclick="showMe('synopsis', $$IDX$$)"[/JAVASCRIPT]>$$synopsis_LABEL$$</h3>
+ <p>$$synopsis$$</p>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tabs.png b/share/gcstar/html_models/GCfilms/Tabs.png
new file mode 100644
index 0000000..fc217aa
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tabs.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Tian b/share/gcstar/html_models/GCfilms/Tian
new file mode 100644
index 0000000..c87d34f
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian
@@ -0,0 +1,276 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian. It is based on design of Tian's website:
+ http://www.c-sait.net/
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du film";
+collapseTooltip="Masquer les informations du film";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#f7f8ff;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#624a66 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px solid #c0c0c0;
+ background:#e2e2df;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:2px solid #aaaaaa;
+ background:purple;
+ color:white;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#f3e3f9;
+ color:black;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color:#aaaaaa;
+ }
+ .letter {
+ padding:0 0.5em;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px solid #2e3766;
+ border-bottom:1px solid #2e3766;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px solid black;
+ width:60%;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#d4cce0;
+ }
+ .tr2 {
+ background:#c0b9cc;
+ }
+ a {
+ color:#2e3766;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ background-color:#e8e8ef;
+ }
+ .topl {
+ color:#aaaaaa;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ background:white;
+ border:2px solid purple;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ font-size:80%;
+ color:#c0b9cc;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ .borrowed1 {
+ font-size:80%;
+ color:purple;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ #note a {
+ text-decoration:underline;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$title$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <img src="$$image$$" alt="$$title$$" title= "$$title$$" height="$$HEIGHT_PIC$$" />
+ <table>
+ <tr class="tr1"><th>$$time_LABEL$$</th><td>$$time$$</td></tr>
+ <tr class="tr2"><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr class="tr1"><th>$$date_LABEL$$</th><td>$$date$$</td></tr>
+ <tr class="tr2"><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr class="tr1"><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr class="tr2"><th>$$format_LABEL$$</th><td>$$format$$ ($$number$$)</td></tr>
+ <tr class="tr1"><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr class="tr2"><th>$$audio_LABEL$$</th><td>$$audio$$</td></tr>
+ <tr class="tr1"><th>$$subt_LABEL$$</th><td>$$subt$$</td></tr>
+ </table>
+ <p>$$synopsis$$<br /><br /><em>$$comment$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $title = $self->{options}->{originalList}->transformValue($_->{title}, 'title');
+ my $firstLetter = uc(substr($title, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a class="letter" href="#$_">$_<\/a> |/;
+ }
+ $header =~ s/\| ([^<|]) /| <span class="letter">$1<\/span> /g;
+ #$header =~ s/\| ([^<]) \|/| <span class="letter">$1<\/span> |/g;
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tian-Mario b/share/gcstar/html_models/GCfilms/Tian-Mario
new file mode 100644
index 0000000..15ff986
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian-Mario
@@ -0,0 +1,276 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian ( http://www.c-sait.net/ )
+ Color scheme by Mario Tomic ( http://www.mariotomic.com/ )
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du film";
+collapseTooltip="Masquer les informations du film";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#222222;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#ffaa00 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px dashed #999999;
+ background:#111111;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:1px solid #666666;
+ background: #333333;
+ color: #b2b2b2;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ }
+ input:hover, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color: #333333;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px dashed #999999;
+ border-bottom:1px dashed #999999;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px dashed #b2b2b2;
+ width:60%;
+ color: #b2b2b2;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#333333;
+ }
+ .tr2 {
+ background:#333333;
+ }
+ a {
+ color:#ffaa00;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ color:#000000;
+ background-color:#ffaa00;
+ }
+ .topl {
+ color:#444444;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ color:#b2b2b2;
+ background:#000000;
+ border:1px dashed #999999;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ color:#222222;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ .borrowed1 {
+ color:#333333;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$title$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <img src="$$image$$" alt="$$title$$" title= "$$title$$" height="$$HEIGHT_PIC$$" />
+ <table>
+ <tr class="tr1"><th>$$time_LABEL$$</th><td>$$time$$</td></tr>
+ <tr class="tr2"><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr class="tr1"><th>$$date_LABEL$$</th><td>$$date$$</td></tr>
+ <tr class="tr2"><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr class="tr1"><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr class="tr2"><th>$$format_LABEL$$</th><td>$$format$$ ($$number$$)</td></tr>
+ <tr class="tr1"><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr class="tr2"><th>$$audio_LABEL$$</th><td>$$audio$$</td></tr>
+ <tr class="tr1"><th>$$subt_LABEL$$</th><td>$$subt$$</td></tr>
+ </table>
+ <p>$$synopsis$$<br /><br /><em>$$comment$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $title = $self->{options}->{originalList}->transformValue($_->{title}, 'title');
+ my $firstLetter = uc(substr($title, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a href="#$_">$_<\/a> |/;
+ }
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tian-Mario-Kim b/share/gcstar/html_models/GCfilms/Tian-Mario-Kim
new file mode 100644
index 0000000..2772020
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian-Mario-Kim
@@ -0,0 +1,281 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian ( http://www.c-sait.net/ )
+ Color scheme by Mario Tomic ( http://www.mariotomic.com/ )
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations du film";
+collapseTooltip="Masquer les informations du film";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('movie'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).title=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).title=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"movie-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('movie"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMovies(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#222222;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#ffaa00 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px dashed #999999;
+ background:#111111;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:1px solid #666666;
+ background: #333333;
+ color: #b2b2b2;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ }
+ input:hover, input.submit:hover {
+ background:#000000;
+ color: #b2b2b2;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color: #333333;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px dashed #999999;
+ border-bottom:1px dashed #999999;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px dashed #b2b2b2;
+ width:60%;
+ color: #b2b2b2;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#333333;
+ }
+ .tr2 {
+ background:#333333;
+ }
+ a {
+ color:#ffaa00;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ color:#000000;
+ background-color:#ffaa00;
+ }
+ .topl {
+ color:#444444;
+ font-size:90%;
+ }
+ .movie-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ color:#b2b2b2;
+ background:#000000;
+ border:1px dashed #999999;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ color:#222222;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ .borrowed1 {
+ color:#333333;
+ background:transparent;
+ text-decoration:none;
+ font-size:50%;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMovies(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="title">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMovies(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMovies('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="movielink_$$IDX$$" href="$$URL$$">$$title$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="movie$$IDX$$" style="display:none;">
+ <a href="$$backpic$$"><img src="$$image$$" alt="$$title$$" title= "$$title$$" height="$$HEIGHT_PIC$$" /></a>
+ <table>
+ <tr class="tr1"><th>$$date_LABEL$$</th><td>$$date$$</td></tr>
+ <tr class="tr2"><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ <tr class="tr1"><th>$$id_LABEL$$</th><td>$$id$$</td></tr>
+ <tr class="tr2"><th>$$original_LABEL$$</th><td>$$original$$</td></tr>
+ <tr class="tr1"><th>$$time_LABEL$$</th><td>$$time$$ Min.</td></tr>
+ <tr class="tr2"><th>$$director_LABEL$$</th><td>$$director$$</td></tr>
+ <tr class="tr1"><th>$$actors_LABEL$$</th><td>$$actors$$</td></tr>
+ <tr class="tr2"><th>$$rating_LABEL$$</th><td>$$rating$$/10</td></tr>
+ <tr class="tr1"><th>$$age_LABEL$$</th><td>$$age$$</td></tr>
+ <tr class="tr2"><th>$$country_LABEL$$</th><td>$$country$$</td></tr>
+ <tr class="tr1"><th>$$audio_LABEL$$</th><td>$$audio$$</td></tr>
+ <tr class="tr2"><th>$$comment_LABEL$$</th><td>$$comment$$</td></tr>
+ <tr class="tr1"><th>$$serie_LABEL$$</th><td>$$serie$$</td></tr>
+ <tr class="tr2"><th>$$subt_LABEL$$</th><td>$$subt$$</td></tr>
+ </table>
+ <p>$$synopsis$$</p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $title = $self->{options}->{originalList}->transformValue($_->{title}, 'title');
+ my $firstLetter = uc(substr($title, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="movielink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a href="#$_">$_<\/a> |/;
+ }
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/Tian-Mario.png b/share/gcstar/html_models/GCfilms/Tian-Mario.png
new file mode 100644
index 0000000..70dc0b3
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian-Mario.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/Tian.png b/share/gcstar/html_models/GCfilms/Tian.png
new file mode 100644
index 0000000..942f51c
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/Tian.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/float b/share/gcstar/html_models/GCfilms/float
new file mode 100644
index 0000000..47a9924
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/float
@@ -0,0 +1,120 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by float
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body {
+ color:#004DFF;
+ background-color : white;
+ font-family : arial, helvetica, sans-serif;
+ font-size : 12px;
+ margin : 10px;
+}
+
+td {
+ font-family : arial, sans-serif;
+ font-size : 12px;
+}
+h1 {
+ font-size:130%;
+ font-weight:bold;
+ border-bottom : solid black 1px;
+ margin:0px;
+}
+.borrowed1 {
+}
+a {
+ color : #666;
+ text-decoration : none;
+
+}
+a:hover {
+ text-decoration : underline;
+}
+.title {
+ font-size : 110%;
+ font-weight : bold;
+}
+.synopsis {
+ margin-top : .6em;
+ text-align : justify;
+
+ margin-bottom : 1.5em;
+ color : #333;
+}
+.image {
+ margin-bottom : 1.5em;
+}
+.detail {
+ float : right;
+ text-align : right;
+ color : #888;
+}
+#total {
+ float: center;
+ font-weight: bold;
+ text-align: center;
+}
+#footer {
+ border-top : solid black 1px;
+ font-size:small;
+ color : #666;
+ text-align: center;
+}
+#top {
+ text-align: left;
+}
+#middle {
+ text-align: center;
+}
+#bottom {
+ text-align: right;
+}
+</style>
+</head>
+<body>
+<a name="top" id="top"></a>
+<div id="total">$$PAGETITLE$$ - $$TOTALNUMBER$$ $$ITEMS$$</div><br><br>
+<table width="550" align="center" cellpadding="8" cellspacing="0">
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td valign="top" align="center" bgcolor="#E3E1C6" width="80" >
+ <img align="top" src="$$image$$" height="$$HEIGHT_PIC$$" border="0" alt="$$title$$" title="$$title$$" class="image">
+ </td>
+ <td valign="top" bgcolor="#ECEBD9">
+ <div class="detail"><b>$$time_LABEL$$:</b>&nbsp;$$time$$<br>
+ <b>$$genre_LABEL$$:</b>&nbsp;$$genre$$</div>
+ <div class="title">$$title$$</div>
+ <div class="synopsis"><b>$$director_LABEL$$:</b><br>$$director$$
+ <br><br><b>$$actors_LABEL$$:</b><br>$$actors$$
+ <br><br><b>$$synopsis_LABEL$$:</b><br>$$synopsis$$
+ <br><br>
+ <b>
+ <table width="100%">
+ <tr>
+ <td align="left"><a href="#top">$$TOP$$</a></td>
+ <td align="center"><a href="$$trailer$$">$$gtk-media-play$$</a></td>
+ <td align="right"><a href="#bottom">$$BOTTOM$$</a></td>
+ </tr>
+ </table>
+ </div>
+ </td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<div id="footer">
+ $$GENERATOR_NOTE$$
+</div>
+<a name="bottom" id="bottom"></a>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST] \ No newline at end of file
diff --git a/share/gcstar/html_models/GCfilms/float.png b/share/gcstar/html_models/GCfilms/float.png
new file mode 100644
index 0000000..e047a32
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/float.png
Binary files differ
diff --git a/share/gcstar/html_models/GCfilms/rootII_design b/share/gcstar/html_models/GCfilms/rootII_design
new file mode 100644
index 0000000..74873aa
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/rootII_design
@@ -0,0 +1,118 @@
+[HEADER]
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+ <!-- ------------------------------------------------------------------------------------------------
+ rootII 2005
+ Template for HTML export of a GCfilms collection
+ ------------------------------------------------------------------------------------------------ -->
+<head>
+ <meta content="text/html; charset=UTF-8" http-equiv="content-type">
+ <title>$$PAGETITLE$$</title>
+[JAVASCRIPT]
+ <script type="text/javascript" language="javascript1.2"><!--
+ var alreadyOpennedLayer="";
+ function hidelayer(id){
+ if (document.getElementById(id).style.visibility=="visible")
+ document.getElementById(id).style.visibility='hidden';
+ }
+ function showlayer(id){
+ if (document.getElementById(id) && document.getElementById(id).style.visibility!='visible')
+ {
+ if (alreadyOpennedLayer!="") hidelayer(alreadyOpennedLayer);
+ alreadyOpennedLayer=id;
+ document.getElementById(id).style.visibility='visible';
+ }
+ }
+//--></script>
+[/JAVASCRIPT]
+<style type="text/css" media="screen">
+ body {
+ font-family:helvetica, verdana, arial;
+ color:rgb(253, 253, 253);
+ background-color:rgb(204, 204, 204);
+ font-family:helvetica, verdana, arial;
+ font-size:100%;
+ }
+ .synopsis {
+ background-color:rgb(174,174,174 );
+ border:1px none #000000;
+ text-align:justify;
+ font-family:helvetica, verdana, arial;
+ font-size:90%;
+ visibility:hidden;
+ position:absolute;
+ width:80%;
+ }
+ strong {
+ color:#FFFFFF;
+ font-size:120%;
+ }
+ td {
+ color : #666666;
+ }
+ a {
+ text-decoration : none;
+ }
+ #design {
+ text-align:right;
+ color:rgb(174, 174, 174);
+ }
+ #gcstar {
+ text-align:right;
+ color:rgb(174, 174, 174);
+ }
+</style>
+<style type="text/css" media="print" >
+ body {
+ font-family:helvetica, verdana, arial;
+ font-size:100%;
+ }
+ .synopsis {
+ display: none;
+ }
+ #design {
+ display: none;
+ }
+ #gcstar {
+ text-align:right;
+ color:rgb(174, 174,174);
+ }
+</style>
+</head>
+<body link="#666666" alink="#666666" vlink="#999999">
+ <div id="header-title">
+ <h1>$$PAGETITLE$$</h1>
+ </div>
+ <table border="0" align="center" cellspacing="0" cellpadding="0" width="80%">
+ <tr>
+ <td>
+[/HEADER]
+[ITEM]
+ <table border="0" align="center" cellspacing="0" cellpadding="0" width="100%">
+ <tr><td colspan=3><strong>$$title$$</strong></td></tr>
+ <tr><td width="80" rowspan=7><img align="top" src="$$image$$" height="$$HEIGHT_PIC$$" border="0"
+ name="image$$IDX$$" alt="$$title$$" title="$$title$$"
+ [JAVASCRIPT]onMouseOver='showlayer("synop$$IDX$$")'[/JAVASCRIPT]></td>
+ <td width="100"><small>$$original_LABEL$$$$SEPARATOR$$</small></td><td><small>$$original$$</small></td></tr>
+ <tr><td><small>$$director_LABEL$$$$SEPARATOR$$</small></td><td><small>$$director$$</small></td></tr>
+ <tr><td><small>$$date_LABEL$$$$SEPARATOR$$</small></td><td><small>$$date$$</small></td></tr>
+ <tr><td><small>$$time_LABEL$$$$SEPARATOR$$</small></td><td><small>$$time$$</small></td></tr>
+ <tr><td><small>$$country_LABEL$$$$SEPARATOR$$</small></td><td><small>$$country$$</small></td></tr>
+ <tr><td><small>$$genre_LABEL$$$$SEPARATOR$$</small></td><td><small>$$genre$$</small></td></tr>
+ <tr><td><small>$$actors_LABEL$$$$SEPARATOR$$</small></td><td><small>$$actors$$</small></td></tr>
+ <tr><td colspan=3><div class="synopsis" id="synop$$IDX$$" [JAVASCRIPT]onMouseOut='hidelayer("synop$$IDX$$")'[/JAVASCRIPT]>$$synopsis$$</div></td></tr>
+ <tr><td colspan=3><hr></td></tr>
+ </table>
+[/ITEM]
+[FOOTER]
+</td></tr>
+<tr><td>$$TOTALNUMBER$$ films</td></tr>
+ </table>
+ <div id="design"><br><br><br><br><small>design by
+ <em>rootII design department</em></small></div>
+ <div id="export">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCfilms/rootII_design.png b/share/gcstar/html_models/GCfilms/rootII_design.png
new file mode 100644
index 0000000..ffeae14
--- /dev/null
+++ b/share/gcstar/html_models/GCfilms/rootII_design.png
Binary files differ
diff --git a/share/gcstar/html_models/GCgames/Flat b/share/gcstar/html_models/GCgames/Flat
new file mode 100644
index 0000000..8587298
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Flat
@@ -0,0 +1,111 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Yanbab. Flat and compact list.
+ Adapted to video games by Tian.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+
+body {
+ color:black;
+ background-color : white;
+ font-family : arial, sans-serif;
+ font-size : 12px;
+ margin : 10px;
+}
+
+td {
+ font-family : arial, sans-serif;
+ font-size : 12px;
+}
+
+h1 {
+ font-size:130%;
+ font-weight:bold;
+ border-bottom : solid black 1px;
+ margin:0px;
+}
+
+.borrowed1 {
+}
+
+#footer {
+ border-top : solid black 1px;
+ font-size:small;
+ color : #666;
+}
+a {
+ color : #666;
+ text-decoration : none;
+
+}
+a:hover {
+ text-decoration : underline;
+}
+#total {
+ float: right;
+ font-weight: bold;
+}
+.title {
+ font-size : 110%;
+ font-weight : bold;
+}
+
+.synopsis {
+ margin-top : .6em;
+ text-align : justify;
+
+ margin-bottom : 1.5em;
+ color : #333;
+}
+
+.image {
+ margin-bottom : 1.5em;
+}
+
+.detail {
+ float : right;
+ text-align : right;
+ color : #888;
+}
+</style>
+</head>
+<body>
+<div id="total">$$TOTALNUMBER$$ $$ITEMS$$</div>
+<h1>$$PAGETITLE$$</h1>
+<table cellpadding="8" cellspacing="0">
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ <td valign="top" align="center" bgcolor="#ddd" width="80" >
+ <a href="$$web$$">
+ <img align="top" src="$$boxpic$$" height="$$HEIGHT_PIC$$" border="0" alt="$$name$$" title="$$name$$" class="image">
+ </a>
+ </td>
+ <td valign="top">
+ <div class="detail">$$platform$$ - $$editor$$<br>
+ $$genre$$</div>
+
+ <div class="title">$$name$$</div>
+
+ <div class="synopsis">
+ $$description$$
+ </div>
+
+ </td>
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+<div id="footer">
+ $$GENERATOR_NOTE$$
+</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCgames/Flat.png b/share/gcstar/html_models/GCgames/Flat.png
new file mode 100644
index 0000000..68dc96a
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Flat.png
Binary files differ
diff --git a/share/gcstar/html_models/GCgames/Simple b/share/gcstar/html_models/GCgames/Simple
new file mode 100644
index 0000000..dc61b0d
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Simple
@@ -0,0 +1,10 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>name</field>
+ <field>editor</field>
+ <field>platform</field>
+ <field>genre</field>
+ <field>players</field>
+ </fields>
+</metamodel>
diff --git a/share/gcstar/html_models/GCgames/Simple.png b/share/gcstar/html_models/GCgames/Simple.png
new file mode 100644
index 0000000..d1c34d3
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCgames/Tabs b/share/gcstar/html_models/GCgames/Tabs
new file mode 100644
index 0000000..e6b5ccb
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Tabs
@@ -0,0 +1,284 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a notebook display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body {
+ margin:0;
+ padding:0;
+ background:white;
+}
+h1 {
+ text-align:center;
+ color:#7c551a;
+}
+h2 {
+ background:transparent;
+ margin:0 0 1em;
+ color:#ffffff;
+}
+.item {
+ height:23em;
+ clear:both;
+ margin:1em;
+ padding:0.5em;
+ background:#e3c79e;
+ border:1px dashed #7c551a;
+}
+.imgbox {
+ text-align:center;
+ float:left;
+ margin-right:1em;
+ width:120px;
+}
+a img {
+ border:0;
+}
+h3 {
+ color:#513D23;
+ background:#ffffff;
+ cursor:default;
+ margin:0;
+ padding:0.4em;
+ display:none;
+ font-size:100%;
+ border-left:0.1em solid black;
+ border-bottom:0.1em solid white;
+ border-right:0.1em solid black;
+ border-top:0.1em solid black;
+ -moz-border-radius-topright:2em;
+ z-index:99;
+ position:relative;
+}
+div > h3
+{
+ display:block;
+}
+.description h3, .tips h3 {
+ background:#ffffff;
+ border-bottom:0.1em solid black;
+}
+.info, .description, .tips {
+ float:left;
+ width:12em;
+}
+.info dl, .description table, .tips div {
+ border:0.1em solid black;
+ padding:1em 0.5em 0.5em;
+ margin:-0.1em 0 0;
+ z-index:1;
+ position:relative;
+ width:45em;
+ height:15em;
+ background:white;
+}
+.description table, .tips div {
+ display:none;
+ margin-left:-11.8em;
+ width:44.8em;
+}
+.tips div {
+ margin-left:-23.8em;
+}
+dt {
+ float:left;
+ width:15em;
+ font-weight:bold;
+ height:1.5em;
+ color:#A49480;
+}
+dd {
+ padding:0;
+ margin-left:15em;
+ height:1.5em;
+ color:#555555;
+}
+.codes {
+ width:99%;
+}
+.codes td, .codes th {
+ padding:0.2em;
+ width:50%;
+}
+.codes th, .codes .odd td {
+ background:#e8ded0;
+}
+.codes + .codes {
+ margin:1em 0;
+ padding:1em 0;
+ border-top:2px solid #7c551a;
+ border-bottom:2px solid #7c551a;
+}
+#note {
+ text-align:center;
+ margin:2em 5em;
+ background:#e3c79e;
+ border:1px solid #7c551a;
+ padding:0.3em;
+}
+#note a {
+ font-weight:bold;
+ color:#7c551a;
+}
+[NOJAVASCRIPT]
+.info:hover dl,.description:hover table, .tips:hover div {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.description:hover table, .tips:hover div {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:14.9em;
+ z-index:100;
+}
+.tips:hover div {
+ margin-left:-23.9em;
+}
+.info:hover h3, .description:hover h3, .tips:hover h3 {
+ background:#ffffff;
+ border-bottom:0;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+[/NOJAVASCRIPT]
+[JAVASCRIPT]
+h3 {
+ cursor:pointer;
+ background:#e8ded0 ! important;
+}
+.description_active table, .tips_active div {
+ padding-top:1em;
+ display:block;
+ color:#555555;
+ z-index:2;
+}
+.description_active table, .tips_active div {
+ border:0;
+ border-top:0.1em solid black;
+ margin-top:-0.1em;
+ margin-left:-11.9em;
+ height:14.9em;
+ z-index:100;
+}
+.tips_active div {
+ margin-left:-23.9em;
+}
+.info_active h3, .description_active h3, .tips_active h3 {
+ background:#ffffff ! important;
+ border-bottom:0.1em solid white;
+ z-index:999;
+}
+.tips div {
+ overflow:auto;
+}
+td.desc {
+ height:5em;
+}
+td.desc p {
+ margin:0;
+ padding:0;
+ overflow:auto;
+ height:7em;
+}
+[/JAVASCRIPT]
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+ function showMe(cssClass, objectId)
+ {
+ divs = document.getElementById('item'+objectId).getElementsByTagName("div")
+ for(i=0; i < divs.length; i++)
+ {
+ if ((divs[i].className != 'imgbox') && (divs[i].className.substr(0,4) != 'note'))
+ {
+ if (divs[i].className.indexOf(cssClass) != -1)
+ {
+ divs[i].className = cssClass + '_active ' + cssClass
+ }
+ else
+ {
+ idx = divs[i].className.indexOf(' ')
+ if (idx != -1)
+ {
+ //alert('Setting ' + divs[i].className.substring(idx + 1))
+ divs[i].className = divs[i].className.substring(idx + 1)
+ }
+ }
+ }
+ }
+ }
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+[/HEADER]
+[ITEM]
+<div class="item" id="item$$IDX$$">
+ <h2>$$name$$</h2>
+ <div class="imgbox">
+ <img src="$$boxpic$$" height="$$HEIGHT_PIC$$" alt="$$name$$" title="$$name$$" />
+ </div>
+ <div class="info[JAVASCRIPT]_active info[/JAVASCRIPT]">
+ <h3[JAVASCRIPT] onclick="showMe('info', $$IDX$$)"[/JAVASCRIPT]>$$info_LABEL$$</h3>
+ <dl>
+ <dt>$$platform_LABEL$$</dt>
+ <dd>$$platform$$</dd>
+ <dt>$$genre_LABEL$$</dt>
+ <dd>$$genre$$</dd>
+ <dt>$$players_LABEL$$</dt>
+ <dd>$$players$$</dd>
+ <dt>$$editor_LABEL$$</dt>
+ <dd>$$editor$$</dd>
+ <dt>$$released_LABEL$$</dt>
+ <dd>$$released$$</dd>
+ <dt>$$rating_LABEL$$</dt>
+ <dd>$$rating$$/10</dd>
+ <dt>$$completion_LABEL$$</dt>
+ <dd>$$completion$$</dd>
+ <dt>$$borrower_LABEL$$</dt>
+ <dd>$$borrower$$</dd>
+ </dl>
+ </div>
+ <div class="description">
+ <h3[JAVASCRIPT] onclick="showMe('description', $$IDX$$)"[/JAVASCRIPT]>$$description_LABEL$$</h3>
+ <table>
+ <tr><td><a href="$$screenshot1$$"><img height="100" src="$$screenshot1$$" alt="$$screenshot1_LABEL$$" /></a></td>
+ <td><a href="$$screenshot2$$"><img height="100" src="$$screenshot2$$" alt="$$screenshot2_LABEL$$" /></a></td></tr>
+ <tr><td colspan="2" class="desc"><p>$$description$$</p></td></tr>
+ </table>
+ </div>
+ <div class="tips">
+ <h3[JAVASCRIPT] onclick="showMe('tips', $$IDX$$)"[/JAVASCRIPT]>$$tips_LABEL$$</h3>
+ <div>
+ <table class="codes">
+ <tr><th>$$code_LABEL$$</th><th>$$Effect_LABEL$$</th></tr>
+ $$code_TABLE$$
+ </table>
+ <table class="codes">
+ <tr><th>$$unlockable_LABEL$$</th><th>$$Howto_LABEL$$</th></tr>
+ $$unlockable_TABLE$$
+ </table>
+ <p>$$secrets$$</p>
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCgames/Tabs.png b/share/gcstar/html_models/GCgames/Tabs.png
new file mode 100644
index 0000000..01adbc7
--- /dev/null
+++ b/share/gcstar/html_models/GCgames/Tabs.png
Binary files differ
diff --git a/share/gcstar/html_models/GCminicars/Tian-Jim b/share/gcstar/html_models/GCminicars/Tian-Jim
new file mode 100644
index 0000000..1d942bf
--- /dev/null
+++ b/share/gcstar/html_models/GCminicars/Tian-Jim
@@ -0,0 +1,279 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
+<!--
+ Template made by Tian. It is based on design of Tian's website:
+ http://www.c-sait.net/
+-->
+<head>
+ <title>$$PAGETITLE$$</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+[JAVASCRIPT]
+ <script type="text/javascript">
+<!--
+expandTooltip="Afficher les informations de la Miniature";
+collapseTooltip="Masquer les informations de la Miniature";
+function prn(s)
+{
+ document.write(s)
+}
+function getE(id)
+{
+ return document.getElementById(id)
+}
+function expcolAll(dir,rowNum)
+{
+ for(x=0;x < rowNum;x++) {
+ try {
+ getE('minicar'+x).style.display=dir
+ if(dir=="none") getE('switch'+x).innerHTML="+"
+ else getE('switch'+x).innerHTML="&ndash;"
+ }
+ catch(err) { }
+ }
+}
+function toggleDisplay(id,swt)
+{
+ if((getE(id).style.display=="")||(getE(id).style.display=="none")) {
+ getE(id).style.display="block"
+ getE(swt).innerHTML="&ndash;"
+ getE(swt).name=collapseTooltip
+ } else {
+ getE(id).style.display="none"
+ getE(swt).innerHTML="+"
+ getE(swt).name=expandTooltip
+ }
+ return false
+}
+function writeExpandControl(elementId,collapse)
+{
+ prn("<a href=\"#\" class=\"minicar-expand\" id=\"switch"+elementId+"\" onclick=\"return toggleDisplay('minicar"+elementId+"','switch"+elementId+"');\" title=\""+((collapse) ? expandTooltip : collapseTooltip)+"\">"+((collapse) ? "+" : "&ndash;")+"</a>")
+}
+function searchMinicars(text)
+{
+ getE("collapseAll").click()
+ alldt=document.getElementsByTagName("dt")
+ alldd=document.getElementsByTagName("dd")
+ nb=alldt.length
+ re=new RegExp(text,"i")
+ for(i=0;i<nb;i++) {
+ s1=alldt[i].getElementsByTagName("a")[1].innerHTML
+ s2=alldd[i].innerHTML
+ res=0
+ if(getE("searchType").value=="all") res=(re.test(s1)||re.test(s2))
+ else res=re.test(s1)
+ if(res) st="block"
+ else st="none"
+ alldt[i].style.display=st
+ alldd[i].style.display=st
+ }
+}
+-->
+ </script>
+[/JAVASCRIPT]
+ <style type="text/css">
+ body {
+ background:#f7f8ff;
+ }
+ h1 {
+ font-weight:bold;
+ font-size:160%;
+ text-align:center;
+ margin-bottom:1em;
+ }
+ #top {
+ color:#624a66 ! important;
+ background:transparent ! important;
+ }
+ form {
+ text-align:center;
+ border:1px solid #c0c0c0;
+ background:#e2e2df;
+ margin:0 3em;
+ padding:0.5em;
+ }
+ input,select {
+ border:2px solid #aaaaaa;
+ background:purple;
+ color:white;
+ margin:0 0.5em;
+ }
+ input:focus, input.submit:hover {
+ background:#f3e3f9;
+ color:black;
+ }
+ input.submit {
+ cursor:pointer;
+ }
+ #links {
+ margin-top:0.5em;
+ text-align:center;
+ font-size:120%;
+ color:#aaaaaa;
+ }
+ .letter {
+ padding:0 0.5em;
+ }
+ img {
+ float:left;
+ margin:0 1em 1em 1em;
+ border:1px solid #aaaaaa;
+ }
+ dt {
+ color:#aaaaaa;
+ font-size:120%;
+ margin:0em 0.5em;
+ clear:both;
+ }
+ dd {
+ margin:0.5em 2em 1em;
+ border-left:1px solid #2e3766;
+ border-bottom:1px solid #2e3766;
+ }
+ table {
+ font-size:90%;
+ margin:0 1em;
+ border:1px solid black;
+ width:60%;
+ }
+ th {
+ font-weight:bold;
+ text-align:left;
+ width:25%;
+ }
+ .tr1 {
+ background:#d4cce0;
+ }
+ .tr2 {
+ background:#c0b9cc;
+ }
+ a {
+ color:#2e3766;
+ background:transparent;
+ text-decoration:none;
+ }
+ a:hover, a:focus {
+ background-color:#e8e8ef;
+ }
+ .topl {
+ color:#aaaaaa;
+ font-size:90%;
+ }
+ .minicar-expand {
+ width:1em;
+ text-align:center;
+ font-size:120%;
+ float:left;
+ margin:0.2em;
+ }
+ p, #note {
+ background:white;
+ border:2px solid purple;
+ clear:left;
+ margin:1em 2em;
+ padding:0.5em;
+ }
+ .borrowed0 {
+ font-size:80%;
+ color:#c0b9cc;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ .borrowed1 {
+ font-size:80%;
+ color:purple;
+ background:transparent;
+ text-decoration:none;
+ display:block;
+ }
+ #note {
+ text-align:center;
+ }
+ #note a {
+ text-decoration:underline;
+ }
+ </style>
+</head>
+<body>
+ <h1><a id="top">$$PAGETITLE$$</a></h1>
+[JAVASCRIPT]
+ <form onsubmit="searchMinicars(getE('searchText').value); return false" action="">
+ <div>
+ <input type="text" id="searchText" title="$$FORM_INPUT$$" />
+ <select id="searchType">
+ <option value="name">$$FORM_SEARCH1$$</option>
+ <option value="all">$$FORM_SEARCH2$$</option>
+ </select>
+ <input type="button" class="submit" value="$$FORM_SEARCHBUTTON$$" title="$$FORM_SEARCHTITLE$$" onclick="searchMinicars(getE('searchText').value)" />
+ <input type="button" class="submit" value="$$FORM_ALLBUTTON$$" title="$$FORM_ALLTITLE$$" onclick="searchMinicars('')" />
+ <br />
+ <br />
+ <input type="button" class="submit" value="$$FORM_EXPAND$$" onclick="expcolAll('block','$$TOTALNUMBER$$')" title="$$FORM_EXPANDTITLE$$" />
+ <input type="button" id="collapseAll" class="submit" value="$$FORM_COLLAPSE$$" onclick="expcolAll('none','$$TOTALNUMBER$$')" title="$$FORM_COLLAPSETITLE$$" />
+ </div>
+ </form>
+[/JAVASCRIPT]
+ <div id="links">| _ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |</div>
+ <dl>
+[/HEADER]
+[ITEM]
+ <dt>
+[JAVASCRIPT]
+ <script type="text/javascript">writeExpandControl('$$IDX$$',1)</script>
+[/JAVASCRIPT]
+ <a id="minicarlink_$$IDX$$" href="$$URL$$">$$name$$</a> | <a class="topl" href="#top">($$TOP$$)</a>
+ <span class="borrowed$$borrower_FLAG$$">$$borrower_YESNO$$$$borrower_OREMPTY$$</span>
+ </dt>
+ <dd>
+ <div id="minicar$$IDX$$" style="display:none;">
+ <img src="$$picture$$" alt="$$name$$" title="$$name$$" height="160" />
+ <table>
+ <tr class="tr1"><th>$$scale_LABEL$$</th><td>$$scale$$</td></tr>
+ <tr class="tr2"><th>$$manufacturer_LABEL$$</th><td>$$manufacturer$$</td></tr>
+ <tr class="tr1"><th>$$type1_LABEL$$</th><td>$$type1$$</td></tr>
+ <tr class="tr2"><th>$$constructor_LABEL$$</th><td>$$constructor$$</td></tr>
+ <tr class="tr1"><th>$$modele_LABEL$$</th><td>$$modele$$</td></tr>
+ <tr class="tr2"><th>$$version_LABEL$$</th><td>$$version$$</td></tr>
+ <tr class="tr1"><th>$$color_LABEL$$</th><td>$$color$$</td></tr>
+ <tr class="tr2"><th>$$pub_LABEL$$</th><td>$$pub$$</td></tr>
+ <tr class="tr1"><th>$$year_LABEL$$</th><td>$$year$$</td></tr>
+ <tr class="tr2"><th>$$reference_LABEL$$</th><td>$$reference$$</td></tr>
+ <tr class="tr1"><th>$$rating1_LABEL$$</th><td>$$rating1$$/10</td></tr>
+ </table>
+ <p><em>$$comments1$$</em></p>
+ </div>
+ </dd>
+[/ITEM]
+[FOOTER]
+ </dl>
+ <div id="note">$$GENERATOR_NOTE$$</div>
+</body>
+</html>
+[/FOOTER]
+[POST]
+
+ my %letters = ();
+ my $idx = 0;
+
+ foreach (@items)
+ {
+ my $name = $self->{options}->{originalList}->transformValue($_->{name}, 'name');
+ my $firstLetter = uc(substr($name, 0, 1));
+ $firstLetter =~ s/[^A-Z]/_/;
+ if (!$letters{$firstLetter})
+ {
+ $body =~ s/<a id="minicarlink_$idx"/<a id="$firstLetter"/;
+ $letters{$firstLetter} = 1;
+ }
+ $idx++;
+ }
+
+ foreach (keys %letters)
+ {
+ $header =~ s/\| $_ \|/| <a class="letter" href="#$_">$_<\/a> |/;
+ }
+ $header =~ s/\| ([^<|]) /| <span class="letter">$1<\/span> /g;
+ #$header =~ s/\| ([^<]) \|/| <span class="letter">$1<\/span> |/g;
+[/POST]
diff --git a/share/gcstar/html_models/GCminicars/Tian-Jim.png b/share/gcstar/html_models/GCminicars/Tian-Jim.png
new file mode 100644
index 0000000..3815533
--- /dev/null
+++ b/share/gcstar/html_models/GCminicars/Tian-Jim.png
Binary files differ
diff --git a/share/gcstar/html_models/GCmusics/Shelf b/share/gcstar/html_models/GCmusics/Shelf
new file mode 100644
index 0000000..429f179
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Shelf
@@ -0,0 +1,298 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a shelf display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:left;
+ margin-left:0.5em;
+ font-size:200%;
+ font-weight:bold;
+ color:#6c7b8b;
+}
+h2
+{
+ font-size:150%;
+ text-align:center;
+ color:#1c86ee;
+ font-weight:bold;
+ height:3em;
+}
+h3
+{
+ font-size:120%;
+ font-weight:bold;
+ margin:1em 0;
+ color:#6c7b8b;
+ border-bottom:1px dashed #6c7b8b;
+}
+#left
+{
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ border:1px dashed #6c7b8b;
+ background:#f0f0f0;
+}
+.imgbox
+{
+ float:left;
+ padding:2em 1em 0em;
+ margin:0;
+}
+img
+{
+ margin:0;
+ padding:0;
+[JAVASCRIPT]
+ cursor:pointer;
+[/JAVASCRIPT]
+}
+.imginfo
+{
+ float:left;
+ margin-top:0.5em;
+[JAVASCRIPT]
+ cursor:default;
+[/JAVASCRIPT]
+}
+.synopsis
+{
+ height:8em;
+ overflow:auto;
+ padding:0.2em;
+ background:#f0f0f0;
+}
+table
+{
+ margin:0 2%;
+ width:95%;
+}
+th
+{
+ font-weight:bold;
+ text-align:left;
+ white-space:nowrap;
+ padding:0.5em;
+ background:#f0f0f0;
+ width:40%;
+}
+td
+{
+ padding:0.5em;
+ background:#f0f0f0;
+ display:block;
+ min-height:1.5em;
+ max-height:10em;
+ overflow:auto;
+}
+#tracks td
+{
+ display:table-cell;
+}
+tr.even td
+{
+ background:#f0f0f0;
+}
+tr.odd td
+{
+ background:#e0e0d0;
+}
+#note
+{
+ text-align:center;
+ padding-top:0.5em;
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ color:#6c7b8b;
+}
+#note a
+{
+ font-weight:bold;
+ color:#1c86ee;
+}
+#note a:hover
+{
+ color:#6c7b8b;
+}
+.spacer
+{
+ clear: both;
+}
+[JAVASCRIPT]
+.expander
+{
+ padding:0;
+ width:1em;
+ display:block;
+ float:left;
+ text-align:center;
+ margin-right:0.5em;
+ cursor:pointer;
+}
+[/JAVASCRIPT]
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.details
+{
+ overflow: auto;
+ height: 500px;
+}
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+function getBoxes()
+{
+ return document.getElementById("left").getElementsByTagName("div")
+}
+function getHeight()
+{
+ //From http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
+ myHeight = 0;
+ if( typeof( window.innerWidth ) == 'number' ) {
+ //Non-IE
+ myHeight = window.innerHeight;
+ } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
+ //IE 6+ in 'standards compliant mode'
+ myHeight = document.documentElement.clientHeight;
+ } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
+ //IE 4 compatible
+ myHeight = document.body.clientHeight;
+ }
+ return myHeight - 150;
+}
+function init()
+{
+ // CSS changes from http://www.quirksmode.org/dom/changess.html
+ if (!document.styleSheets) return;
+ var theRules = new Array();
+ if (document.styleSheets[0].cssRules)
+ theRules = document.styleSheets[0].cssRules
+ else if (document.styleSheets[0].rules)
+ theRules = document.styleSheets[0].rules
+ theRules[theRules.length-1].style.height = getHeight()+'px';
+
+ boxes = getBoxes()
+ for(i=0; i < boxes.length; i++)
+ {
+ box = boxes[i]
+ if (box.className == "movie")
+ {
+ boxes2 = box.getElementsByTagName("div")
+ boxes2[0].onclick = function(evt)
+ {
+ div = this.parentNode
+ showMe(div.getElementsByTagName("div")[1], this)
+ }
+ }
+ }
+ headers = document.getElementById("left").getElementsByTagName("h3")
+ for(i=0; i < headers.length; i++)
+ {
+ header = headers[i]
+ header.style.cursor = 'pointer'
+ header.innerHTML = '<span class="expander">−</span> ' + header.innerHTML
+ header.onclick = function(evt)
+ {
+ table = this.nextSibling
+ while (table.tagName != "TABLE") { table = table.nextSibling }
+ if (table.style.display == "none")
+ {
+ table.style.display = "table"
+ this.innerHTML = this.innerHTML.replace(/\+<\/span>/, '−</span>')
+ }
+ else
+ {
+ table.style.display = "none"
+ this.innerHTML = this.innerHTML.replace(/−<\/span>/, '+</span>')
+ }
+ }
+ }
+}
+var currentBox = 0
+var currentImg = 0
+function showMe(box, img)
+{
+ hidePrevious()
+ box.style.display = "block"
+ img.style.background = "#4b4f63"
+ img.style.padding = "1em"
+ currentBox = box
+ currentImg = img
+}
+function hidePrevious()
+{
+ if (currentBox)
+ {
+ currentBox.style.display = "none"
+ currentImg.style.background = "#f0f0f0"
+ currentImg.style.padding = "2em 1em 0em"
+ }
+}
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body [JAVASCRIPT]onload="init()"[/JAVASCRIPT]>
+<h1>$$PAGETITLE$$</h1>
+<div id="left">
+[/HEADER]
+[ITEM]
+<div class="movie">
+ <div class="imgbox">
+ <img src="$$COVER_FIELD$$" height="$$HEIGHT_PIC$$" alt="$$TITLE_FIELD$$" title="$$TITLE_FIELD$$" />
+ </div>
+ <div class="info">
+ <h2>$$TITLE_FIELD$$</h2>
+ <div class="details">
+ <h3>$$main_LABEL$$</h3>
+ <table>
+ <tr><th>$$artist_LABEL$$</th><td>$$artist$$</td></tr>
+ <tr><th>$$label_LABEL$$</th><td>$$label$$</td></tr>
+ <tr><th>$$release_LABEL$$</th><td>$$release$$</td></tr>
+ <tr><th>$$running_LABEL$$</th><td>$$running$$</td></tr>
+ <tr><th>$$genre_LABEL$$</th><td>$$genre$$</td></tr>
+ </table>
+
+ <h3>$$details_LABEL$$</h3>
+ <table>
+ <tr><th>$$producer_LABEL$$</th><td>$$producer$$</td></tr>
+ <tr><th>$$composer_LABEL$$</th><td>$$composer$$</td></tr>
+ <tr><th>$$comments_LABEL$$</th><td>$$comments$$</td></tr>
+ </table>
+
+ <h3>$$tracks_LABEL$$</h3>
+ <table id="tracks">
+ $$tracks_TABLE$$
+ </table>
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div class="spacer">&nbsp;</div>
+</div>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCmusics/Shelf.png b/share/gcstar/html_models/GCmusics/Shelf.png
new file mode 100644
index 0000000..83dbfd8
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCmusics/Simple b/share/gcstar/html_models/GCmusics/Simple
new file mode 100644
index 0000000..7cef04c
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Simple
@@ -0,0 +1,10 @@
+<metamodel>
+ <model>Simple</model>
+ <fields>
+ <field>title</field>
+ <field>artist</field>
+ <field>running</field>
+ <field>label</field>
+ <field>genre</field>
+ </fields>
+</metamodel>
diff --git a/share/gcstar/html_models/GCmusics/Simple.png b/share/gcstar/html_models/GCmusics/Simple.png
new file mode 100644
index 0000000..4bc59cf
--- /dev/null
+++ b/share/gcstar/html_models/GCmusics/Simple.png
Binary files differ
diff --git a/share/gcstar/html_models/GCstar/Shelf b/share/gcstar/html_models/GCstar/Shelf
new file mode 100644
index 0000000..e699fdc
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Shelf
@@ -0,0 +1,282 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. It emulates a shelf display.
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:left;
+ margin-left:0.5em;
+ font-size:200%;
+ font-weight:bold;
+ color:#6c7b8b;
+}
+h2
+{
+ font-size:150%;
+ text-align:center;
+ color:#1c86ee;
+ font-weight:bold;
+ height:3em;
+}
+h3
+{
+ font-size:120%;
+ font-weight:bold;
+ margin:1em 0;
+ color:#6c7b8b;
+ border-bottom:1px dashed #6c7b8b;
+}
+#left
+{
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ border:1px dashed #6c7b8b;
+ background:#f0f0f0;
+}
+.imgbox
+{
+ float:left;
+ padding:2em 1em 0em;
+ margin:0;
+}
+.imgbox img
+{
+ margin:0;
+ padding:0;
+[JAVASCRIPT]
+ cursor:pointer;
+[/JAVASCRIPT]
+}
+.imginfo
+{
+ float:left;
+ margin-top:0.5em;
+[JAVASCRIPT]
+ cursor:default;
+[/JAVASCRIPT]
+}
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.synopsis
+{
+ height:8em;
+ overflow:auto;
+ padding:0.2em;
+ background:#f0f0f0;
+}
+table
+{
+ margin:0 2%;
+ width:95%;
+}
+th
+{
+ font-weight:bold;
+ text-align:left;
+ white-space:nowrap;
+ padding:0.5em;
+ background:#f0f0f0;
+ width:40%;
+}
+td
+{
+ padding:0.5em;
+ background:#f0f0f0;
+ display:block;
+ min-height:1.5em;
+ max-height:12em;
+ overflow:auto;
+}
+#note
+{
+ text-align:center;
+ padding-top:0.5em;
+[JAVASCRIPT]
+ width:48%;
+[/JAVASCRIPT]
+ color:#6c7b8b;
+}
+#note a
+{
+ font-weight:bold;
+ color:#1c86ee;
+}
+#note a:hover
+{
+ color:#6c7b8b;
+}
+.spacer
+{
+ clear: both;
+}
+[JAVASCRIPT]
+.expander
+{
+ padding:0;
+ width:1em;
+ display:block;
+ float:left;
+ text-align:center;
+ margin-right:0.5em;
+ cursor:pointer;
+}
+[/JAVASCRIPT]
+.info
+{
+ position:fixed;
+ top:0;
+ right:1%;
+ width:48%;
+ display:none;
+}
+.details
+{
+ overflow: auto;
+ height: 500px;
+}
+</style>
+[JAVASCRIPT]
+<script type="text/javascript">
+<!--
+function getBoxes()
+{
+ return document.getElementById("left").getElementsByTagName("div")
+}
+function getHeight()
+{
+ //From http://www.howtocreate.co.uk/tutorials/javascript/browserwindow
+ myHeight = 0;
+ if( typeof( window.innerWidth ) == 'number' ) {
+ //Non-IE
+ myHeight = window.innerHeight;
+ } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
+ //IE 6+ in 'standards compliant mode'
+ myHeight = document.documentElement.clientHeight;
+ } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
+ //IE 4 compatible
+ myHeight = document.body.clientHeight;
+ }
+ return myHeight - 150;
+}
+function init()
+{
+ // CSS changes from http://www.quirksmode.org/dom/changess.html
+ if (!document.styleSheets) return;
+ var theRules = new Array();
+ if (document.styleSheets[0].cssRules)
+ theRules = document.styleSheets[0].cssRules
+ else if (document.styleSheets[0].rules)
+ theRules = document.styleSheets[0].rules
+ theRules[theRules.length-1].style.height = getHeight()+'px';
+
+ boxes = getBoxes()
+ for(i=0; i < boxes.length; i++)
+ {
+ box = boxes[i]
+ if (box.className == "movie")
+ {
+ boxes2 = box.getElementsByTagName("div")
+ boxes2[0].onclick = function(evt)
+ {
+ div = this.parentNode
+ showMe(div.getElementsByTagName("div")[1], this)
+ }
+ }
+ }
+ headers = document.getElementById("left").getElementsByTagName("h3")
+ for(i=0; i < headers.length; i++)
+ {
+ header = headers[i]
+ header.style.cursor = 'pointer'
+ header.innerHTML = '<span class="expander">−</span> ' + header.innerHTML
+ header.onclick = function(evt)
+ {
+ table = this.nextSibling
+ while (table.tagName != "TABLE") { table = table.nextSibling }
+ if (table.style.display == "none")
+ {
+ table.style.display = "table"
+ this.innerHTML = this.innerHTML.replace(/\+<\/span>/, '−</span>')
+ }
+ else
+ {
+ table.style.display = "none"
+ this.innerHTML = this.innerHTML.replace(/−<\/span>/, '+</span>')
+ }
+ }
+ }
+}
+var currentBox = 0
+var currentImg = 0
+function showMe(box, img)
+{
+ hidePrevious()
+ box.style.display = "block"
+ img.style.background = "#4b4f63"
+ img.style.padding = "1em"
+ currentBox = box
+ currentImg = img
+}
+function hidePrevious()
+{
+ if (currentBox)
+ {
+ currentBox.style.display = "none"
+ currentImg.style.background = "#f0f0f0"
+ currentImg.style.padding = "2em 1em 0em"
+ }
+}
+-->
+</script>
+[/JAVASCRIPT]
+</head>
+<body [JAVASCRIPT]onload="init()"[/JAVASCRIPT]>
+<h1>$$PAGETITLE$$</h1>
+<div id="left">
+[/HEADER]
+[ITEM]
+<div class="movie">
+ <div class="imgbox">
+ <img src="$$COVER_FIELD$$" height="$$HEIGHT_PIC$$" alt="$$TITLE_FIELD$$" title="$$TITLE_FIELD$$" />
+ </div>
+ <div class="info">
+ <h2>$$TITLE_FIELD$$</h2>
+ <div class="details">
+ [LOOP0 values=GCSgroups idx=GROUP]
+ <h3>$$GROUP_LABEL$$</h3>
+ <table>
+ [LOOP1 values=GROUP idx=VALUE]
+ <tr><th>$$VALUE_LABEL$$</th><td>$$VALUE$$</td></tr>
+ [/LOOP1]
+ </table>
+ [/LOOP0]
+ </div>
+ </div>
+</div>
+[/ITEM]
+[FOOTER]
+<div class="spacer">&nbsp;</div>
+</div>
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCstar/Shelf.png b/share/gcstar/html_models/GCstar/Shelf.png
new file mode 100644
index 0000000..f4423d0
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Shelf.png
Binary files differ
diff --git a/share/gcstar/html_models/GCstar/Simple b/share/gcstar/html_models/GCstar/Simple
new file mode 100644
index 0000000..1db1548
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Simple
@@ -0,0 +1,96 @@
+[HEADER]
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<!--
+ Template made by Tian. A really simple list that could be printed
+-->
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>$$PAGETITLE$$</title>
+<style type="text/css">
+body
+{
+ color:black;
+}
+h1
+{
+ text-align:center;
+ font-size:200%;
+ font-weight:bold;
+}
+table
+{
+ border-collapse:collapse;
+ margin:1em 5%;
+ margin-bottom:3em;
+ width:90%;
+}
+tr+tr
+{
+ border-top:1px solid black;
+}
+.borrowed1
+{
+ color:#777777;
+ font-style:italic;
+}
+th
+{
+ border-bottom:2px solid black;
+ margin:0;
+ padding:1em;
+ font-weight:bold;
+}
+td
+{
+ padding:0.2em 1em;
+}
+#legend
+{
+ margin:1em;
+ border:1px solid black;
+ display:inline;
+ padding:0.5em;
+}
+#note
+{
+ border-top:1px solid black;
+ margin:3em 8%;
+ margin-bottom:2em;
+ padding-top:0.5em;
+ text-align:center;
+ font-size:90%;
+}
+#note a
+{
+ color:black ! important;
+ text-decoration:underline;
+ font-weight:bold;
+}
+</style>
+</head>
+<body>
+<h1>$$PAGETITLE$$</h1>
+<table>
+<tr>
+ [LOOP1 values=GCSfields idx=title]
+ <th>$$title_LABEL$$</th>
+ [/LOOP1]
+</tr>
+[/HEADER]
+[ITEM]
+<tr class="borrowed$$borrower_FLAG$$">
+ [LOOP2 values=GCSfields idx=field]
+ <td>$$field$$</td>
+ [/LOOP2]
+</tr>
+[/ITEM]
+[FOOTER]
+</table>
+[LENDING]<p id="legend" class="borrowed1">$$BORROWED_ITEMS$$</p>[/LENDING]
+<p id="note">$$GENERATOR_NOTE$$</p>
+</body>
+</html>
+[/FOOTER]
+[POST]
+[/POST]
diff --git a/share/gcstar/html_models/GCstar/Simple.png b/share/gcstar/html_models/GCstar/Simple.png
new file mode 100644
index 0000000..3e23235
--- /dev/null
+++ b/share/gcstar/html_models/GCstar/Simple.png
Binary files differ
diff --git a/share/gcstar/icons/GCstar.ico b/share/gcstar/icons/GCstar.ico
new file mode 100644
index 0000000..ddc75ec
--- /dev/null
+++ b/share/gcstar/icons/GCstar.ico
Binary files differ
diff --git a/share/gcstar/icons/gcstar_128x128.png b/share/gcstar/icons/gcstar_128x128.png
new file mode 100644
index 0000000..6121ebf
--- /dev/null
+++ b/share/gcstar/icons/gcstar_128x128.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_16x16.png b/share/gcstar/icons/gcstar_16x16.png
new file mode 100644
index 0000000..249b4c0
--- /dev/null
+++ b/share/gcstar/icons/gcstar_16x16.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_192x192.png b/share/gcstar/icons/gcstar_192x192.png
new file mode 100644
index 0000000..a1d65b8
--- /dev/null
+++ b/share/gcstar/icons/gcstar_192x192.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_22x22.png b/share/gcstar/icons/gcstar_22x22.png
new file mode 100644
index 0000000..ba81e06
--- /dev/null
+++ b/share/gcstar/icons/gcstar_22x22.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_24x24.png b/share/gcstar/icons/gcstar_24x24.png
new file mode 100644
index 0000000..c361bee
--- /dev/null
+++ b/share/gcstar/icons/gcstar_24x24.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_256x256.png b/share/gcstar/icons/gcstar_256x256.png
new file mode 100644
index 0000000..0db7cb5
--- /dev/null
+++ b/share/gcstar/icons/gcstar_256x256.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_32x32.png b/share/gcstar/icons/gcstar_32x32.png
new file mode 100644
index 0000000..6a4aa63
--- /dev/null
+++ b/share/gcstar/icons/gcstar_32x32.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_36x36.png b/share/gcstar/icons/gcstar_36x36.png
new file mode 100644
index 0000000..09d0815
--- /dev/null
+++ b/share/gcstar/icons/gcstar_36x36.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_48x48.png b/share/gcstar/icons/gcstar_48x48.png
new file mode 100644
index 0000000..75b22e4
--- /dev/null
+++ b/share/gcstar/icons/gcstar_48x48.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_64x64.png b/share/gcstar/icons/gcstar_64x64.png
new file mode 100644
index 0000000..9ab0f26
--- /dev/null
+++ b/share/gcstar/icons/gcstar_64x64.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_72x72.png b/share/gcstar/icons/gcstar_72x72.png
new file mode 100644
index 0000000..6346b0c
--- /dev/null
+++ b/share/gcstar/icons/gcstar_72x72.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_96x96.png b/share/gcstar/icons/gcstar_96x96.png
new file mode 100644
index 0000000..fc4bb66
--- /dev/null
+++ b/share/gcstar/icons/gcstar_96x96.png
Binary files differ
diff --git a/share/gcstar/icons/gcstar_scalable.svg b/share/gcstar/icons/gcstar_scalable.svg
new file mode 100644
index 0000000..a8f4345
--- /dev/null
+++ b/share/gcstar/icons/gcstar_scalable.svg
@@ -0,0 +1,354 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="48"
+ height="48"
+ id="svg2819"
+ sodipodi:version="0.32"
+ inkscape:version="0.47pre4 r22446"
+ sodipodi:docname="gcstar_scalable.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ version="1.0"
+ inkscape:export-filename="/home/nyall/Sources/gcstar/gcstar/share/gcstar/icons/gcstar48.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <defs
+ id="defs3">
+ <linearGradient
+ id="linearGradient12410">
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0;"
+ offset="0"
+ id="stop12412" />
+ <stop
+ id="stop12418"
+ offset="0.41"
+ style="stop-color:#ffffff;stop-opacity:0.84482759;" />
+ <stop
+ style="stop-color:#eeeeec;stop-opacity:0.41379312;"
+ offset="1"
+ id="stop12414" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12204">
+ <stop
+ style="stop-color:#f8f7f5;stop-opacity:0.68965518;"
+ offset="0"
+ id="stop12206" />
+ <stop
+ style="stop-color:#f8f7f5;stop-opacity:1;"
+ offset="1"
+ id="stop12208" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12049">
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:1;"
+ offset="0"
+ id="stop12051" />
+ <stop
+ id="stop12057"
+ offset="0.02173913"
+ style="stop-color:#1c86ee;stop-opacity:1;" />
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:0;"
+ offset="1"
+ id="stop12053" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient12019">
+ <stop
+ style="stop-color:#e9f6fd;stop-opacity:1;"
+ offset="0"
+ id="stop12021" />
+ <stop
+ id="stop12029"
+ offset="0.89999998"
+ style="stop-color:#e9f6fd;stop-opacity:0.80000001;" />
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:0.62068963;"
+ offset="1"
+ id="stop12023" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient10825-3">
+ <stop
+ style="stop-color:#ff8b00;stop-opacity:1"
+ offset="0"
+ id="stop10827-7" />
+ <stop
+ style="stop-color:#ffda2c;stop-opacity:1;"
+ offset="1"
+ id="stop10829-2" />
+ </linearGradient>
+ <linearGradient
+ y2="81.559097"
+ x2="48.764919"
+ y1="49.470879"
+ x1="13.621812"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient10903"
+ xlink:href="#linearGradient10825-3"
+ inkscape:collect="always"
+ gradientTransform="matrix(0.41155376,0,0,0.37629294,-265.80467,82.438907)" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12019"
+ id="radialGradient12025"
+ cx="-84.0952"
+ cy="66.399673"
+ fx="-84.0952"
+ fy="66.399673"
+ r="53.790623"
+ gradientTransform="matrix(1,0,0,1.1502348,0,-9.9755405)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12049"
+ id="radialGradient12055"
+ cx="-168.95901"
+ cy="50.659706"
+ fx="-168.95901"
+ fy="50.659706"
+ r="34.345188"
+ gradientTransform="matrix(1.4498533,-0.12758225,0.20790246,1.4810386,65.474492,-46.435922)"
+ gradientUnits="userSpaceOnUse" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12204"
+ id="radialGradient12212"
+ cx="-194.366"
+ cy="76.325996"
+ fx="-194.366"
+ fy="76.325996"
+ r="35.096848"
+ gradientTransform="matrix(0.61646016,0.02621381,-0.01958688,0.4371301,-122.60409,75.947141)"
+ gradientUnits="userSpaceOnUse" />
+ <filter
+ inkscape:collect="always"
+ id="filter12283"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.55968507"
+ id="feGaussianBlur12285" />
+ </filter>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient12410"
+ id="linearGradient12440"
+ gradientUnits="userSpaceOnUse"
+ spreadMethod="reflect"
+ x1="76.058029"
+ y1="14.752228"
+ x2="75.362732"
+ y2="104.39509"
+ gradientTransform="matrix(0.39783017,0,0,0.38755469,3.0478444,71.768767)" />
+ <linearGradient
+ id="linearGradient12049-8">
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:1;"
+ offset="0"
+ id="stop12051-8" />
+ <stop
+ id="stop12057-0"
+ offset="0.02173913"
+ style="stop-color:#1c86ee;stop-opacity:1;" />
+ <stop
+ style="stop-color:#1c86ee;stop-opacity:0;"
+ offset="1"
+ id="stop12053-3" />
+ </linearGradient>
+ <radialGradient
+ r="34.345188"
+ fy="50.659706"
+ fx="-168.95901"
+ cy="50.659706"
+ cx="-168.95901"
+ gradientTransform="matrix(1.4498533,-0.12758225,0.20790246,1.4810386,65.474492,-46.435922)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient12624"
+ xlink:href="#linearGradient12049-8"
+ inkscape:collect="always" />
+ </defs>
+ <sodipodi:namedview
+ inkscape:document-units="px"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6"
+ inkscape:cx="58.070793"
+ inkscape:cy="21.605344"
+ inkscape:current-layer="layer2"
+ inkscape:window-width="1024"
+ inkscape:window-height="525"
+ inkscape:window-x="0"
+ inkscape:window-y="25"
+ height="350px"
+ width="350px"
+ showgrid="false"
+ inkscape:snap-nodes="false"
+ inkscape:snap-grids="false"
+ inkscape:snap-to-guides="false"
+ inkscape:window-maximized="1"
+ inkscape:showpageshadow="true">
+ <inkscape:grid
+ type="xygrid"
+ id="grid12442"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ dotted="false"
+ originy="0px"
+ spacingx="1px"
+ spacingy="1px"
+ originx="0px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer6"
+ inkscape:label="Shadow" />
+ <g
+ inkscape:label="Shape"
+ inkscape:groupmode="layer"
+ id="layer1"
+ style="display:inline"
+ transform="translate(278.8021,-83.301965)">
+ <path
+ sodipodi:type="arc"
+ style="fill:#1c86ee;fill-opacity:1;stroke:none"
+ id="path11995"
+ sodipodi:cx="-84.0952"
+ sodipodi:cy="66.399673"
+ sodipodi:rx="53.790623"
+ sodipodi:ry="61.871845"
+ d="m -30.304577,66.399673 a 53.790623,61.871845 0 1 1 -107.581243,0 53.790623,61.871845 0 1 1 107.581243,0 z"
+ transform="matrix(0.39969792,0,0,0.37173613,-220.64158,82.694658)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient12025);fill-opacity:1;stroke:none;display:inline"
+ id="path11995-2"
+ sodipodi:cx="-84.0952"
+ sodipodi:cy="66.399673"
+ sodipodi:rx="53.790623"
+ sodipodi:ry="61.871845"
+ d="m -30.304577,66.399673 a 53.790623,61.871845 0 1 1 -107.581243,0 53.790623,61.871845 0 1 1 107.581243,0 z"
+ transform="matrix(0.35487197,0,0,0.34244851,-224.17797,84.004615)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:url(#radialGradient12055);fill-opacity:1;stroke:none"
+ id="path12031"
+ sodipodi:cx="-195.46452"
+ sodipodi:cy="55.287994"
+ sodipodi:rx="34.345188"
+ sodipodi:ry="38.133259"
+ d="m -161.11934,55.287994 a 34.345188,38.133259 0 1 1 -68.69037,0 34.345188,38.133259 0 1 1 68.69037,0 z"
+ transform="matrix(0.34955445,-0.20324359,0.23891661,0.3610748,-194.81789,40.934613)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.63333333;fill:url(#radialGradient12624);fill-opacity:1;stroke:none;display:inline"
+ id="path12031-7"
+ sodipodi:cx="-195.46452"
+ sodipodi:cy="55.287994"
+ sodipodi:rx="34.345188"
+ sodipodi:ry="38.133259"
+ d="m -161.11934,55.287994 a 34.345188,38.133259 0 1 1 -68.69037,0 34.345188,38.133259 0 1 1 68.69037,0 z"
+ transform="matrix(0.24395051,0.31715383,-0.34463632,0.26837757,-183.28697,161.43492)" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer5"
+ inkscape:label="Frame Details"
+ style="display:inline"
+ transform="translate(0,-70.692917)">
+ <path
+ transform="matrix(0.42963728,0,0,0.39370638,0.8196103,71.267098)"
+ style="opacity:0.92957746;fill:#1c86ee;fill-opacity:1;stroke:none;filter:url(#filter12283)"
+ d="m 92.403138,59.05006 c 0,24.852814 -13.645663,45 -34.903138,45 -20.316188,0 -36.785713,-20.147186 -36.785713,-45 0,-24.852813 18.135902,-45.37322 38.44969,-45.703125 21.647369,-0.351562 33.239161,21.347496 33.239161,45.703125 z"
+ id="path12267"
+ sodipodi:nodetypes="csssc" />
+ <path
+ style="fill:url(#linearGradient12440);fill-opacity:1;stroke:none;display:inline"
+ d="m 32.089449,77.618419 c 5.761051,3.911675 8.752263,7.524674 8.752263,16.967628 0,9.679593 -6.174441,16.554383 -12.508561,17.647563 7.783371,-0.69205 14.069638,-7.11559 14.211772,-17.090451 0.142081,-9.971217 -3.505091,-14.44351 -10.455474,-17.52474 z"
+ id="path12366"
+ sodipodi:nodetypes="cscsc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer3"
+ inkscape:label="Orange Face"
+ style="display:inline"
+ transform="translate(278.8021,-83.301965)">
+ <path
+ style="fill:url(#linearGradient10903);fill-opacity:1;stroke:none;display:inline"
+ d="m -238.78208,107.13955 c 0,9.02702 -6.74719,16.34487 -15.07029,16.34487 -8.32308,0 -15.07028,-7.31785 -15.07028,-16.34487 0,-9.027022 5.78737,-16.531557 15.07028,-16.344869 8.32132,0.167349 15.07029,7.317847 15.07029,16.344869 z"
+ id="path10051"
+ sodipodi:nodetypes="csssc" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Eyes"
+ style="display:inline"
+ transform="translate(278.8021,-83.301965)">
+ <path
+ sodipodi:type="arc"
+ style="fill:#2287e7;fill-opacity:1;stroke:none"
+ id="path12200"
+ sodipodi:cx="-230.56732"
+ sodipodi:cy="68.167442"
+ sodipodi:rx="8.8388348"
+ sodipodi:ry="14.647212"
+ d="m -221.72849,68.167442 a 8.8388348,14.647212 0 1 1 -17.67767,0 8.8388348,14.647212 0 1 1 17.67767,0 z"
+ transform="matrix(0.37134401,-0.021034,0.0215917,0.36175264,-172.41705,77.950439)" />
+ <path
+ sodipodi:type="arc"
+ style="fill:#2287e7;fill-opacity:1;stroke:none"
+ id="path12202"
+ sodipodi:cx="-204.30336"
+ sodipodi:cy="67.914902"
+ sodipodi:rx="7.0710678"
+ sodipodi:ry="12.879445"
+ d="m -197.23229,67.914902 a 7.0710678,12.879445 0 1 1 -14.14214,0 7.0710678,12.879445 0 1 1 14.14214,0 z"
+ transform="matrix(0.39204386,0.02209561,-0.02344396,0.3769938,-165.14717,86.401306)"
+ inkscape:export-xdpi="120"
+ inkscape:export-ydpi="120" />
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="Gloss"
+ transform="translate(278.8021,-83.301965)"
+ style="display:inline">
+ <path
+ style="opacity:0.85;fill:url(#radialGradient12212);fill-opacity:1;display:inline"
+ d="m -265.40032,100.20156 c -2.68359,5.52441 -1.5331,7.47527 6.84606,5.40973 6.11499,-1.50737 11.50992,-1.7882 19.78978,1.22675 -0.0647,-6.61559 -3.94917,-12.281952 -9.09606,-14.70295 -7.39496,-1.875584 -14.40235,1.607757 -17.53978,8.06647 z"
+ id="path6484-2"
+ sodipodi:nodetypes="csccs" />
+ </g>
+</svg>
diff --git a/share/gcstar/icons/icon_install.ico b/share/gcstar/icons/icon_install.ico
new file mode 100644
index 0000000..6fe942e
--- /dev/null
+++ b/share/gcstar/icons/icon_install.ico
Binary files differ
diff --git a/share/gcstar/icons/star.png b/share/gcstar/icons/star.png
new file mode 100644
index 0000000..063d0df
--- /dev/null
+++ b/share/gcstar/icons/star.png
Binary files differ
diff --git a/share/gcstar/icons/star_hover.png b/share/gcstar/icons/star_hover.png
new file mode 100644
index 0000000..fb7f0d1
--- /dev/null
+++ b/share/gcstar/icons/star_hover.png
Binary files differ
diff --git a/share/gcstar/icons/stardark.png b/share/gcstar/icons/stardark.png
new file mode 100644
index 0000000..4c57a41
--- /dev/null
+++ b/share/gcstar/icons/stardark.png
Binary files differ
diff --git a/share/gcstar/icons/stardark_hover.png b/share/gcstar/icons/stardark_hover.png
new file mode 100644
index 0000000..0874b55
--- /dev/null
+++ b/share/gcstar/icons/stardark_hover.png
Binary files differ
diff --git a/share/gcstar/icons/web.ico b/share/gcstar/icons/web.ico
new file mode 100644
index 0000000..9cdd1d9
--- /dev/null
+++ b/share/gcstar/icons/web.ico
Binary files differ
diff --git a/share/gcstar/list_bg/Box/group.png b/share/gcstar/list_bg/Box/group.png
new file mode 100644
index 0000000..ff26ccf
--- /dev/null
+++ b/share/gcstar/list_bg/Box/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Box/list_bg.png b/share/gcstar/list_bg/Box/list_bg.png
new file mode 100644
index 0000000..302ec62
--- /dev/null
+++ b/share/gcstar/list_bg/Box/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Box/style b/share/gcstar/list_bg/Box/style
new file mode 100644
index 0000000..25b9cd4
--- /dev/null
+++ b/share/gcstar/list_bg/Box/style
@@ -0,0 +1,2 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
diff --git a/share/gcstar/list_bg/Brick_and_Glass/group.png b/share/gcstar/list_bg/Brick_and_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Brick_and_Glass/list_bg.png b/share/gcstar/list_bg/Brick_and_Glass/list_bg.png
new file mode 100644
index 0000000..42cc613
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Brick_and_Glass/list_fg.png b/share/gcstar/list_bg/Brick_and_Glass/list_fg.png
new file mode 100644
index 0000000..361a825
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Brick_and_Glass/style b/share/gcstar/list_bg/Brick_and_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Brick_and_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Dark_Glass/group.png b/share/gcstar/list_bg/Dark_Glass/group.png
new file mode 100644
index 0000000..9e634fc
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Dark_Glass/list_bg.png b/share/gcstar/list_bg/Dark_Glass/list_bg.png
new file mode 100644
index 0000000..7b6c933
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Dark_Glass/list_fg.png b/share/gcstar/list_bg/Dark_Glass/list_fg.png
new file mode 100644
index 0000000..3f4b0ec
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Dark_Glass/style b/share/gcstar/list_bg/Dark_Glass/style
new file mode 100644
index 0000000..a15c4b2
--- /dev/null
+++ b/share/gcstar/list_bg/Dark_Glass/style
@@ -0,0 +1,4 @@
+groupStyle="weight='bold' color='#ffffff' size='large'"
+groupAlign="center"
+withReflect=1
+
diff --git a/share/gcstar/list_bg/Glass/group.png b/share/gcstar/list_bg/Glass/group.png
new file mode 100644
index 0000000..bbf095c
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Glass/list_bg.png b/share/gcstar/list_bg/Glass/list_bg.png
new file mode 100644
index 0000000..028b75c
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Glass/list_fg.png b/share/gcstar/list_bg/Glass/list_fg.png
new file mode 100644
index 0000000..9886f4e
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Glass/style b/share/gcstar/list_bg/Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Green_Glass/group.png b/share/gcstar/list_bg/Green_Glass/group.png
new file mode 100644
index 0000000..ca4c99a
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Green_Glass/list_bg.png b/share/gcstar/list_bg/Green_Glass/list_bg.png
new file mode 100644
index 0000000..12d2b1a
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Green_Glass/list_fg.png b/share/gcstar/list_bg/Green_Glass/list_fg.png
new file mode 100644
index 0000000..3da18aa
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Green_Glass/style b/share/gcstar/list_bg/Green_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Green_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/group.png b/share/gcstar/list_bg/Luxury_Green_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Green_Glass/list_bg.png
new file mode 100644
index 0000000..9af5e50
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Green_Glass/list_fg.png
new file mode 100644
index 0000000..f555372
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Glass/style b/share/gcstar/list_bg/Luxury_Green_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/group.png b/share/gcstar/list_bg/Luxury_Green_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Green_Wood/list_bg.png
new file mode 100644
index 0000000..bedb34a
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Green_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Green_Wood/style b/share/gcstar/list_bg/Luxury_Green_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Green_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/group.png b/share/gcstar/list_bg/Luxury_Grey_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.png
new file mode 100644
index 0000000..bafb27c
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.png
new file mode 100644
index 0000000..77234f7
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Glass/style b/share/gcstar/list_bg/Luxury_Grey_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/group.png b/share/gcstar/list_bg/Luxury_Grey_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.png
new file mode 100644
index 0000000..14f22c1
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Grey_Wood/style b/share/gcstar/list_bg/Luxury_Grey_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Grey_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/group.png b/share/gcstar/list_bg/Luxury_Purple_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.png
new file mode 100644
index 0000000..7d8dd4b
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.png
new file mode 100644
index 0000000..85dde3e
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Glass/style b/share/gcstar/list_bg/Luxury_Purple_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/group.png b/share/gcstar/list_bg/Luxury_Purple_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.png
new file mode 100644
index 0000000..8930822
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Purple_Wood/style b/share/gcstar/list_bg/Luxury_Purple_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Purple_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/group.png b/share/gcstar/list_bg/Luxury_Red_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/list_bg.png b/share/gcstar/list_bg/Luxury_Red_Glass/list_bg.png
new file mode 100644
index 0000000..8205509
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/list_fg.png b/share/gcstar/list_bg/Luxury_Red_Glass/list_fg.png
new file mode 100644
index 0000000..1b3305f
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Glass/style b/share/gcstar/list_bg/Luxury_Red_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/group.png b/share/gcstar/list_bg/Luxury_Red_Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/list_bg.png b/share/gcstar/list_bg/Luxury_Red_Wood/list_bg.png
new file mode 100644
index 0000000..876682b
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/list_fg.png b/share/gcstar/list_bg/Luxury_Red_Wood/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Luxury_Red_Wood/style b/share/gcstar/list_bg/Luxury_Red_Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Luxury_Red_Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Marble/group.png b/share/gcstar/list_bg/Marble/group.png
new file mode 100644
index 0000000..371a322
--- /dev/null
+++ b/share/gcstar/list_bg/Marble/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Marble/list_bg.png b/share/gcstar/list_bg/Marble/list_bg.png
new file mode 100644
index 0000000..adbb4bc
--- /dev/null
+++ b/share/gcstar/list_bg/Marble/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Marble/style b/share/gcstar/list_bg/Marble/style
new file mode 100644
index 0000000..613426b
--- /dev/null
+++ b/share/gcstar/list_bg/Marble/style
@@ -0,0 +1,2 @@
+groupStyle="weight='bold' color='#ffffff'"
+groupAlign="center"
diff --git a/share/gcstar/list_bg/Wood/group.png b/share/gcstar/list_bg/Wood/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood/list_bg.png b/share/gcstar/list_bg/Wood/list_bg.png
new file mode 100644
index 0000000..b30737e
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood/list_fg.png b/share/gcstar/list_bg/Wood/list_fg.png
new file mode 100644
index 0000000..fd1b76f
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood/style b/share/gcstar/list_bg/Wood/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Wood/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Wood2/group.png b/share/gcstar/list_bg/Wood2/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood2/list_bg.png b/share/gcstar/list_bg/Wood2/list_bg.png
new file mode 100644
index 0000000..e89f956
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood2/list_fg.png b/share/gcstar/list_bg/Wood2/list_fg.png
new file mode 100644
index 0000000..968a418
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood2/style b/share/gcstar/list_bg/Wood2/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Wood2/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/list_bg/Wood_and_Glass/group.png b/share/gcstar/list_bg/Wood_and_Glass/group.png
new file mode 100644
index 0000000..6b23fab
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/group.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood_and_Glass/list_bg.png b/share/gcstar/list_bg/Wood_and_Glass/list_bg.png
new file mode 100644
index 0000000..d3e4135
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/list_bg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood_and_Glass/list_fg.png b/share/gcstar/list_bg/Wood_and_Glass/list_fg.png
new file mode 100644
index 0000000..62c1c0e
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/list_fg.png
Binary files differ
diff --git a/share/gcstar/list_bg/Wood_and_Glass/style b/share/gcstar/list_bg/Wood_and_Glass/style
new file mode 100644
index 0000000..58ff634
--- /dev/null
+++ b/share/gcstar/list_bg/Wood_and_Glass/style
@@ -0,0 +1,3 @@
+groupStyle="weight='bold' color='#ffffff' size='medium'"
+groupAlign="center"
+withReflect=1
diff --git a/share/gcstar/logos/Peri.png b/share/gcstar/logos/Peri.png
new file mode 100644
index 0000000..08f39ff
--- /dev/null
+++ b/share/gcstar/logos/Peri.png
Binary files differ
diff --git a/share/gcstar/logos/Peri_main_logo.png b/share/gcstar/logos/Peri_main_logo.png
new file mode 100644
index 0000000..cb4cd37
--- /dev/null
+++ b/share/gcstar/logos/Peri_main_logo.png
Binary files differ
diff --git a/share/gcstar/logos/Peri_main_logo.svg b/share/gcstar/logos/Peri_main_logo.svg
new file mode 100644
index 0000000..98bff66
--- /dev/null
+++ b/share/gcstar/logos/Peri_main_logo.svg
@@ -0,0 +1,3436 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.1"
+ xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" i:viewOrigin="-192 208" i:rulerOrigin="0 0" i:pageBounds="0 16 16 0"
+ xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" width="401" height="401"
+ viewBox="0 0 401 401" overflow="visible" enable-background="new 0 0 401 401" xml:space="preserve">
+<metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="3.1.1-111">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>image/svg+xml</dc:format>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xap="http://ns.adobe.com/xap/1.0/"
+ xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xap:CreatorTool>Adobe Illustrator CS2</xap:CreatorTool>
+ <xap:CreateDate>2005-11-07T17:36:23+01:00</xap:CreateDate>
+ <xap:ModifyDate>2005-11-07T17:36:23+01:00</xap:ModifyDate>
+ <xap:MetadataDate>2005-11-07T17:36:23+01:00</xap:MetadataDate>
+ <xap:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xapGImg:width>256</xapGImg:width>
+ <xapGImg:height>256</xapGImg:height>
+ <xapGImg:format>JPEG</xapGImg:format>
+ <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqh7q/trUfvXox6KOuThjMuTCeQR5pTdeb&#xA;LWFWchVRASzO1AANyTmVDRyLi5NbCIs8mNJ+Zesaq8sPl3SlmCEKNQuWZIAwbf4BRmBXp8QPtmwP&#xA;ZOPHRyzr+iOfz/Y6X+XsmYkafHf9KWw+Xu8735IqLzL58tyZLu0027jCn9xbvNBIT2o8nqr+GVnS&#xA;aaW0TOJ7zR+6mce0NbHecMch3RMgftsMm0LzDYazFK1sHint24XNpMAs0ZP2eSgsKMBVWBIP0HNd&#xA;qNLLERe4PIjkXcaPXQ1APDYMTRieY/t6HqmeY7mOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxVK/MmvWuh6VJfXDAGoSFD+1Ieg/CuZOl00s0xEOHr9bDTYjOZ93&#xA;veR6h57eaR5KtI7bljsDnUYuzaFPEZ/aGyaBKG0qPUPNuqLp7MYtPipLestd1B2Wvie339sszGGl&#xA;hxc5HYNGlnl1+TgPpxjc/j7vnvT0GGxW4g+oaaPqWmQ1jM0XwsxH2hGRSnu3jnnuo7WzZsp8I1EH&#xA;eZF2f6IO1DvO3k+mabsfDhxAZBzG0QTGh5kb2fLf4oW+/LvRrkGRJriC9G6XiSfvA3if5sydL2rq&#xA;cR3mZx6xkI19gFfBxtZ2HpMw2gIT6SiTxfaTfxvypjOl61qPl3zIkerOBc2DLFcXhUkT2ErAMxoC&#xA;x47OKb1WnjXrjjhqsHFj5S6fzZj8V7jbxPjz0GrEcvONDir6sZP6Nj13BHffaM5V712KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvGPzo18za5BpMbfu7GMPKoP+&#xA;7Zhy3HsnGnzzrewdNWMzP8R+wfteC9qtTx5hiHKA395/Z97zpZSzgHp1PyG+b6nljGg9N8oINM8m&#xA;vdqON1qUh+PvxFQPwBIzz3207QOLGaO/0j48/sfSvYfs+M6JHO5H3R2A917shh83+XtO02EXMptl&#xA;QLHRkZqtT/IDddznK9hXqyMOEeqMbPu7/mXre2sw0cTmzH0mVD393fyT2w1Gyv7dZ7SZJonFQyEH&#xA;M3N+7ySxy+qPNpw5BkxjJH6ZcmG/mRp8ck8NyF/efUrn1H/yYZIWX8XP351Hs3qDUo9OKP2iX6nj&#xA;va3TxlR6+HPf+rKBH3/a9L02e4uNOtZ7mL0biaGOSaH+R2UFl38DtmvyxEZkA2AS9Dp5yljjKQqR&#xA;AJHca5IjK212KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtO6ojO5C&#xA;ooJZj0AG5OEC0E1u+XNf1V9W1u+1Jq/6VM8ig9QhPwL/ALFaDPRtNh8LHGHcHybV6g5sssh/iN/q&#xA;+SBU0OXFxi9WtSZPK+kRp9n0yT81AH8c8k9u8Z4b7sn3gvrvsPlAiB/Q+4pT5g8v3mo2sUdsV5rJ&#xA;yYOaClCK9D0zR+x/buDs7LklmupQ2rfcHl8XZ+13ZObtDDCGIi4zvfYVVfYr6hY6pp+kWlppBkF0&#xA;0kUAmj5AqN2ZyV6KSvxdqZd2H2jg1HaWXV6ogQEZzo/ACI7zR28w4vbOmzYOz8el01mRlCFj5mRr&#xA;kLHq6USm3mWa51K1j02oN7dNFp1vJQULXEqSu78asPTW3XlQdGzpPY7LOWOWeYqNmXwiCPtMiB/V&#xA;LofauEZyjghvM8MfK5SjI312EAT5SD1XF3bzfzh+Zk0eoPpGiV5owilvEAdzJWhSFSGHX4SSD3oO&#xA;hzf6LskGHiZPl5ef4/U8d2r7RmOU4cPPkZDc33RH2X76HVDQ+SvNWpQpc3kEbNSoXUJmknp17rNT&#xA;5Mw+jJy1+HGaiT/mih+j7lh2VqMsRKcYn+vK5fdL7/ku8u65qOka1Dp83qpG00dncafIaiMyMEQx&#xA;ipVOJcN8Hwsvj8JA1OnjlxmQrkZCXf7+/wCO4PxDPR6yWDKIGwOIQMD0vYUOQ5g+naQ79iyzzP5s&#xA;XTJVsbQLJfsA8hepSJD0JpTkzU2WvuewbWaXR8Y4pfT9/wCz+zvrda7tDw5cEfr5nuA/ST3fE9BK&#xA;PW2la5r0AuHQXcRIkimv3KxMenKJAknHYVqsYU9szZ5ceE1fD/V5/HcfaSXWwwZNRHirjHMGZ2Pn&#xA;HY18IiJuwtaK/wBDulhVRYXQHqxmLe3l7MSBwEigtRgwDCtfhqrY3HKL+qPLfmP1fd79wnhlhlwg&#xA;eHPnt9J7+7iHQ3RHP03Esi1HzUDa2qWY4XN1Ck0pND9XSRAwBBBBkPLYEU7nsGwoaSieLkDXv/Z+&#xA;PdssmvuMeAbyFn+jY/3Xl8T0BDaMusXazPZ3TILUiJWuJJJQ7lQWBDFuiOCGNfi7EDeeYwjXEPq7&#xA;gB+N+nc16cZJXwH6dtyTffz8jz336HqKvrrU7GGG0kuaXNzI8rSKOfCCPiCiuw+0zMOq9CwHQHK4&#xA;RhK5VsNvietfjpfc25Z5IVHi3kb7/SK2vzNdOXFXIEGXl+WaXS0klkeVi8oDyijcVkZR2FRQbHuP&#xA;HrlOoAE9hXL7nJ0kiYWSTuefvP4B6jv5oq51CwtCourmKAtuoldUrTw5EZXDHKX0gltyZoQ+oge8&#xA;qokjMfqBh6dOXOo48aVrXwyNG6Z2KvopWmoWF4HNncxXIjPGQwusnFvA8SaHJTxSh9QI97Xiz48l&#xA;8EhKudG189xb28RluJUhiX7UkjBVHzJoMEYmRoCyznOMRcjQ82re6tblDJbTJOgJBeNg4qOoqpOM&#xA;oSiaIpEMkZi4kEeSrkWbsVdirsVdirsVdirsVQ93qNlaD/SJlj9jufuGWQxSlyDXkzRhzLBvPH5h&#xA;6L+gtQ060lJvbmFoUJA4gP8AC9SCSPgJptm47P7MyeLGch6Qbec7X7bweDPHE3OQr58/seGkUNK1&#xA;9xnZPCB2Ks78qas1xopsI6Ne2T+vbRM3ESDcMlfEqxpXYGhzmO3uy46mEoS2jMVfceh+Br3iw9H2&#xA;D2nPARw7zgeIC64gfqH2nyBo9GVabqek3cXKOdEkX+9gkISWMjqroTUEHPEtf2DrNLMxnjke6UQT&#xA;GXmCP7e8B9U0nben1MOKEx5xO0h5EfgdyH1TzXpFkpit5Y7m73HFWBRKdWlZa0A8B8R7DNp2L7H6&#xA;vVzByRliw9TIUT5RB533/T59HVdq+0+m00ajITydwOw/rEcq7vq7gmX5d6FdX14nma/UrCiuNLVi&#xA;Q7tJVZrl1BoOQ+BB/L7KpPpWsOPTYhpsWwFX5Aco/pJ79+ZLzPZGnyZ8v5vL1vh875yI8+QHSNDl&#xA;GJZB+YeuvovlO8uYn9O5lAt7dgSrB5TQlSNwypyYfLMfszT+LniDyG5+Dse29WcGmkQakfSPee7z&#xA;As/BgX5L6Lb3t/davOhb6hxjtQfs+pIDybr1VRQV/m8Rm67ezmERjH8XP3D8fY8x7K6CMskssv4P&#xA;p95u/kPvZh+Y3nm88rWtr9UsxPNdlgs0vL0U4U2IWhJNdhUZquy+z46mR4jQj83oe2u1J6SMeCNm&#xA;XU8h+PexDyt+Z8mp+ZYpNX0qxBWGZzfwREXESwwvKSGdnJHFSKCnX6M2us7IGPCRjnLmNidjZA8n&#xA;R6HtzxNQJZYY9oy9Qj6hQJ52el7Ma8qWsvm/z7HJqR9VJ5Xu7xa1BSMchHRj9ivFKdlzYa2Y0ulq&#xA;G1Ch+v39fe6zs/GdZrAcm9kyl8Om/TkPc+hQAAABQDYAZwr6UoXmn2F6qpeW0VyqHkizIsgVvEBg&#xA;aHJwyyh9JI9zVlwY8gqcRKu8W8S8za5q9t57v9M0qVb1ZboJDE4X++m4lo+Q4n4ZGKbntnXaXTY5&#xA;aaM5jhqP2Dr8t3hNbq8sNXKGM8dy2G3M9OnI7c0XrusS6f5gTy40X6UnVowUHFIvrk6qKRqeVRx4&#xA;KC5qDy6A0yrT6cTxeKDwDf38I7/t5eXc26vUyx5/BI8WW3kOMjoN/Ib7g8XQ0muo+Y7MeYn0OCcz&#xA;X9ssGmWs0nNlmlRaVcitG9aRg59sxYaSRxDIRUDcj5Dy+A2c2eujHMcINziIwiT/ABEd/ceIkSR9&#xA;7qGmT6udJgeO5ayKafZWpf1JPgUI9VapB5cg7fyrU7DKI4piHGbHF6ieQ/Hd5lyp5sRyeGKlw+iI&#xA;uztsdvfdnuFlM7jSpdGhiLNDS4ehhgj4cGKlmJNfjFRTlxHbbMYZBlJ57d5/Ffa5ngHAB9PqPKIq&#xA;up9/voLtP0ebUfUuoFgtgjlUuJIfVaRgPiICtHQK21eVSQRQdSJ5RCgbPldV9/4pceCWQmURGNdS&#xA;Lv5Ecvf0IobFbp1298+mSRMsU8zxyI4HMKvH1ZUBIGzxKy1p3xnj4DMHcC/1D5GijFlOWOOQ2lLh&#xA;Pf8A0iPjGxa4XhKRXj85JpCBc3EaB5o0NeXpo3KgVv2ACeuzN1HBuY8h0HT4/r+0BkclRE9yepA3&#xA;A60PL+bv7ieZlaxNdXUbQ3UVwkTI5masd3Gla8HQKK8ypG/Hbsab1SPCNwRfxifj5fH3uRjBlLYg&#xA;1XlIDuI86/o7dNtz7MRz3Yq7FXYq7FXYq7FXYq811P8ALzzdq+tXJvNVig0p5HZGj5PIUYnivCiC&#xA;tOvxU8K50GHtPBixjhgTOvg8lqOxNVqMsvEyAYiTy7vdt8d2CfmP5Z0jy5qVrYWM8887Q+tcvOyE&#xA;DkxVAoVVp9kk19s3XZeryZ4GUgALoU6Htjs/FpcghAyJqzdfo/HJiObR1DgK4q9F8ofl5puvaEL/&#xA;AErWXi1iE/v4XjCrG9DxQhW5cWPSQHpX4a1A0Ot7TnhycM4XjP2/ju+16LQdi49Vh48eSso5ju7u&#xA;W+/877L2Ai+/K/ztdXCR3MdhOxHxXwdl8B8Xwq5/4E5DH2vp4iwZjy/H605vZ3WTkATA/wBL9e2/&#xA;yT7yx+T1taSxXWuTJdvG3IWMIP1eoJp6jOA0g6GlFHY8hmDq+3DIGOMcPmefw7vt+DsuzvZaGOQn&#xA;mPHIdP4fj3/Z8Q9HVVVQqgKqigA2AAzQEvWgUxL80tCu9Y8pTR2aNLc2siXKQoKs4SqsAPHi5NBu&#xA;aUzadj6iOLODLYEU6Tt/Ryz6aoi5RPFXfzH3G3l35d/mCnlY3FvdWz3FldMrsYyokjZQQSAaBqim&#xA;xYdM6PtTsz8zRiakPteU7G7Y/KXGQ4oS7uY/X80x83/mTe+bLb9BaPpsghuGBYf3s8vAh1Cog+Gh&#xA;Wp3P0ZRoeyo6Y+LkluPgA5PaXbc9WPBxQPCfjI1vyHL7fgyjyZ+Vp03Rr9tRZRq+pWstsKfGtsky&#xA;FSNjRm3+Ij5A9Sddr+2PEyR4PohIH+tTtuzuwTjwz4z+9yQMe/hsfae/5Dz5noOq6l5L80+tc2h+&#xA;sWvOG5tHPAsrDs1G9mBHX5Z0Gpww1eGgdjuC8tpNRk0OouUfVGwY/t399/oZxqv55l7Yx6TppS5c&#xA;UWa4cMqmvZEHxf8ABDNPh9nqNzlt5O+1HtV6f3cKPfLp8P2pt+Xmnec4Gv8AzD5jurgrNC3pafO7&#xA;VJqJPUMdeMVOPFV413OwHXG7Ty6eXDixAbH6h8qvr5uZ2Nh1UTLNnlKiNon53X8PcBXyHOE/ltBJ&#xA;e+Z7zzLqBL22lRzahey8QeUrKxG23xfacf6ubftWQhhGGHOdRHu/G3xdD2LEzzyzz+nGDOR89/t5&#xA;n4LPIvqah5q1DzPfRepDpkdxqt0qr8JlozIik7K3Illr/Lku0ahgjhid5mMB7vxsfex7KvJqJZ5i&#xA;xASyHbrz+Bvce5f+W6Tza5qfmm8Vp10i2uL6Z9vjndWIU17sObV8Rke1SBjjhjtxyEfh+KZdignN&#xA;PUS9XhxlM+ZN/fufgmX5NaVPqPmS9166rJ9WVqTMTU3FwTVvA/Bzr8xmP27mGPDHFHr9w/bXycr2&#xA;b08suolmlvw9f6Uvv2u/eF35z6nez+ZtO0y15creENEI6iQzXD0oKbnaNaYOwcMRhlOXU/YP7Sn2&#xA;mzSlqIQj/CNq53I/sDOvMJk8sflxcpCec9rarAZlJUmWYiJ5q7nlzkL/ADzTaWtRqxfIyv4DevkK&#xA;d/rb0mgIHMRq+W8tjL32eL3sA8m+aNX0jQrzzNfRy6nBDJHp9rFyCKpcc5HdgrUA4ooJB3NM3eu0&#xA;WPJlGGNQJHEf0V9rz3Zuvy4cMs87yCJEBv37knn/AEdz3+aeXX5leRr3RZr545bXWnQk2sAZZTLx&#xA;4KTMF9JwNqGSuw+z2zDj2TqI5BHaWPvPKvdzHw+bn5O3NLLEZ0Y5T0Gxvl9VcJ+N7fw9Eh/LOXzF&#xA;ea4+v3tzcSaVpUM73Mjs7K3KPeJF6E9HoPAe2Zva0cMMfhREROZFfPmfu+Pvdd2JLNPN485SOPGJ&#xA;XzPTkPsNeQ8nq2geY4tXe4iELQTWwjd0YOBwm5cPtpGa/AeW1Ae5zmtTpTiAN2Df2e4l6/R64ZyR&#xA;VSjR68jdcwO7fuO1lN8xXOdirsVdirsVdirsVdir53/NGK9TzvqEl0pAmKPbvQhWiEaqhXxpxofc&#xA;HO77HMTpoiPTn77fNO3YyGrmZda+VCv1e8MUzZuoegflV5LsteGp3GoIWto41ggYEgiVzyLKR3QK&#xA;P+CzR9s6+WHhEOfP4fj7nouwuyoakTOQemqHv538P0s58q+Q59D11LyOqRKrxysrikiFdgRUmnKh&#xA;+jNNrO0hmxcJ5u97O7E/LZhOPmOfMf20WdZpno3Yq7FXYqlF95R8r38xnu9LtpZ2JZ5TGodiepZg&#xA;AW+nMrHrc0BUZyA97h5eztPkNyhEn3IvTtG0jTQw0+ygtOYAf0I0jLU6cioFfpyrLnyZPrkZe8tu&#xA;HS4sX0RjG+4AIzKm9BaloejanT9I2MF2VBVGmjV2UHrxYiq/Rl2LUZMf0SMfcWjNpcWX64xl7xan&#xA;p3lvy/prrJYabbW0qghZo4kElD1+OnL8cll1WXIKlKRHvYYdFhxG4QjE99C/mmDKrqVYBlYUZTuC&#xA;D2OY4NOSRaGsNJ0vT7Y21jaRW1uxJeKJFVWJFCWAG5p45bkzTmbkSS1YdPjxx4YRER5BbbaNpFtb&#xA;S2ttY28FrOCJ4I4kSNww4nmqgBqjbfGWfJIiRkSR1tENNihExjGIieYAFH3utdF0i0sXsLayhhsp&#xA;QRLbpGqo4ZeLc1A+Lkooa9cZ58kpcRkTIdbXHpsUIGEYgRPMVsfev0/TdP062FrYW8dtbqSRFEoU&#xA;VPU7d8GXLLIeKRsssOCGKPDACI8lkujaTNfpqE1lBJfRgCO5eNWkUKajixFRTDHPMR4BI8PdezGW&#xA;mxymJmIMx1rdEXNtbXUD29zEk8EgpJFIodGHgVaoOQhMxNg0W2cIzHDIWD0Kkmmaalj9QS0hWwoV&#xA;+qCNBDRjUj06caEmvTJHNMy4rPF33v8ANgMGMQ4BEcHdW3ySqPyF5NjnM66Pal26howyd+iNVB18&#xA;MyT2lqCK45fjzcOPZGlEuLw437tvlyTuGCCGFIIY1jhRQqRIAqqo2ACjYDMOUiTZO7nxgIgRAoDo&#xA;pWWnafYRtHZW0VrG7cmSFFQFvEhQMnkyymbkSfe14dPjxCoRER5CkRlbc7FXYq7FXYq7FXE03OKp&#xA;B5k81WOl2ch5gyUIr2H9uZul0cskg67XdoY8ECSXjWp+ehfztBqNjFqGnBiY4ZCUljJ6mKZPiQtt&#xA;Ubr7Z1uLs7gFwkYz+w+8dfveEydrnLI+JATx9AeY90hyvrzCWPH5JkCsk+pWrH7cRhguQPk/q29f&#xA;+BzIB1A5iB+JH2VL73GlHTECjkj3+mMvt4ofc938h6JZaR5atobQShLkfWm9cKsvKVQfjC1AIUAU&#xA;zi+0dRLLmJlW223LZ9D7J0sMOCIjfq9W/PfvZBmC7J2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVbNH6kTx1K8gRyHUVwxNG0SFimLy/l3pV5di41Sea9VTVb&#xA;Yn04q+LBfiP/AAWbGPak4RqAEfPq6fJ2JiyzEsplOunKP6/tYZ+Z/k7yjYg6hDN+jbhgF+pworJI&#xA;wG3COqcfc1p7Vrm37I12efoI4x3np8XSdvdm6bH64ngl/NA2PuG1efTyY9+XXkC58wX8d5eRMmiw&#xA;Nyldqr6xU/3aHwqPiI6fPM7tTtIYI8MT+8P2ef6nW9jdjy1MhKY/dDn5+Q/T+t79nEPozsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSnV/Kfl3WLu&#xA;C81KxS5uLcUidy1KA8qMoIVxXswOZWDW5cUTGEqBcHU9m4M8xPJHilH8b948imkUUUMSRRIscUah&#xA;Y41AVVVRQAAbAAZjEkmzzcyMREAAUAuwMnYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYqhX1SzQkc+RHgCcmMZYHIFP8AS9t2Vz9A/rh8Mo8UO/SsR6I34Y+GV8QL&#xA;hqSH9g/fg4F8RcNQQ/sHHgTxrxexnsfwwcKeJcLmI+IwcKeJUV1boa4KS3irsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVU3t4JDV41Y+JArhEigxCmdPsz/uofQSP1HD&#xA;xlHAGv0dadkP3nDxlHAG/wBH247H78HGV4A2LKAdj9+PEU8AXC1hH7P4nHiKeELhDEOi4LWl4AHQ&#xA;UwJdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdir/9k=</xapGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xap:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/">
+ <xapMM:DocumentID>uuid:0D242DA2AC4FDA11B312AE4ADC8A7260</xapMM:DocumentID>
+ <xapMM:InstanceID>uuid:0E242DA2AC4FDA11B312AE4ADC8A7260</xapMM:InstanceID>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?>
+ </metadata>
+<switch>
+ <foreignObject requiredExtensions="&ns_ai;" x="0" y="0" width="1" height="1">
+ <i:pgfRef xlink:href="#adobe_illustrator_pgf">
+ </i:pgfRef>
+ </foreignObject>
+ <g i:extraneous="self">
+ <g id="Calque_1" i:layer="yes" i:editable="no" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
+ <rect x="0.5" y="0.5" fill="none" stroke="#FFFFFF" width="400" height="400"/>
+ </g>
+ <g id="logo_x5F_GCfilms" i:layer="yes" i:editable="no" i:dimmedPercent="50" i:rgbTrio="#FFFF4F004F00">
+ <g>
+
+ <linearGradient id="XMLID_84_" gradientUnits="userSpaceOnUse" x1="464.9299" y1="-455.522" x2="289.7179" y2="-477.1064" gradientTransform="matrix(1 0.0046 0.0046 -1 -289.3605 -205.7951)">
+ <stop offset="0.0056" style="stop-color:#FFFFFF"/>
+ <stop offset="0.3072" style="stop-color:#ECF2F9"/>
+ <stop offset="0.9175" style="stop-color:#BAD2EA"/>
+ <stop offset="1" style="stop-color:#B3CDE8"/>
+ <a:midPointStop offset="0.0056" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.3072" style="stop-color:#ECF2F9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#ECF2F9"/>
+ <a:midPointStop offset="0.9175" style="stop-color:#BAD2EA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#BAD2EA"/>
+ <a:midPointStop offset="1" style="stop-color:#B3CDE8"/>
+ </linearGradient>
+ <path fill="url(#XMLID_84_)" d="M132.352,262.551c-0.012,2.467-21.148,4.367-47.21,4.246
+ c-26.062-0.119-47.18-2.217-47.168-4.684c0.011-2.465,21.148-4.367,47.209-4.246
+ C111.244,257.986,132.363,260.085,132.352,262.551z"/>
+ <g>
+ <path i:knockout="Off" fill="#FFFFFF" d="M382.129,194.818c-0.992-0.993-2.266-1.519-3.683-1.519
+ c-1.016,0-1.948,0.281-2.759,0.803c0.052-0.266,0.105-0.531,0.138-0.805c0.443-3.673-0.979-6.05-2.966-7.64
+ c0.496-0.16,1.005-0.387,1.528-0.697c2.944-1.732,4.224-5.028,3.029-7.834c-1.1-2.572-3.624-3.624-4.839-4.127
+ c-6.059-2.543-12.757-2.287-18.363,0.707c-1.276,0.684-2.379,1.47-3.321,2.341c-0.437-0.839-1.059-1.624-1.913-2.322
+ l-0.15-0.151c-0.003-0.001-0.246-0.175-0.246-0.175c-3.16-2.265-7.138-2.194-9.854-1.945c-1.664,0.154-3.25,0.48-4.724,0.972
+ c0.006-0.001-0.263,0.088-0.263,0.088c-0.935,0.314-1.729,0.576-2.373,0.6c-0.152-0.062-0.398-0.181-0.577-0.267
+ c-0.349-0.168-0.782-0.379-1.283-0.567c-1.665-0.637-3.439-1.031-5.246-1.159c-1.841-0.127-3.566,0.015-5.144,0.425
+ c-0.665,0.171-1.284,0.387-1.785,0.561c-0.64,0.22-1.181,0.407-1.568,0.444c-0.457,0.044-1.206-0.069-1.932-0.18
+ c-1.948-0.291-4.549-0.655-7.141,0.711c0.2-0.6,0.337-1.019,0.335-1.016l0.002-0.008c0.396-1.18,1.129-3.378,0.407-5.71
+ c-0.903-2.919-3.816-4.531-7.25-4.008c-1.454,0.22-3.237,0.865-4.82,2.506c-0.434-0.769-1.052-1.444-1.854-1.976
+ c-1.959-1.303-4.627-1.34-7.063-0.147c-2.898-2.799-8.086-1.713-8.138-1.701c-2.988,0.662-5.713,2.35-8.115,5.016
+ c-0.836,0.927-1.536,1.924-2.151,2.802c-0.299,0.423-0.585,0.819-0.864,1.195c-0.86-3.145-3.153-5.964-6.404-7.795l0.002,0.002
+ c-4.699-2.65-10.969-3.066-17.653-1.173c-4.856,1.378-9.38,4.144-13.091,8c-1.12,1.165-2.144,2.423-3.085,3.743
+ c-0.002-0.98-0.152-2.006-0.48-3.051c-0.946-2.998-3.185-5.618-6.307-7.38c-4.703-2.646-10.971-3.06-17.649-1.168
+ c-9.6,2.723-17.588,10.789-20.851,21.051c-2.234,7.024-1.416,13.599,2.244,18.038c4.392,5.332,11.449,5.824,15.265,5.642
+ c5.93-0.277,11.632-2.402,16.484-6.139c1.841-1.416,4.039-3.252,5.949-5.485c0.56,2.188,1.534,4.166,2.911,5.837
+ c4.391,5.33,11.446,5.825,15.266,5.646c5.89-0.281,11.556-2.375,16.385-6.059c0.637-0.487,1.499-1.147,2.36-1.97
+ c-0.337,2.125-0.206,4.698,1.823,6.607c1.183,1.111,2.753,1.69,4.426,1.623c2.536-0.102,4.772-1.61,6.026-2.989
+ c0.316-0.349,0.593-0.714,0.855-1.084c0.617,1.684,1.92,2.989,3.636,3.568c2.76,0.941,5.786-0.19,7.426-1.637
+ c0.429-0.378,0.796-0.783,1.14-1.193c0.116,0.24,0.249,0.483,0.407,0.719c0.908,1.373,2.34,2.279,4.027,2.543
+ c2.508,0.39,4.961-0.719,6.298-1.791c0.622-0.492,1.145-1.053,1.597-1.633c0.674,1.559,1.854,2.396,2.757,2.831
+ c3.46,1.656,7.563,0.003,9.964-4.022c0.727-1.216,1.135-2.466,1.46-3.472c0.002-0.009,0.141-0.422,0.141-0.422
+ c-0.005,0.016,1.434-4.307,1.434-4.307c0.164-0.49,0.341-1.033,0.531-1.648c0.515-1.621,1.045-3.305,1.785-4.614
+ c0.723-1.282,2.437-2.394,3.775-2.177c-0.114,0.588-0.373,1.314-0.629,2.022c-0.123,0.34-0.265,0.735-0.399,1.135l0.073,0.012
+ c-0.286,0.646-0.531,1.366-0.782,2.124l-0.702,2.114c-0.003,0.013-0.221,0.677-0.221,0.677c-0.317,0.979-0.69,2.13-1.027,3.272
+ l-0.149,0.505v0.02c-0.459,1.639-0.995,4.134,0.349,6.506c0.843,1.488,2.236,2.495,3.928,2.844
+ c2.467,0.51,4.897-0.49,6.347-1.596c2.698-2.045,3.688-5.325,4.344-7.496c-0.002,0.002,0.119-0.398,0.119-0.398
+ c0.435-1.424,0.908-2.881,1.368-4.291l0.063-0.193c0.004-0.012,1.063-3.304,1.063-3.304c0.538-1.708,1.132-2.983,2.305-3.718
+ c0.512-0.322,1.243-0.559,1.801-0.536c-0.045,0.328-0.153,0.847-0.41,1.658c0.004-0.003-0.041,0.135-0.041,0.135
+ c-0.714,2.261-1.524,4.826-2.377,7.265c-1.499,4.281-1.449,7.458,0.155,9.712c1.164,1.637,3.003,2.533,5.177,2.521
+ c2.955-0.005,4.942-1.676,6.289-3.574c0.764,0.866,1.649,1.558,2.496,2.029c4.323,2.388,10.096,2.638,17.16,0.747
+ c3.296-0.879,6.737-2.86,9.002-5.737c0.144,1.13,0.633,2.182,1.455,3.004c0.986,0.986,2.284,1.529,3.654,1.529
+ c1.377,0,2.687-0.544,3.687-1.532c0.964-0.95,1.495-2.247,1.495-3.65C383.628,197.085,383.096,195.784,382.129,194.818z"/>
+ <path i:knockout="Off" fill="#FFFFFF" d="M137.419,202.284c0.012,0.025,0.019,0.053,0.031,0.078
+ c0.008,0.016,0.021,0.031,0.029,0.051L137.419,202.284z"/>
+ <path i:knockout="Off" fill="#FFFFFF" d="M172.476,136.879l-0.01-0.01l-0.007-0.009c-0.003-0.001-0.012-0.013-0.018-0.017
+ c-0.307-0.407-0.639-0.819-1.039-1.286c-2.015-2.348-4.362-4.217-6.967-5.568l0.067,0.035l-0.207-0.126
+ c-0.005-0.002-0.032-0.014-0.066-0.029c-0.063-0.038-0.129-0.077-0.226-0.127c-0.187-0.098-0.359-0.178-0.497-0.244
+ c-0.061-0.027-0.116-0.054-0.158-0.075l-0.013-0.006c-0.125-0.06-0.138-0.066-0.138-0.066l-0.1-0.049
+ c-0.093-0.049-0.246-0.132-0.441-0.217l-0.078-0.034c-0.116-0.046-0.195-0.076-0.195-0.076l-0.034-0.013
+ c-1.978-0.85-4.147-1.408-6.378-1.627c-2.538-0.282-5.249-0.133-8.012,0.451c-0.076,0.016-0.371,0.078-0.371,0.078
+ c-0.114,0.023-0.262,0.062-0.387,0.088l-1.649-0.15l-0.247-0.039c-1.03-0.165-2.025-0.29-2.958-0.369
+ c-13.499-1.652-31.593,1.844-40.393,27.953c-0.722,2.144-2.493,7.979-4.733,15.367l-2.848,9.363
+ c-9.089,0.619-15.507,2.667-19.093,6.104c-1.508,1.314-2.433,3.182-2.534,5.167c-0.028,0.561,0.034,1.132,0.149,1.723
+ c0.405,3.66,3.474,6.563,7.207,6.778c2.252,0.132,4.439-0.712,6.002-2.313l0.079-0.064c-0.068,0.072-0.112,0.105-0.113,0.106
+ c0.267-0.199,1.246-0.629,3.218-1.06c-0.076,0.244-0.338,1.074-0.338,1.074l-1.156,3.656l-0.056-0.111
+ c0.005-0.016-2.783,8.315-2.783,8.315l-0.299,0.893l-0.09,0.271c0.017-0.047-0.049,0.142-0.049,0.142l-0.596,1.711l0.015,0.023
+ c-0.514,1.5-0.709,1.998-0.781,2.159c-0.521,1.124-1.351,2.135-2.405,2.926c-1.049,0.763-2.435,1.394-4.193,1.899l-0.563,0.155
+ c-1.674,0.457-4.205,1.144-5.874,3.504c-1.94,2.755-1.774,6.442,0.397,8.966c1.95,2.276,5.118,3.228,8.473,2.543
+ c2.214-0.45,4.518-1.197,6.846-2.226c0.004,0,0.222-0.099,0.222-0.099c0.842-0.371,1.734-0.77,2.623-1.252
+ c0.404,0.377,0.825,0.734,1.264,1.075c-0.85,1.118-1.378,2.436-1.519,3.831c-0.204,2.029,0.392,4.006,1.675,5.571
+ c1.268,1.545,3.057,2.504,5.038,2.696c1.297,0.134,2.624-0.084,3.823-0.634l-0.02,0.04c4.696-2.093,8.683-4.902,11.849-8.358
+ c1.53-1.721,2.89-3.618,4.083-5.681l-0.048-0.035c0.219-0.309,0.422-0.62,0.596-0.943c1.171-2.165,2.154-4.488,2.921-6.9
+ l0.324-1.018l0.056-0.021c0.118-0.034,0.683-1.813,0.683-1.813l0.023-0.075l2.144-6.741l0.006,0.004
+ c0.004,0,1.072-3.381,1.072-3.381c0.032-0.1,0.065-0.194,0.097-0.293c0.198,0.256,0.36,0.483,0.522,0.715
+ c0.359,0.515,0.766,1.097,1.452,1.761c2.832,2.741,6.75,3.37,9.785,1.594l-0.042,0.029c0.031-0.016,0.051-0.031,0.081-0.049
+ c0.013-0.009,0.028-0.013,0.042-0.02l0.382-0.231l0.094-0.095c0.011-0.006,0.028-0.018,0.036-0.023
+ c0.205-0.137,0.456-0.304,0.737-0.555c2.534-2.259,3.174-5.932,1.611-9.156c-0.468-1.027-1.11-1.945-1.919-2.729
+ c-0.076-0.076-0.146-0.129-0.221-0.195c-0.31-0.36-0.632-0.732-0.984-1.124c-0.45-0.516-1.005-1.139-1.64-1.819
+ c0.083,0.007,0.167,0.021,0.25,0.031c0.639,0.363,1.265,0.697,1.89,0.981c2.786,1.269,5.753,1.987,8.823,2.14
+ c0.046,0.002,0.138,0.006,0.138,0.006l0.206,0.011c0.12,0.008,0.29,0.011,0.44,0.014c4.102,0.101,8.095-0.795,11.998-2.663
+ c0.223-0.104,0.423-0.218,0.569-0.3c0.052-0.03,0.108-0.061,0.135-0.075c0.523-0.26,1.099-0.568,1.66-0.891
+ c8.19-4.73,14.806-13.263,18.146-23.411c4.192-12.732,2.521-26.267-4.359-35.322L172.476,136.879z"/>
+ <path i:knockout="Off" fill="#FFFFFF" d="M75.22,186.231c0.019-0.02,0.042-0.035,0.062-0.052
+ c0.056-0.048,0.106-0.102,0.164-0.151L75.22,186.231z"/>
+ </g>
+ <g i:knockout="Off">
+ <path i:knockout="Off" fill-rule="evenodd" clip-rule="evenodd" fill="#1C86EE" d="M378.447,194.799
+ c-1.01,0-1.897,0.374-2.583,1.07c-0.707,0.716-1.09,1.645-1.09,2.612c0,0.979,0.373,1.887,1.079,2.593
+ c0.707,0.707,1.625,1.09,2.594,1.09s1.907-0.383,2.633-1.1c0.686-0.676,1.049-1.574,1.049-2.583
+ c0-0.999-0.363-1.907-1.06-2.603C380.364,195.173,379.455,194.799,378.447,194.799z M378.456,195.465
+ c0.827,0,1.563,0.313,2.139,0.888c0.565,0.565,0.867,1.312,0.867,2.128c0,0.828-0.292,1.554-0.857,2.108
+ c-0.595,0.586-1.361,0.898-2.148,0.898c-0.797,0-1.544-0.313-2.118-0.889c-0.576-0.574-0.898-1.331-0.898-2.118
+ c0-0.796,0.322-1.553,0.898-2.138C376.903,195.768,377.628,195.465,378.456,195.465z"/>
+ <path i:knockout="Off" fill-rule="evenodd" clip-rule="evenodd" fill="#1C86EE" d="M378.408,197.87
+ c-0.208-0.38-0.563-0.531-0.975-0.531c-0.6,0-1.076,0.424-1.076,1.142c0,0.73,0.448,1.143,1.097,1.143
+ c0.416,0,0.771-0.229,0.967-0.576l-0.457-0.232c-0.102,0.245-0.258,0.318-0.453,0.318c-0.338,0-0.494-0.282-0.494-0.653
+ c0-0.371,0.132-0.652,0.494-0.652c0.098,0,0.294,0.053,0.408,0.297L378.408,197.87z"/>
+ <path i:knockout="Off" fill-rule="evenodd" clip-rule="evenodd" fill="#1C86EE" d="M380.533,197.87
+ c-0.209-0.38-0.563-0.531-0.976-0.531c-0.6,0-1.076,0.424-1.076,1.142c0,0.73,0.448,1.143,1.097,1.143
+ c0.417,0,0.771-0.229,0.967-0.576l-0.456-0.232c-0.103,0.245-0.258,0.318-0.453,0.318c-0.338,0-0.494-0.282-0.494-0.653
+ c0-0.371,0.131-0.652,0.494-0.652c0.098,0,0.293,0.053,0.408,0.297L380.533,197.87z"/>
+ </g>
+ <g>
+
+ <linearGradient id="XMLID_85_" gradientUnits="userSpaceOnUse" x1="82.4421" y1="213.8887" x2="91.0083" y2="222.7718" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_85_)" d="M97.208,231.683c3.602,1.103,7.555,0.707,10.867-1.08
+ c1.632-0.882,3.25-2.056,4.142-3.703c1.081-2,1.966-4.106,2.653-6.271c-4.832,1.115-9.986,0.685-14.652-0.941
+ c-4.633-1.616-9.5-4.569-11.809-9.063c-0.321,0.947-1.531,4.669-1.945,5.562c-0.792,1.71-2.017,3.176-3.524,4.308
+ c-1.608,1.17-3.471,1.94-5.377,2.486c-1.624,0.465-3.423,0.787-4.465,2.261c-0.957,1.36-0.906,3.219,0.186,4.487
+ c1.236,1.442,3.21,1.708,4.981,1.346c2.086-0.423,4.157-1.131,6.104-1.989c1.708-0.754,3.539-1.53,4.886-2.868
+ c1.017,1.453,2.308,2.703,3.788,3.678c0.737,0.483,1.521,0.899,2.339,1.235C95.835,231.316,97.235,231.689,97.208,231.683"/>
+
+ <linearGradient id="XMLID_86_" gradientUnits="userSpaceOnUse" x1="115.2771" y1="131.5142" x2="122.2609" y2="160.4007" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0.0056" style="stop-color:#FFF7FF"/>
+ <stop offset="0.1382" style="stop-color:#CEDFFB"/>
+ <stop offset="0.3023" style="stop-color:#98C4F7"/>
+ <stop offset="0.4629" style="stop-color:#6CAEF4"/>
+ <stop offset="0.6163" style="stop-color:#499CF1"/>
+ <stop offset="0.7607" style="stop-color:#3090F0"/>
+ <stop offset="0.8924" style="stop-color:#2189EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.0056" style="stop-color:#FFF7FF"/>
+ <a:midPointStop offset="0.3352" style="stop-color:#FFF7FF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_86_)" d="M174.29,149.629c-1.714-7.276-6.044-13.546-11.979-16.661
+ c-3.138-1.648-6.722-2.417-10.608-1.985c-0.358,0.04-0.717,0.091-1.078,0.152c-0.242,0.04-0.483,0.089-0.727,0.138
+ c-0.104,0.023-0.212,0.042-0.322,0.065c-0.307,0.069-0.621,0.147-0.936,0.229c-0.029,0.01-0.059,0.017-0.09,0.026
+ c-0.338,0.091-0.683,0.191-1.028,0.304c-1.88,0.6-3.813,1.472-5.786,2.662c-5.366,3.238-9.574,7.509-12.657,12.308
+ c-0.151,0.236-0.292,0.479-0.44,0.717c1.438-3.934,3.367-6.72,4.865-8.309c2.655-2.812,6.597-6.066,11.229-7.917
+ c-0.965-0.154-1.87-0.265-2.694-0.336c-16.241-1.984-29.679,4.871-36.627,25.485c-1.065,3.159-4.568,14.885-8.373,27.337
+ c-6.443,0.292-15.021,1.456-19.092,5.352c-0.837,0.676-1.397,1.674-1.465,2.815c-0.129,2.188,1.589,4.067,3.834,4.196
+ c1.246,0.071,2.389-0.406,3.186-1.22l0.007,0.009c1.323-1.434,5.837-2.443,10.998-2.917c-0.134,0.431-0.267,0.859-0.397,1.287
+ c-0.442,1.389-0.881,2.777-1.316,4.167c-0.602,1.911-1.2,3.823-1.81,5.731c-0.303,0.951-0.611,1.905-0.92,2.856
+ c-0.084,2.672,1.574,5.437,4.7,7.801c4.804,3.633,13.475,6.386,21.173,3.853c0.85-2.676,1.984-6.246,3.24-10.188h0.005
+ c0.696-2.201,1.439-4.089,2.211-5.711c1.441,1.307,2.868,2.746,4.129,4.135c0.804,1.016,1.028,1.547,1.742,2.239
+ c1.935,1.872,4.539,2.157,6.21,0.46c1.669-1.694,1.458-4.585-0.474-6.458c-0.092-0.088-0.188-0.171-0.286-0.251
+ c-1.414-1.656-3.803-4.287-6.628-6.747c3.402-2.957,6.864-2.728,9.392-1.856c0.032,0.019,0.059,0.038,0.089,0.055
+ c6.097,3.571,13.021,3.274,19.294,0.276c5.137-2.454,9.604-6.613,13.015-11.663c3.114-4.612,5.332-9.944,6.476-15.453
+ C175.528,160.928,175.568,155.044,174.29,149.629z M166.707,179.95c-6.425,9.176-17.576,14.066-26.006,7.692
+ c-12.5-9.453-10.592-33.814,5.362-45.217c11.903-8.513,22.89-1.746,26.018,9.706
+ C174.475,160.894,172.172,172.143,166.707,179.95z"/>
+
+ <linearGradient id="XMLID_87_" gradientUnits="userSpaceOnUse" x1="82.511" y1="213.6699" x2="91.1143" y2="222.5916" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_87_)" d="M97.208,231.683c-0.78,0.461-1.603,0.911-2.521,1.331
+ c-0.141,0.049-0.275,0.11-0.407,0.171c-0.532,0.316-1.014,0.678-1.408,1.124c-0.442,0.568-0.739,1.263-0.817,2.034
+ c-0.216,2.152,1.325,4.066,3.442,4.273c0.693,0.069,1.36-0.051,1.952-0.323l0.012,0.025c4.799-2.137,8.215-4.84,10.646-7.491
+ c1.379-1.554,2.576-3.248,3.614-5.042C108.151,231.624,102.563,233.318,97.208,231.683z"/>
+
+ <linearGradient id="XMLID_88_" gradientUnits="userSpaceOnUse" x1="97.8445" y1="229.5684" x2="100.5151" y2="232.3378" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_88_)" d="M97.208,231.683c-0.78,0.461-1.603,0.911-2.521,1.331
+ c-0.141,0.049-0.275,0.11-0.407,0.171c-0.532,0.316-1.014,0.678-1.408,1.124c-0.442,0.568-0.739,1.263-0.817,2.034
+ c-0.216,2.152,1.325,4.066,3.442,4.273c0.693,0.069,1.36-0.051,1.952-0.323l0.012,0.025c4.799-2.137,8.215-4.84,10.646-7.491
+ c1.379-1.554,2.576-3.248,3.614-5.042C108.151,231.624,102.563,233.318,97.208,231.683z"/>
+
+ <linearGradient id="XMLID_89_" gradientUnits="userSpaceOnUse" x1="86.2268" y1="180.4746" x2="90.0388" y2="190.0047" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_89_)" d="M80.06,195.488c1.182,0.06,2.266-0.403,3.015-1.18l0.009,0.008
+ c1.958-2.153,11.391-3.375,18.972-3.165l0.375,0.009c0.002,0,0.373-0.061,0.373-0.061s2.002-1.694,1.503-4.469
+ c-0.498-2.775-2.037-3.083-2.037-3.083c-4.407-0.126-18.958-0.094-24.512,5.298c-0.79,0.648-1.314,1.6-1.37,2.685
+ C76.281,193.609,77.927,195.382,80.06,195.488z"/>
+
+ <linearGradient id="XMLID_90_" gradientUnits="userSpaceOnUse" x1="127.3293" y1="216.0127" x2="127.9639" y2="198.5599" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.548" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_90_)" d="M133.174,202.521c-0.088-0.091-0.181-0.177-0.277-0.255
+ c-1.757-2.147-5.078-5.911-8.921-8.913c-0.851,2.681-1.738,5.475-2.613,8.229c1.429,1.349,2.841,2.821,4.083,4.247
+ c0.773,1.021,0.979,1.543,1.681,2.249c1.888,1.897,4.523,2.296,6.283,0.726C135.168,207.235,135.064,204.421,133.174,202.521z"
+ />
+ <g>
+ <g i:knockout="On" a:adobe-knockout="true">
+
+ <radialGradient id="XMLID_91_" cx="155.7458" cy="161.2598" r="52.7172" gradientTransform="matrix(1.0169 0.0102 0.0047 1.0111 -2.8353 -3.7854)" gradientUnits="userSpaceOnUse">
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#80D1FF"/>
+ <stop offset="0.6036" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7215" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#80D1FF"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#80D1FF"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ </radialGradient>
+ <path i:knockout="Off" fill="url(#XMLID_91_)" a:adobe-knockout="false" d="M173.478,171.201
+ c-6.066,18.417-22.996,29.434-37.141,22.992c-13.995-6.372-18.005-26.599-9.819-43.702
+ c7.471-15.623,22.702-23.197,34.678-18.066C173.273,137.604,179.011,154.404,173.478,171.201z"/>
+
+ <linearGradient id="XMLID_92_" gradientUnits="userSpaceOnUse" x1="153.156" y1="186.3149" x2="129.7401" y2="75.1286" gradientTransform="matrix(1.0119 0.0089 0.0036 1.008 -1.7908 -3.1402)">
+ <stop offset="0" style="stop-color:#1C86EE"/>
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#7DCFFE"/>
+ <stop offset="0.5989" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7199" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#7DCFFE"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#7DCFFE"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_92_)" a:adobe-knockout="false" d="M173.443,171.214
+ c-6.034,18.341-22.859,29.278-36.93,22.872c-13.924-6.337-17.989-26.464-9.914-43.532
+ c7.385-15.642,22.567-23.264,34.547-18.128C173.225,137.607,178.962,154.435,173.443,171.214z"/>
+
+ <linearGradient id="XMLID_93_" gradientUnits="userSpaceOnUse" x1="151.5535" y1="187.2744" x2="136.4717" y2="76.2394" gradientTransform="matrix(1.007 0.0076 0.0025 1.0049 -0.7472 -2.493)">
+ <stop offset="0" style="stop-color:#1D86EE"/>
+ <stop offset="0.118" style="stop-color:#1D86EE"/>
+ <stop offset="0.5169" style="stop-color:#7ACCFE"/>
+ <stop offset="0.594" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7182" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#7ACCFE"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#7ACCFE"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_93_)" a:adobe-knockout="false" d="M173.407,171.227
+ c-6.001,18.265-22.723,29.122-36.719,22.752c-13.853-6.303-17.973-26.33-10.008-43.363
+ c7.299-15.662,22.432-23.331,34.416-18.191C173.177,137.612,178.913,154.466,173.407,171.227z"/>
+
+ <linearGradient id="XMLID_94_" gradientUnits="userSpaceOnUse" x1="149.8308" y1="188.0806" x2="142.9579" y2="78.1492" gradientTransform="matrix(1.002 0.0063 0.0014 1.0019 0.2973 -1.8467)">
+ <stop offset="0" style="stop-color:#1D87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#77CAFD"/>
+ <stop offset="0.5887" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7165" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#77CAFD"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#77CAFD"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_94_)" a:adobe-knockout="false" d="M173.372,171.24
+ c-5.968,18.188-22.585,28.966-36.508,22.632c-13.782-6.268-17.957-26.195-10.103-43.193
+ c7.213-15.681,22.296-23.397,34.284-18.253C173.129,137.616,178.864,154.497,173.372,171.24z"/>
+
+ <linearGradient id="XMLID_95_" gradientUnits="userSpaceOnUse" x1="148.0081" y1="188.7188" x2="149.1006" y2="80.8275" gradientTransform="matrix(0.9971 0.0051 2.741814e-004 0.9988 1.3409 -1.201)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#74C8FD"/>
+ <stop offset="0.5831" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7146" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#74C8FD"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#74C8FD"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_95_)" a:adobe-knockout="false" d="M173.336,171.253
+ c-5.936,18.112-22.449,28.81-36.298,22.512c-13.71-6.233-17.94-26.061-10.197-43.024c7.127-15.7,22.161-23.464,34.153-18.315
+ C173.081,137.62,178.815,154.527,173.336,171.253z"/>
+
+ <linearGradient id="XMLID_96_" gradientUnits="userSpaceOnUse" x1="146.1008" y1="189.1719" x2="154.7993" y2="84.218" gradientTransform="matrix(0.9921 0.0038 -8.322702e-004 0.9957 2.385 -0.5547)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#71C5FC"/>
+ <stop offset="0.5772" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7126" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#71C5FC"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#71C5FC"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_96_)" a:adobe-knockout="false" d="M173.301,171.267
+ c-5.903,18.036-22.312,28.654-36.087,22.392c-13.64-6.198-17.924-25.926-10.292-42.854
+ c7.041-15.719,22.026-23.531,34.021-18.378C173.033,137.624,178.766,154.558,173.301,171.267z"/>
+
+ <linearGradient id="XMLID_97_" gradientUnits="userSpaceOnUse" x1="144.1335" y1="189.4263" x2="159.97" y2="88.2441" gradientTransform="matrix(0.9872 0.0025 -0.0019 0.9926 3.4291 0.0906)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6EC3FC"/>
+ <stop offset="0.5686" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7098" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#6EC3FC"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#6EC3FC"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_97_)" a:adobe-knockout="false" d="M173.265,171.28
+ c-5.871,17.96-22.175,28.498-35.876,22.272c-13.569-6.164-17.908-25.791-10.387-42.686
+ c6.955-15.738,21.891-23.597,33.891-18.44C172.985,137.628,178.717,154.588,173.265,171.28z"/>
+
+ <linearGradient id="XMLID_98_" gradientUnits="userSpaceOnUse" x1="142.1311" y1="189.4775" x2="164.5387" y2="92.8278" gradientTransform="matrix(0.9822 0.0012 -0.003 0.9896 4.4727 0.7373)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6BC1FB"/>
+ <stop offset="0.5616" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7074" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#6BC1FB"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#6BC1FB"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D86EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_98_)" a:adobe-knockout="false" d="M173.23,171.293
+ c-5.837,17.884-22.038,28.342-35.666,22.152c-13.498-6.129-17.892-25.656-10.481-42.516
+ c6.869-15.757,21.755-23.664,33.759-18.502C172.937,137.632,178.668,154.619,173.23,171.293z"/>
+
+ <linearGradient id="XMLID_99_" gradientUnits="userSpaceOnUse" x1="140.115" y1="189.3169" x2="168.4442" y2="97.8604" gradientTransform="matrix(0.9772 -7.098209e-005 -0.0042 0.9865 5.5168 1.3831)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#68BEFB"/>
+ <stop offset="0.5541" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7049" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#68BEFB"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#68BEFB"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_99_)" a:adobe-knockout="false" d="M173.195,171.306
+ c-5.805,17.808-21.902,28.186-35.455,22.033c-13.427-6.095-17.876-25.522-10.577-42.347
+ c6.784-15.777,21.621-23.731,33.628-18.564C172.889,137.636,178.619,154.65,173.195,171.306z"/>
+
+ <linearGradient id="XMLID_100_" gradientUnits="userSpaceOnUse" x1="138.1189" y1="188.9487" x2="171.6521" y2="103.2424" gradientTransform="matrix(0.9723 -0.0014 -0.0053 0.9834 6.5608 2.0294)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#65BCFA"/>
+ <stop offset="0.546" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7022" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#65BCFA"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#65BCFA"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_100_)" a:adobe-knockout="false" d="M173.159,171.319
+ c-5.772,17.731-21.765,28.03-35.244,21.913c-13.356-6.06-17.86-25.387-10.671-42.177
+ c6.698-15.796,21.485-23.797,33.497-18.626C172.841,137.64,178.571,154.681,173.159,171.319z"/>
+
+ <linearGradient id="XMLID_101_" gradientUnits="userSpaceOnUse" x1="136.1531" y1="188.3687" x2="174.126" y2="108.8494" gradientTransform="matrix(0.9673 -0.0026 -0.0064 0.9803 7.6049 2.6751)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#62BAFA"/>
+ <stop offset="0.5373" style="stop-color:#5CB5F9"/>
+ <stop offset="0.6993" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#62BAFA"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#62BAFA"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_101_)" a:adobe-knockout="false" d="M173.123,171.333
+ c-5.74,17.655-21.628,27.874-35.033,21.793c-13.285-6.025-17.844-25.252-10.766-42.008
+ c6.612-15.815,21.35-23.864,33.366-18.689C172.793,137.644,178.521,154.711,173.123,171.333z"/>
+
+ <linearGradient id="XMLID_102_" gradientUnits="userSpaceOnUse" x1="134.2507" y1="187.5918" x2="175.8687" y2="114.579" gradientTransform="matrix(0.9624 -0.0039 -0.0075 0.9772 8.6485 3.3214)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5FB7F9"/>
+ <stop offset="0.5279" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6962" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#5FB7F9"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#5FB7F9"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_102_)" a:adobe-knockout="false" d="M173.088,171.346
+ c-5.708,17.579-21.491,27.718-34.823,21.673c-13.214-5.99-17.828-25.118-10.861-41.838
+ c6.526-15.834,21.215-23.931,33.234-18.751C172.744,137.648,178.472,154.742,173.088,171.346z"/>
+
+ <linearGradient id="XMLID_103_" gradientUnits="userSpaceOnUse" x1="132.4299" y1="186.6201" x2="176.8879" y2="120.3128" gradientTransform="matrix(0.9574 -0.0052 -0.0086 0.9742 9.6931 3.9672)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5CB5F8"/>
+ <stop offset="0.5176" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6927" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2088EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#5CB5F8"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#5CB5F8"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_103_)" a:adobe-knockout="false" d="M173.052,171.359
+ c-5.674,17.503-21.354,27.562-34.612,21.553c-13.143-5.956-17.811-24.983-10.955-41.669
+ c6.44-15.854,21.08-23.997,33.103-18.813C172.697,137.652,178.424,154.772,173.052,171.359z"/>
+
+ <linearGradient id="XMLID_104_" gradientUnits="userSpaceOnUse" x1="130.7205" y1="185.4746" x2="177.2194" y2="125.9561" gradientTransform="matrix(0.9524 -0.0065 -0.0097 0.9711 10.7367 4.6134)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#59B3F8"/>
+ <stop offset="0.689" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#59B3F8"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#59B3F8"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_104_)" a:adobe-knockout="false" d="M173.017,171.372
+ c-5.642,17.427-21.217,27.405-34.401,21.433c-13.072-5.921-17.795-24.848-11.05-41.5
+ c6.354-15.873,20.944-24.064,32.972-18.876C172.649,137.656,178.375,154.803,173.017,171.372z"/>
+
+ <linearGradient id="XMLID_105_" gradientUnits="userSpaceOnUse" x1="129.1306" y1="184.166" x2="176.8978" y2="131.4056" gradientTransform="matrix(0.9475 -0.0078 -0.0108 0.968 11.7807 5.2592)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#56B0F7"/>
+ <stop offset="0.6849" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#56B0F7"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#56B0F7"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_105_)" a:adobe-knockout="false" d="M172.982,171.385
+ c-5.609,17.351-21.081,27.25-34.191,21.313c-13.001-5.886-17.779-24.714-11.145-41.331
+ c6.268-15.892,20.809-24.131,32.84-18.938C172.6,137.66,178.325,154.834,172.982,171.385z"/>
+
+ <linearGradient id="XMLID_106_" gradientUnits="userSpaceOnUse" x1="127.675" y1="182.7129" x2="175.9801" y2="136.5743" gradientTransform="matrix(0.9425 -0.0091 -0.0119 0.9649 12.8248 5.9054)">
+ <stop offset="0" style="stop-color:#2289EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#53AEF7"/>
+ <stop offset="0.6803" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2289EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EE"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2189EE"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#53AEF7"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#53AEF7"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1D87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_106_)" a:adobe-knockout="false" d="M172.946,171.398
+ c-5.577,17.274-20.944,27.093-33.98,21.193c-12.93-5.852-17.763-24.579-11.239-41.161c6.182-15.911,20.674-24.197,32.709-19
+ C172.552,137.664,178.277,154.865,172.946,171.398z"/>
+
+ <linearGradient id="XMLID_107_" gradientUnits="userSpaceOnUse" x1="126.3665" y1="181.1421" x2="174.5361" y2="141.3942" gradientTransform="matrix(0.9376 -0.0103 -0.013 0.9619 13.8689 6.5512)">
+ <stop offset="0" style="stop-color:#228AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4FACF6"/>
+ <stop offset="0.6716" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#228AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#228AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#4FACF6"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#4FACF6"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_107_)" a:adobe-knockout="false" d="M172.91,171.412
+ c-5.543,17.198-20.807,26.938-33.769,21.074c-12.859-5.817-17.746-24.444-11.334-40.992
+ c6.097-15.931,20.539-24.264,32.578-19.063C172.504,137.668,178.228,154.896,172.91,171.412z"/>
+
+ <linearGradient id="XMLID_108_" gradientUnits="userSpaceOnUse" x1="125.2053" y1="179.4717" x2="172.6345" y2="145.8021" gradientTransform="matrix(0.9326 -0.0116 -0.0141 0.9588 14.9125 7.1975)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4CAAF6"/>
+ <stop offset="0.6656" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#4CAAF6"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#4CAAF6"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_108_)" a:adobe-knockout="false" d="M172.875,171.425
+ c-5.511,17.122-20.67,26.781-33.558,20.954c-12.788-5.782-17.73-24.31-11.429-40.822
+ c6.011-15.95,20.404-24.331,32.447-19.125C172.456,137.672,178.179,154.926,172.875,171.425z"/>
+
+ <linearGradient id="XMLID_109_" gradientUnits="userSpaceOnUse" x1="124.1907" y1="177.7261" x2="170.3514" y2="149.7558" gradientTransform="matrix(0.9277 -0.0129 -0.0152 0.9557 15.9566 7.8433)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#49A7F5"/>
+ <stop offset="0.6587" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2289EF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#49A7F5"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#49A7F5"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_109_)" a:adobe-knockout="false" d="M172.84,171.438
+ c-5.479,17.045-20.533,26.625-33.348,20.834c-12.717-5.748-17.714-24.175-11.523-40.653
+ c5.925-15.969,20.269-24.397,32.315-19.187C172.408,137.676,178.13,154.957,172.84,171.438z"/>
+
+ <linearGradient id="XMLID_110_" gradientUnits="userSpaceOnUse" x1="123.3127" y1="175.9224" x2="167.7589" y2="153.2217" gradientTransform="matrix(0.9227 -0.0142 -0.0163 0.9526 17.0007 8.4895)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#46A5F5"/>
+ <stop offset="0.6509" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#46A5F5"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#46A5F5"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_110_)" a:adobe-knockout="false" d="M172.804,171.451
+ c-5.446,16.969-20.396,26.469-33.137,20.714c-12.646-5.713-17.698-24.04-11.618-40.483
+ c5.839-15.989,20.133-24.464,32.184-19.249C172.36,137.68,178.081,154.988,172.804,171.451z"/>
+
+ <linearGradient id="XMLID_111_" gradientUnits="userSpaceOnUse" x1="122.5662" y1="174.0825" x2="164.934" y2="156.1875" gradientTransform="matrix(0.9177 -0.0155 -0.0174 0.9496 18.0448 9.1353)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#43A3F4"/>
+ <stop offset="0.6422" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#43A3F4"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#43A3F4"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_111_)" a:adobe-knockout="false" d="M172.768,171.464
+ c-5.413,16.893-20.259,26.313-32.926,20.594c-12.575-5.678-17.681-23.906-11.712-40.314
+ c5.753-16.008,19.998-24.531,32.053-19.312C172.312,137.684,178.032,155.018,172.768,171.464z"/>
+
+ <linearGradient id="XMLID_112_" gradientUnits="userSpaceOnUse" x1="121.9314" y1="172.2173" x2="161.9359" y2="158.6452" gradientTransform="matrix(0.9128 -0.0168 -0.0185 0.9465 19.0888 9.7816)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#40A0F3"/>
+ <stop offset="0.6318" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#238AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#40A0F3"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#40A0F3"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_112_)" a:adobe-knockout="false" d="M172.733,171.478
+ c-5.38,16.817-20.123,26.157-32.716,20.474c-12.504-5.643-17.665-23.771-11.807-40.145
+ c5.667-16.027,19.863-24.597,31.921-19.374C172.264,137.688,177.983,155.049,172.733,171.478z"/>
+
+ <linearGradient id="XMLID_113_" gradientUnits="userSpaceOnUse" x1="121.3962" y1="170.3374" x2="158.8235" y2="160.6005" gradientTransform="matrix(0.9078 -0.018 -0.0196 0.9434 20.1324 10.4274)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3D9EF3"/>
+ <stop offset="0.6196" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3D9EF3"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3D9EF3"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_113_)" a:adobe-knockout="false" d="M172.698,171.491
+ c-5.348,16.741-19.986,26.001-32.505,20.354c-12.433-5.609-17.649-23.637-11.902-39.976
+ c5.581-16.046,19.728-24.664,31.79-19.436C172.216,137.692,177.934,155.08,172.698,171.491z"/>
+
+ <linearGradient id="XMLID_114_" gradientUnits="userSpaceOnUse" x1="120.9348" y1="168.4482" x2="155.6342" y2="162.0641" gradientTransform="matrix(0.9029 -0.0193 -0.0207 0.9403 21.1765 11.0736)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3A9CF2"/>
+ <stop offset="0.6049" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#248AEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3A9CF2"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3A9CF2"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E87EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_114_)" a:adobe-knockout="false" d="M172.662,171.504
+ c-5.315,16.665-19.849,25.845-32.294,20.234c-12.362-5.574-17.633-23.501-11.997-39.806
+ c5.495-16.065,19.592-24.73,31.659-19.498C172.168,137.696,177.885,155.11,172.662,171.504z"/>
+
+ <linearGradient id="XMLID_115_" gradientUnits="userSpaceOnUse" x1="120.5334" y1="166.5493" x2="152.4035" y2="163.0492" gradientTransform="matrix(0.8979 -0.0206 -0.0219 0.9372 22.2201 11.7194)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3799F2"/>
+ <stop offset="0.5869" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3799F2"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3799F2"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_115_)" a:adobe-knockout="false" d="M172.627,171.517
+ c-5.283,16.588-19.712,25.689-32.083,20.115c-12.292-5.54-17.617-23.367-12.092-39.637
+ c5.41-16.085,19.458-24.798,31.528-19.561C172.12,137.7,177.836,155.141,172.627,171.517z"/>
+
+ <linearGradient id="XMLID_116_" gradientUnits="userSpaceOnUse" x1="120.1799" y1="164.6333" x2="149.1568" y2="163.5659" gradientTransform="matrix(0.8929 -0.0219 -0.023 0.9342 23.2647 12.3657)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3497F1"/>
+ <stop offset="0.5645" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3497F1"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3497F1"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1E88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_116_)" a:adobe-knockout="false" d="M172.591,171.53
+ c-5.25,16.512-19.575,25.533-31.873,19.995c-12.22-5.504-17.601-23.232-12.187-39.467
+ c5.324-16.104,19.322-24.864,31.396-19.623C172.072,137.704,177.787,155.172,172.591,171.53z"/>
+
+ <linearGradient id="XMLID_117_" gradientUnits="userSpaceOnUse" x1="119.8655" y1="162.6899" x2="145.9115" y2="163.6213" gradientTransform="matrix(0.888 -0.0232 -0.0241 0.9311 24.3083 13.0119)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3195F1"/>
+ <stop offset="0.5239" style="stop-color:#3095F1"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#3195F1"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#3195F1"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_117_)" a:adobe-knockout="false" d="M172.555,171.543
+ c-5.217,16.436-19.438,25.377-31.662,19.875c-12.149-5.47-17.584-23.098-12.281-39.298
+ c5.238-16.123,19.187-24.931,31.266-19.685C172.024,137.708,177.738,155.203,172.555,171.543z"/>
+
+ <linearGradient id="XMLID_118_" gradientUnits="userSpaceOnUse" x1="119.5852" y1="160.7065" x2="142.6797" y2="163.2177" gradientTransform="matrix(0.883 -0.0245 -0.0252 0.928 25.3524 13.6577)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2E92F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#2E92F0"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#2E92F0"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_118_)" a:adobe-knockout="false" d="M172.52,171.557
+ c-5.185,16.36-19.302,25.221-31.451,19.755c-12.079-5.435-17.568-22.963-12.376-39.128
+ c5.152-16.143,19.052-24.998,31.134-19.747C171.976,137.712,177.689,155.233,172.52,171.557z"/>
+
+ <linearGradient id="XMLID_119_" gradientUnits="userSpaceOnUse" x1="119.3435" y1="158.6733" x2="139.4767" y2="162.3551" gradientTransform="matrix(0.8781 -0.0257 -0.0263 0.9249 26.3965 14.304)">
+ <stop offset="0" style="stop-color:#278CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2B90F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268BEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#2B90F0"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#2B90F0"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_119_)" a:adobe-knockout="false" d="M172.485,171.57
+ c-5.152,16.284-19.165,25.065-31.241,19.635c-12.007-5.401-17.552-22.829-12.47-38.959
+ c5.066-16.162,18.917-25.064,31.003-19.81C171.927,137.716,177.64,155.264,172.485,171.57z"/>
+
+ <linearGradient id="XMLID_120_" gradientUnits="userSpaceOnUse" x1="119.1467" y1="156.5752" x2="136.3165" y2="161.0223" gradientTransform="matrix(0.8731 -0.027 -0.0274 0.9219 27.44 14.9498)">
+ <stop offset="0" style="stop-color:#278DEF"/>
+ <stop offset="0.118" style="stop-color:#268CEF"/>
+ <stop offset="0.5169" style="stop-color:#288EEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#278DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#278DEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#268CEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#288EEF"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#288EEF"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_120_)" a:adobe-knockout="false" d="M172.449,171.583
+ c-5.119,16.208-19.028,24.909-31.03,19.515c-11.936-5.366-17.536-22.694-12.565-38.79
+ c4.98-16.181,18.781-25.131,30.872-19.872C171.88,137.72,177.592,155.294,172.449,171.583z"/>
+
+ <linearGradient id="XMLID_121_" gradientUnits="userSpaceOnUse" x1="119.0105" y1="154.4019" x2="133.2236" y2="159.2068" gradientTransform="matrix(0.8682 -0.0283 -0.0285 0.9188 28.4846 15.5965)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="0.118" style="stop-color:#278CEF"/>
+ <stop offset="0.5169" style="stop-color:#258BEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.118" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#278CEF"/>
+ <a:midPointStop offset="0.5169" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.4474" style="stop-color:#258BEF"/>
+ <a:midPointStop offset="0.7809" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1F88EE"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_121_)" a:adobe-knockout="false" d="M172.414,171.596
+ c-5.086,16.131-18.892,24.753-30.819,19.396c-11.865-5.332-17.52-22.559-12.66-38.621c4.894-16.2,18.646-25.198,30.74-19.934
+ C171.831,137.725,177.542,155.325,172.414,171.596z"/>
+
+ <linearGradient id="XMLID_122_" gradientUnits="userSpaceOnUse" x1="118.9534" y1="152.1465" x2="130.2265" y2="156.8936" gradientTransform="matrix(0.8632 -0.0296 -0.0296 0.9157 29.5282 16.2423)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_122_)" a:adobe-knockout="false" d="M172.378,171.609
+ c-5.054,16.055-18.754,24.597-30.608,19.275c-11.794-5.296-17.503-22.424-12.754-38.451
+ c4.808-16.219,18.511-25.264,30.609-19.996C171.783,137.729,177.493,155.356,172.378,171.609z"/>
+ </g>
+ </g>
+ <g i:knockout="On" a:adobe-knockout="true">
+
+ <linearGradient id="XMLID_123_" gradientUnits="userSpaceOnUse" x1="123.4993" y1="153.2236" x2="133.7782" y2="157.5521" gradientTransform="matrix(0.9353 -0.0269 -0.0269 0.9832 16.7265 6.8872)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#288DEF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_123_)" a:adobe-knockout="false" d="M173.429,171.119
+ c-5.866,18.006-22.17,28.784-35.066,22.997c-12.833-5.761-16.029-25.442-7.991-42.314
+ c7.276-15.275,20.611-23.793,31.373-19.106C172.549,137.399,179.088,153.876,173.429,171.119z"/>
+
+ <linearGradient id="XMLID_124_" gradientUnits="userSpaceOnUse" x1="123.5725" y1="153.0771" x2="135.24" y2="158.0536" gradientTransform="matrix(0.9373 -0.0258 -0.0258 0.9833 16.1743 6.7037)">
+ <stop offset="0" style="stop-color:#2F91EF"/>
+ <stop offset="0.0169" style="stop-color:#2F91EF"/>
+ <stop offset="0.1966" style="stop-color:#2B8FEF"/>
+ <stop offset="0.6471" style="stop-color:#258BEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#2F91EF"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#2B8FEF"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#2B8FEF"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_124_)" a:adobe-knockout="false" d="M173.38,171.184
+ c-5.875,17.927-22.109,28.601-34.94,22.809c-12.754-5.759-15.965-25.325-8.007-42.12c7.222-15.252,20.551-23.762,31.32-19.078
+ C172.578,137.502,179.056,153.991,173.38,171.184z"/>
+
+ <linearGradient id="XMLID_125_" gradientUnits="userSpaceOnUse" x1="123.6511" y1="152.9263" x2="136.6876" y2="158.5575" gradientTransform="matrix(0.9393 -0.0247 -0.0247 0.9833 15.622 6.521)">
+ <stop offset="0" style="stop-color:#3694F0"/>
+ <stop offset="0.0169" style="stop-color:#3694F0"/>
+ <stop offset="0.1966" style="stop-color:#3092F0"/>
+ <stop offset="0.5721" style="stop-color:#2A8FEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3694F0"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3092F0"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3092F0"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_125_)" a:adobe-knockout="false" d="M173.33,171.248
+ c-5.885,17.848-22.048,28.418-34.813,22.621c-12.677-5.756-15.903-25.208-8.024-41.925
+ c7.168-15.229,20.492-23.732,31.268-19.05C172.608,137.605,179.023,154.106,173.33,171.248z"/>
+
+ <linearGradient id="XMLID_126_" gradientUnits="userSpaceOnUse" x1="123.7273" y1="152.7769" x2="138.114" y2="159.0699" gradientTransform="matrix(0.9413 -0.0236 -0.0236 0.9834 15.0696 6.3374)">
+ <stop offset="0" style="stop-color:#3D98F0"/>
+ <stop offset="0.0169" style="stop-color:#3D98F0"/>
+ <stop offset="0.1966" style="stop-color:#3595F0"/>
+ <stop offset="0.5225" style="stop-color:#2F92F0"/>
+ <stop offset="0.9596" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.5" style="stop-color:#3D98F0"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3595F0"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3595F0"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_126_)" a:adobe-knockout="false" d="M173.281,171.313
+ c-5.894,17.77-21.987,28.235-34.687,22.434c-12.599-5.754-15.839-25.09-8.04-41.731c7.114-15.207,20.432-23.701,31.215-19.021
+ C172.637,137.708,178.991,154.221,173.281,171.313z"/>
+
+ <linearGradient id="XMLID_127_" gradientUnits="userSpaceOnUse" x1="123.803" y1="152.6226" x2="139.5216" y2="159.5844" gradientTransform="matrix(0.9433 -0.0226 -0.0226 0.9834 14.5173 6.1537)">
+ <stop offset="0" style="stop-color:#449CF1"/>
+ <stop offset="0.0169" style="stop-color:#449CF1"/>
+ <stop offset="0.1966" style="stop-color:#3998F1"/>
+ <stop offset="0.4933" style="stop-color:#3394F0"/>
+ <stop offset="0.8911" style="stop-color:#228AEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#449CF1"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3998F1"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3998F1"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_127_)" a:adobe-knockout="false" d="M173.232,171.377
+ c-5.903,17.691-21.925,28.052-34.561,22.246c-12.521-5.751-15.776-24.973-8.057-41.536
+ c7.061-15.184,20.372-23.671,31.163-18.994C172.666,137.811,178.959,154.336,173.232,171.377z"/>
+
+ <linearGradient id="XMLID_128_" gradientUnits="userSpaceOnUse" x1="123.8835" y1="152.4751" x2="140.9147" y2="160.112" gradientTransform="matrix(0.9453 -0.0215 -0.0215 0.9835 13.9645 5.9706)">
+ <stop offset="0" style="stop-color:#4B9FF1"/>
+ <stop offset="0.0169" style="stop-color:#4B9FF1"/>
+ <stop offset="0.1966" style="stop-color:#3E9BF1"/>
+ <stop offset="0.4648" style="stop-color:#3897F0"/>
+ <stop offset="0.8243" style="stop-color:#278DEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ <a:midPointStop offset="0" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.5" style="stop-color:#4B9FF1"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#3E9BF1"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#3E9BF1"/>
+ <a:midPointStop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_128_)" a:adobe-knockout="false" d="M173.182,171.441
+ c-5.913,17.612-21.864,27.869-34.434,22.058c-12.444-5.75-15.713-24.855-8.073-41.342c7.007-15.161,20.312-23.64,31.11-18.965
+ C172.696,137.914,178.926,154.451,173.182,171.441z"/>
+
+ <linearGradient id="XMLID_129_" gradientUnits="userSpaceOnUse" x1="123.9617" y1="152.3184" x2="142.2882" y2="160.6375" gradientTransform="matrix(0.9472 -0.0204 -0.0204 0.9836 13.4122 5.7875)">
+ <stop offset="0" style="stop-color:#52A3F2"/>
+ <stop offset="0.0169" style="stop-color:#52A3F2"/>
+ <stop offset="0.1966" style="stop-color:#439DF2"/>
+ <stop offset="0.4425" style="stop-color:#3D9AF1"/>
+ <stop offset="0.772" style="stop-color:#2C91F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ <a:midPointStop offset="0" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#52A3F2"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#439DF2"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#439DF2"/>
+ <a:midPointStop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_129_)" a:adobe-knockout="false" d="M173.133,171.505
+ c-5.922,17.534-21.803,27.687-34.308,21.871c-12.366-5.747-15.65-24.738-8.089-41.147
+ c6.953-15.138,20.252-23.61,31.058-18.938C172.725,138.017,178.894,154.565,173.133,171.505z"/>
+
+ <linearGradient id="XMLID_130_" gradientUnits="userSpaceOnUse" x1="124.0432" y1="152.1655" x2="143.646" y2="161.1728" gradientTransform="matrix(0.9492 -0.0193 -0.0193 0.9836 12.8599 5.6043)">
+ <stop offset="0" style="stop-color:#59A7F2"/>
+ <stop offset="0.0169" style="stop-color:#59A7F2"/>
+ <stop offset="0.1966" style="stop-color:#48A0F2"/>
+ <stop offset="0.4243" style="stop-color:#429DF1"/>
+ <stop offset="0.7295" style="stop-color:#3193F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ <a:midPointStop offset="0" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.5" style="stop-color:#59A7F2"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#48A0F2"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#48A0F2"/>
+ <a:midPointStop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_130_)" a:adobe-knockout="false" d="M173.083,171.57
+ c-5.931,17.455-21.742,27.504-34.182,21.683c-12.288-5.745-15.587-24.621-8.106-40.953
+ c6.899-15.115,20.192-23.579,31.005-18.909C172.754,138.12,178.862,154.681,173.083,171.57z"/>
+
+ <linearGradient id="XMLID_131_" gradientUnits="userSpaceOnUse" x1="124.1233" y1="152.0103" x2="144.9854" y2="161.7125" gradientTransform="matrix(0.9512 -0.0182 -0.0182 0.9837 12.3071 5.4207)">
+ <stop offset="0" style="stop-color:#5FAAF3"/>
+ <stop offset="0.0169" style="stop-color:#5FAAF3"/>
+ <stop offset="0.1966" style="stop-color:#4DA3F3"/>
+ <stop offset="0.4093" style="stop-color:#47A0F2"/>
+ <stop offset="0.695" style="stop-color:#3696F1"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ <a:midPointStop offset="0" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#5FAAF3"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#4DA3F3"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#4DA3F3"/>
+ <a:midPointStop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_131_)" a:adobe-knockout="false" d="M173.033,171.634
+ c-5.94,17.376-21.68,27.321-34.055,21.495c-12.21-5.742-15.524-24.503-8.122-40.757c6.845-15.093,20.132-23.549,30.953-18.881
+ C172.784,138.223,178.829,154.795,173.033,171.634z"/>
+
+ <linearGradient id="XMLID_132_" gradientUnits="userSpaceOnUse" x1="124.2048" y1="151.8516" x2="146.3088" y2="162.2551" gradientTransform="matrix(0.9532 -0.0171 -0.0171 0.9838 11.7547 5.2376)">
+ <stop offset="0" style="stop-color:#66AEF3"/>
+ <stop offset="0.0169" style="stop-color:#66AEF3"/>
+ <stop offset="0.1966" style="stop-color:#52A6F3"/>
+ <stop offset="0.3966" style="stop-color:#4CA3F2"/>
+ <stop offset="0.6652" style="stop-color:#3B9AF1"/>
+ <stop offset="0.9717" style="stop-color:#1F8BEE"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.5" style="stop-color:#66AEF3"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#52A6F3"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#52A6F3"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_132_)" a:adobe-knockout="false" d="M172.984,171.699
+ c-5.95,17.298-21.619,27.138-33.929,21.308c-12.132-5.74-15.46-24.386-8.138-40.563c6.791-15.07,20.073-23.519,30.9-18.854
+ C172.813,138.326,178.797,154.91,172.984,171.699z"/>
+
+ <linearGradient id="XMLID_133_" gradientUnits="userSpaceOnUse" x1="124.2874" y1="151.6953" x2="147.6169" y2="162.8068" gradientTransform="matrix(0.9552 -0.0161 -0.0161 0.9838 11.2024 5.0544)">
+ <stop offset="0" style="stop-color:#6DB2F4"/>
+ <stop offset="0.0169" style="stop-color:#6DB2F4"/>
+ <stop offset="0.1966" style="stop-color:#57A9F4"/>
+ <stop offset="0.3857" style="stop-color:#51A6F3"/>
+ <stop offset="0.6397" style="stop-color:#409CF2"/>
+ <stop offset="0.9294" style="stop-color:#248DEF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#6DB2F4"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#57A9F4"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#57A9F4"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_133_)" a:adobe-knockout="false" d="M172.935,171.763
+ c-5.959,17.219-21.558,26.955-33.803,21.12c-12.055-5.737-15.398-24.268-8.155-40.368
+ c6.737-15.047,20.013-23.488,30.848-18.825C172.843,138.429,178.764,155.025,172.935,171.763z"/>
+
+ <linearGradient id="XMLID_134_" gradientUnits="userSpaceOnUse" x1="124.3708" y1="151.5381" x2="148.9081" y2="163.3634" gradientTransform="matrix(0.9572 -0.015 -0.015 0.9839 10.6496 4.8708)">
+ <stop offset="0" style="stop-color:#74B5F4"/>
+ <stop offset="0.0169" style="stop-color:#74B5F4"/>
+ <stop offset="0.1966" style="stop-color:#5CACF4"/>
+ <stop offset="0.3761" style="stop-color:#56A9F3"/>
+ <stop offset="0.6173" style="stop-color:#459FF2"/>
+ <stop offset="0.8925" style="stop-color:#2990EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#74B5F4"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#5CACF4"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#5CACF4"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_134_)" a:adobe-knockout="false" d="M172.885,171.828
+ c-5.968,17.14-21.496,26.772-33.676,20.932c-11.977-5.735-15.334-24.151-8.171-40.174
+ c6.683-15.025,19.953-23.458,30.795-18.797C172.872,138.532,178.732,155.14,172.885,171.828z"/>
+
+ <linearGradient id="XMLID_135_" gradientUnits="userSpaceOnUse" x1="124.4534" y1="151.3784" x2="150.1816" y2="163.9236" gradientTransform="matrix(0.9592 -0.0139 -0.0139 0.9839 10.0978 4.6877)">
+ <stop offset="0" style="stop-color:#7BB9F4"/>
+ <stop offset="0.0169" style="stop-color:#7BB9F4"/>
+ <stop offset="0.1966" style="stop-color:#60AFF4"/>
+ <stop offset="0.3694" style="stop-color:#5AACF3"/>
+ <stop offset="0.6015" style="stop-color:#49A2F2"/>
+ <stop offset="0.8663" style="stop-color:#2D92EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ <a:midPointStop offset="0" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.5" style="stop-color:#7BB9F4"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#60AFF4"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#60AFF4"/>
+ <a:midPointStop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_135_)" a:adobe-knockout="false" d="M172.836,171.892
+ c-5.978,17.062-21.435,26.589-33.55,20.745c-11.899-5.733-15.271-24.034-8.188-39.979
+ c6.63-15.002,19.893-23.427,30.743-18.769C172.901,138.635,178.699,155.255,172.836,171.892z"/>
+
+ <linearGradient id="XMLID_136_" gradientUnits="userSpaceOnUse" x1="124.5378" y1="151.2192" x2="151.441" y2="164.4907" gradientTransform="matrix(0.9612 -0.0128 -0.0128 0.984 9.5455 4.5045)">
+ <stop offset="0" style="stop-color:#82BDF5"/>
+ <stop offset="0.0169" style="stop-color:#82BDF5"/>
+ <stop offset="0.1966" style="stop-color:#65B2F5"/>
+ <stop offset="0.3618" style="stop-color:#5FAFF4"/>
+ <stop offset="0.5837" style="stop-color:#4EA5F3"/>
+ <stop offset="0.8368" style="stop-color:#3296F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ <a:midPointStop offset="0" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#82BDF5"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#65B2F5"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#65B2F5"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_136_)" a:adobe-knockout="false" d="M172.786,171.957
+ c-5.987,16.983-21.374,26.406-33.424,20.557c-11.822-5.73-15.208-23.916-8.204-39.785
+ c6.576-14.979,19.833-23.396,30.69-18.741C172.93,138.737,178.667,155.37,172.786,171.957z"/>
+
+ <linearGradient id="XMLID_137_" gradientUnits="userSpaceOnUse" x1="124.6213" y1="151.0547" x2="152.6828" y2="165.0581" gradientTransform="matrix(0.9632 -0.0117 -0.0117 0.9841 8.9927 4.3209)">
+ <stop offset="0" style="stop-color:#89C0F5"/>
+ <stop offset="0.0169" style="stop-color:#89C0F5"/>
+ <stop offset="0.1966" style="stop-color:#6AB5F5"/>
+ <stop offset="0.355" style="stop-color:#64B2F4"/>
+ <stop offset="0.5677" style="stop-color:#53A8F3"/>
+ <stop offset="0.8103" style="stop-color:#3799F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ <a:midPointStop offset="0" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.5" style="stop-color:#89C0F5"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#6AB5F5"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#6AB5F5"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_137_)" a:adobe-knockout="false" d="M172.737,172.021
+ c-5.996,16.904-21.313,26.223-33.297,20.369c-11.744-5.728-15.145-23.799-8.22-39.59
+ c6.522-14.957,19.773-23.366,30.638-18.713C172.96,138.84,178.635,155.485,172.737,172.021z"/>
+
+ <linearGradient id="XMLID_138_" gradientUnits="userSpaceOnUse" x1="124.7058" y1="150.8931" x2="153.9094" y2="165.6344" gradientTransform="matrix(0.9652 -0.0106 -0.0106 0.9841 8.4403 4.1378)">
+ <stop offset="0" style="stop-color:#90C4F6"/>
+ <stop offset="0.0169" style="stop-color:#90C4F6"/>
+ <stop offset="0.1966" style="stop-color:#6FB8F6"/>
+ <stop offset="0.3489" style="stop-color:#69B5F5"/>
+ <stop offset="0.5534" style="stop-color:#58ABF4"/>
+ <stop offset="0.7867" style="stop-color:#3C9CF1"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ <a:midPointStop offset="0" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#90C4F6"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#6FB8F6"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#6FB8F6"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_138_)" a:adobe-knockout="false" d="M172.687,172.085
+ c-6.005,16.825-21.251,26.04-33.171,20.181c-11.666-5.726-15.082-23.681-8.237-39.396
+ c6.468-14.934,19.713-23.335,30.585-18.685C172.989,138.943,178.602,155.6,172.687,172.085z"/>
+
+ <linearGradient id="XMLID_139_" gradientUnits="userSpaceOnUse" x1="124.7927" y1="150.7305" x2="155.1227" y2="166.2156" gradientTransform="matrix(0.9671 -0.0096 -0.0096 0.9842 7.888 3.9546)">
+ <stop offset="0" style="stop-color:#97C8F6"/>
+ <stop offset="0.0169" style="stop-color:#97C8F6"/>
+ <stop offset="0.1966" style="stop-color:#74BAF6"/>
+ <stop offset="0.3433" style="stop-color:#6EB7F5"/>
+ <stop offset="0.5404" style="stop-color:#5DAEF4"/>
+ <stop offset="0.7662" style="stop-color:#419FF1"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ <a:midPointStop offset="0" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.5" style="stop-color:#97C8F6"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#74BAF6"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#74BAF6"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_139_)" a:adobe-knockout="false" d="M172.638,172.149
+ c-6.015,16.747-21.19,25.857-33.045,19.994c-11.588-5.723-15.019-23.564-8.253-39.201
+ c6.414-14.911,19.654-23.305,30.533-18.657C173.018,139.046,178.57,155.715,172.638,172.149z"/>
+
+ <linearGradient id="XMLID_140_" gradientUnits="userSpaceOnUse" x1="124.8782" y1="150.5669" x2="156.3197" y2="166.802" gradientTransform="matrix(0.9691 -0.0085 -0.0085 0.9842 7.3352 3.7715)">
+ <stop offset="0" style="stop-color:#9ECCF7"/>
+ <stop offset="0.0169" style="stop-color:#9ECCF7"/>
+ <stop offset="0.1966" style="stop-color:#79BDF7"/>
+ <stop offset="0.3383" style="stop-color:#73BAF6"/>
+ <stop offset="0.5286" style="stop-color:#62B1F5"/>
+ <stop offset="0.7466" style="stop-color:#46A1F2"/>
+ <stop offset="0.9837" style="stop-color:#1F8DEE"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ <a:midPointStop offset="0" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#9ECCF7"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#79BDF7"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#79BDF7"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_140_)" a:adobe-knockout="false" d="M172.589,172.214
+ c-6.024,16.668-21.129,25.674-32.918,19.806c-11.511-5.721-14.956-23.446-8.27-39.006c6.36-14.888,19.594-23.274,30.48-18.628
+ C173.048,139.149,178.537,155.83,172.589,172.214z"/>
+
+ <linearGradient id="XMLID_141_" gradientUnits="userSpaceOnUse" x1="124.9661" y1="150.3999" x2="157.5024" y2="167.3901" gradientTransform="matrix(0.9711 -0.0074 -0.0074 0.9843 6.7829 3.5878)">
+ <stop offset="0" style="stop-color:#A5CFF7"/>
+ <stop offset="0.0169" style="stop-color:#A5CFF7"/>
+ <stop offset="0.1966" style="stop-color:#7EC0F7"/>
+ <stop offset="0.3337" style="stop-color:#78BDF6"/>
+ <stop offset="0.5178" style="stop-color:#67B3F5"/>
+ <stop offset="0.7287" style="stop-color:#4BA4F2"/>
+ <stop offset="0.958" style="stop-color:#248FEF"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ <a:midPointStop offset="0" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.5" style="stop-color:#A5CFF7"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#7EC0F7"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#7EC0F7"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_141_)" a:adobe-knockout="false" d="M172.539,172.278
+ c-6.033,16.589-21.067,25.492-32.792,19.619c-11.433-5.718-14.893-23.329-8.286-38.812
+ c6.306-14.865,19.534-23.244,30.427-18.601C173.077,139.252,178.505,155.945,172.539,172.278z"/>
+
+ <linearGradient id="XMLID_142_" gradientUnits="userSpaceOnUse" x1="125.054" y1="150.2329" x2="158.6707" y2="167.9843" gradientTransform="matrix(0.9731 -0.0063 -0.0063 0.9844 6.2306 3.4052)">
+ <stop offset="0" style="stop-color:#ACD3F8"/>
+ <stop offset="0.0169" style="stop-color:#ACD3F8"/>
+ <stop offset="0.1966" style="stop-color:#83C3F8"/>
+ <stop offset="0.3294" style="stop-color:#7DC0F7"/>
+ <stop offset="0.5078" style="stop-color:#6CB7F6"/>
+ <stop offset="0.7122" style="stop-color:#50A8F3"/>
+ <stop offset="0.9344" style="stop-color:#2993EF"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#ACD3F8"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#83C3F8"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#83C3F8"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_142_)" a:adobe-knockout="false" d="M172.49,172.343
+ c-6.042,16.511-21.006,25.309-32.666,19.431c-11.355-5.716-14.83-23.211-8.302-38.617
+ c6.252-14.842,19.474-23.213,30.375-18.572C173.106,139.355,178.472,156.06,172.49,172.343z"/>
+
+ <linearGradient id="XMLID_143_" gradientUnits="userSpaceOnUse" x1="125.1428" y1="150.0654" x2="159.8252" y2="168.5836" gradientTransform="matrix(0.9751 -0.0052 -0.0052 0.9844 5.6782 3.2215)">
+ <stop offset="0" style="stop-color:#B3D7F8"/>
+ <stop offset="0.0169" style="stop-color:#B3D7F8"/>
+ <stop offset="0.1966" style="stop-color:#87C6F8"/>
+ <stop offset="0.3262" style="stop-color:#81C3F7"/>
+ <stop offset="0.5004" style="stop-color:#70B9F6"/>
+ <stop offset="0.6998" style="stop-color:#54AAF3"/>
+ <stop offset="0.9166" style="stop-color:#2D95F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#B3D7F8"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#87C6F8"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#87C6F8"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_143_)" a:adobe-knockout="false" d="M172.44,172.407
+ c-6.052,16.432-20.945,25.125-32.54,19.243c-11.277-5.714-14.767-23.094-8.319-38.423
+ c6.199-14.819,19.415-23.183,30.323-18.544C173.135,139.458,178.44,156.175,172.44,172.407z"/>
+
+ <linearGradient id="XMLID_144_" gradientUnits="userSpaceOnUse" x1="125.2317" y1="149.897" x2="160.9635" y2="169.187" gradientTransform="matrix(0.9771 -0.0041 -0.0041 0.9845 5.1254 3.0379)">
+ <stop offset="0" style="stop-color:#BADAF8"/>
+ <stop offset="0.0169" style="stop-color:#BADAF8"/>
+ <stop offset="0.1966" style="stop-color:#8CC9F8"/>
+ <stop offset="0.3225" style="stop-color:#86C6F7"/>
+ <stop offset="0.4917" style="stop-color:#75BCF6"/>
+ <stop offset="0.6855" style="stop-color:#59ADF3"/>
+ <stop offset="0.896" style="stop-color:#3298F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.5" style="stop-color:#BADAF8"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#8CC9F8"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#8CC9F8"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_144_)" a:adobe-knockout="false" d="M172.39,172.472
+ c-6.061,16.354-20.884,24.942-32.413,19.056c-11.199-5.711-14.703-22.977-8.335-38.229
+ c6.145-14.797,19.354-23.152,30.27-18.516C173.165,139.561,178.408,156.29,172.39,172.472z"/>
+
+ <linearGradient id="XMLID_145_" gradientUnits="userSpaceOnUse" x1="125.324" y1="149.729" x2="162.0907" y2="169.7964" gradientTransform="matrix(0.9791 -0.0031 -0.0031 0.9845 4.5731 2.8548)">
+ <stop offset="0" style="stop-color:#C1DEF9"/>
+ <stop offset="0.0169" style="stop-color:#C1DEF9"/>
+ <stop offset="0.1966" style="stop-color:#91CCF9"/>
+ <stop offset="0.3191" style="stop-color:#8BC9F8"/>
+ <stop offset="0.4836" style="stop-color:#7ABFF7"/>
+ <stop offset="0.6721" style="stop-color:#5EB0F4"/>
+ <stop offset="0.877" style="stop-color:#379BF1"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ <a:midPointStop offset="0" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C1DEF9"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#91CCF9"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#91CCF9"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_145_)" a:adobe-knockout="false" d="M172.341,172.536
+ c-6.07,16.274-20.822,24.76-32.287,18.868c-11.122-5.709-14.641-22.859-8.352-38.034
+ c6.091-14.774,19.294-23.122,30.217-18.488C173.194,139.664,178.375,156.405,172.341,172.536z"/>
+
+ <linearGradient id="XMLID_146_" gradientUnits="userSpaceOnUse" x1="125.4158" y1="149.5596" x2="163.204" y2="170.4103" gradientTransform="matrix(0.9811 -0.002 -0.002 0.9846 4.0208 2.6716)">
+ <stop offset="0" style="stop-color:#C8E2F9"/>
+ <stop offset="0.0169" style="stop-color:#C8E2F9"/>
+ <stop offset="0.1966" style="stop-color:#96CFF9"/>
+ <stop offset="0.3158" style="stop-color:#90CCF8"/>
+ <stop offset="0.4761" style="stop-color:#7FC2F7"/>
+ <stop offset="0.6597" style="stop-color:#63B3F4"/>
+ <stop offset="0.8591" style="stop-color:#3C9EF1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ <a:midPointStop offset="0" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.5" style="stop-color:#C8E2F9"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#96CFF9"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#96CFF9"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_146_)" a:adobe-knockout="false" d="M172.292,172.601
+ c-6.08,16.196-20.761,24.577-32.161,18.68c-11.044-5.707-14.577-22.742-8.368-37.839c6.037-14.751,19.235-23.091,30.165-18.46
+ C173.223,139.767,178.343,156.52,172.292,172.601z"/>
+
+ <linearGradient id="XMLID_147_" gradientUnits="userSpaceOnUse" x1="125.5081" y1="149.3862" x2="164.3029" y2="171.0255" gradientTransform="matrix(0.9831 -8.870935e-004 -8.870935e-004 0.9847 3.4679 2.4885)">
+ <stop offset="0" style="stop-color:#CEE5FA"/>
+ <stop offset="0.0169" style="stop-color:#CEE5FA"/>
+ <stop offset="0.1966" style="stop-color:#9BD2FA"/>
+ <stop offset="0.3129" style="stop-color:#95CFF9"/>
+ <stop offset="0.4691" style="stop-color:#84C5F8"/>
+ <stop offset="0.6481" style="stop-color:#68B6F5"/>
+ <stop offset="0.8425" style="stop-color:#41A1F1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ <a:midPointStop offset="0" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#CEE5FA"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#9BD2FA"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#9BD2FA"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_147_)" a:adobe-knockout="false" d="M172.242,172.665
+ c-6.089,16.117-20.7,24.394-32.034,18.492c-10.966-5.704-14.514-22.625-8.384-37.644
+ c5.983-14.729,19.175-23.061,30.112-18.432C173.253,139.87,178.31,156.634,172.242,172.665z"/>
+
+ <linearGradient id="XMLID_148_" gradientUnits="userSpaceOnUse" x1="125.5979" y1="149.2148" x2="165.3848" y2="171.6476" gradientTransform="matrix(0.9851 1.967764e-004 1.967764e-004 0.9847 2.9156 2.3048)">
+ <stop offset="0" style="stop-color:#D5E9FA"/>
+ <stop offset="0.0169" style="stop-color:#D5E9FA"/>
+ <stop offset="0.1966" style="stop-color:#A0D5FA"/>
+ <stop offset="0.31" style="stop-color:#9AD2F9"/>
+ <stop offset="0.4625" style="stop-color:#89C8F8"/>
+ <stop offset="0.6372" style="stop-color:#6DB9F5"/>
+ <stop offset="0.8269" style="stop-color:#46A4F2"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ <a:midPointStop offset="0" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D5E9FA"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#A0D5FA"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#A0D5FA"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_148_)" a:adobe-knockout="false" d="M172.193,172.729
+ c-6.098,16.039-20.639,24.21-31.908,18.305c-10.889-5.702-14.451-22.507-8.4-37.45c5.929-14.706,19.115-23.03,30.06-18.404
+ C173.282,139.973,178.278,156.75,172.193,172.729z"/>
+
+ <linearGradient id="XMLID_149_" gradientUnits="userSpaceOnUse" x1="125.6917" y1="149.0425" x2="166.4561" y2="172.2738" gradientTransform="matrix(0.987 0.0013 0.0013 0.9848 2.3638 2.1222)">
+ <stop offset="0" style="stop-color:#DCEDFB"/>
+ <stop offset="0.0169" style="stop-color:#DCEDFB"/>
+ <stop offset="0.1966" style="stop-color:#A5D7FB"/>
+ <stop offset="0.3074" style="stop-color:#9FD4FA"/>
+ <stop offset="0.4564" style="stop-color:#8ECBF9"/>
+ <stop offset="0.627" style="stop-color:#72BCF6"/>
+ <stop offset="0.8135" style="stop-color:#4BA7F2"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#DCEDFB"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#A5D7FB"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#A5D7FB"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_149_)" a:adobe-knockout="false" d="M172.143,172.793
+ c-6.107,15.96-20.578,24.028-31.782,18.117c-10.811-5.699-14.388-22.39-8.417-37.255c5.875-14.683,19.055-23,30.007-18.376
+ C173.312,140.076,178.246,156.864,172.143,172.793z"/>
+
+ <linearGradient id="XMLID_150_" gradientUnits="userSpaceOnUse" x1="125.7878" y1="148.8711" x2="167.5164" y2="172.9064" gradientTransform="matrix(0.989 0.0024 0.0024 0.9849 1.8114 1.9385)">
+ <stop offset="0" style="stop-color:#E3F0FB"/>
+ <stop offset="0.0169" style="stop-color:#E3F0FB"/>
+ <stop offset="0.1966" style="stop-color:#AADAFB"/>
+ <stop offset="0.3049" style="stop-color:#A4D7FA"/>
+ <stop offset="0.4505" style="stop-color:#93CEF9"/>
+ <stop offset="0.6173" style="stop-color:#77BFF6"/>
+ <stop offset="0.7999" style="stop-color:#50AAF3"/>
+ <stop offset="0.9933" style="stop-color:#1E8FEE"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.5" style="stop-color:#E3F0FB"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#AADAFB"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#AADAFB"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_150_)" a:adobe-knockout="false" d="M172.094,172.858
+ c-6.117,15.881-20.516,23.845-31.655,17.93c-10.733-5.697-14.325-22.272-8.433-37.061
+ c5.821-14.661,18.995-22.969,29.955-18.348C173.341,140.179,178.213,156.979,172.094,172.858z"/>
+
+ <linearGradient id="XMLID_151_" gradientUnits="userSpaceOnUse" x1="125.8831" y1="148.6938" x2="168.5633" y2="173.5392" gradientTransform="matrix(0.991 0.0034 0.0034 0.9849 1.2586 1.7549)">
+ <stop offset="0" style="stop-color:#EAF4FC"/>
+ <stop offset="0.0169" style="stop-color:#EAF4FC"/>
+ <stop offset="0.1966" style="stop-color:#AEDDFC"/>
+ <stop offset="0.303" style="stop-color:#A8DAFB"/>
+ <stop offset="0.446" style="stop-color:#97D0FA"/>
+ <stop offset="0.6099" style="stop-color:#7BC1F7"/>
+ <stop offset="0.7893" style="stop-color:#54ACF3"/>
+ <stop offset="0.9793" style="stop-color:#2291EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#EAF4FC"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#AEDDFC"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#AEDDFC"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_151_)" a:adobe-knockout="false" d="M172.044,172.922
+ c-6.126,15.803-20.455,23.662-31.529,17.742c-10.655-5.694-14.262-22.155-8.45-36.866
+ c5.768-14.638,18.936-22.939,29.902-18.32C173.37,140.282,178.181,157.094,172.044,172.922z"/>
+
+ <linearGradient id="XMLID_152_" gradientUnits="userSpaceOnUse" x1="125.9778" y1="148.521" x2="169.594" y2="174.1801" gradientTransform="matrix(0.993 0.0045 0.0045 0.985 0.7063 1.5718)">
+ <stop offset="0" style="stop-color:#F1F8FC"/>
+ <stop offset="0.0169" style="stop-color:#F1F8FC"/>
+ <stop offset="0.1966" style="stop-color:#B3E0FC"/>
+ <stop offset="0.3008" style="stop-color:#ADDDFB"/>
+ <stop offset="0.4408" style="stop-color:#9CD3FA"/>
+ <stop offset="0.6013" style="stop-color:#80C4F7"/>
+ <stop offset="0.7769" style="stop-color:#59AFF4"/>
+ <stop offset="0.9628" style="stop-color:#2794EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ <a:midPointStop offset="0" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F1F8FC"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#B3E0FC"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#B3E0FC"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_152_)" a:adobe-knockout="false" d="M171.995,172.987
+ c-6.135,15.724-20.394,23.479-31.403,17.554c-10.577-5.692-14.198-22.038-8.466-36.671
+ c5.713-14.615,18.875-22.908,29.85-18.292C173.4,140.384,178.149,157.209,171.995,172.987z"/>
+
+ <linearGradient id="XMLID_153_" gradientUnits="userSpaceOnUse" x1="126.0779" y1="148.3438" x2="170.6163" y2="174.8215" gradientTransform="matrix(0.995 0.0056 0.0056 0.985 0.154 1.3886)">
+ <stop offset="0" style="stop-color:#F8FBFD"/>
+ <stop offset="0.0169" style="stop-color:#F8FBFD"/>
+ <stop offset="0.1966" style="stop-color:#B8E3FD"/>
+ <stop offset="0.2987" style="stop-color:#B2E0FC"/>
+ <stop offset="0.4358" style="stop-color:#A1D7FB"/>
+ <stop offset="0.593" style="stop-color:#85C7F8"/>
+ <stop offset="0.765" style="stop-color:#5EB2F4"/>
+ <stop offset="0.9471" style="stop-color:#2C98F0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ <a:midPointStop offset="0" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F8FBFD"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#B8E3FD"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#B8E3FD"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_153_)" a:adobe-knockout="false" d="M171.945,173.051
+ c-6.145,15.645-20.332,23.296-31.276,17.366c-10.5-5.689-14.136-21.92-8.482-36.477c5.66-14.592,18.816-22.878,29.797-18.264
+ C173.429,140.487,178.116,157.324,171.945,173.051z"/>
+
+ <linearGradient id="XMLID_154_" gradientUnits="userSpaceOnUse" x1="126.175" y1="148.168" x2="171.6249" y2="175.4708" gradientTransform="matrix(0.997 0.0067 0.0067 0.9851 -0.3988 1.2055)">
+ <stop offset="0.0169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.1966" style="stop-color:#BDE6FD"/>
+ <stop offset="0.2966" style="stop-color:#B7E3FC"/>
+ <stop offset="0.4311" style="stop-color:#A6D9FB"/>
+ <stop offset="0.5851" style="stop-color:#8ACAF8"/>
+ <stop offset="0.7538" style="stop-color:#63B5F5"/>
+ <stop offset="0.9323" style="stop-color:#319AF0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#FFFFFD"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FFFFFD"/>
+ <a:midPointStop offset="0.1966" style="stop-color:#BDE6FD"/>
+ <a:midPointStop offset="0.6441" style="stop-color:#BDE6FD"/>
+ <a:midPointStop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_154_)" a:adobe-knockout="false" d="M171.896,173.116
+ c-6.154,15.566-20.271,23.113-31.15,17.179c-10.422-5.688-14.072-21.803-8.499-36.282
+ c5.605-14.569,18.756-22.847,29.745-18.235C173.458,140.59,178.084,157.439,171.896,173.116z"/>
+ </g>
+
+ <linearGradient id="XMLID_155_" gradientUnits="userSpaceOnUse" x1="164.9543" y1="202.2217" x2="149.6072" y2="161.9356" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0.0169" style="stop-color:#FFFFFF"/>
+ <stop offset="0.0405" style="stop-color:#FFF8D8"/>
+ <stop offset="0.0716" style="stop-color:#FFF0AB"/>
+ <stop offset="0.1058" style="stop-color:#FFE982"/>
+ <stop offset="0.1424" style="stop-color:#FFE35F"/>
+ <stop offset="0.182" style="stop-color:#FFDD41"/>
+ <stop offset="0.2257" style="stop-color:#FFD929"/>
+ <stop offset="0.2749" style="stop-color:#FFD617"/>
+ <stop offset="0.3331" style="stop-color:#FFD40A"/>
+ <stop offset="0.4089" style="stop-color:#FFD202"/>
+ <stop offset="0.5674" style="stop-color:#FFD200"/>
+ <stop offset="1" style="stop-color:#FF8B00"/>
+ <a:midPointStop offset="0.0169" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.1657" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.5674" style="stop-color:#FFD200"/>
+ <a:midPointStop offset="0.5" style="stop-color:#FFD200"/>
+ <a:midPointStop offset="1" style="stop-color:#FF8B00"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_155_)" d="M146.963,187.534c4.335,0.355,8.602-1.261,12.088-3.753
+ c2.567-1.832,4.755-4.097,6.448-6.695c0.013-0.017,0.02-0.032,0.032-0.047c0.335-0.515,0.649-1.043,0.947-1.583
+ c0.002-0.008,0.007-0.018,0.012-0.026c0.595-1.093,1.106-2.237,1.526-3.425c1.907-5.378,2.463-11.103,1.254-16.71
+ c-1.074-4.971-3.68-9.773-7.839-12.81c-1.984-1.447-4.13-2.335-6.593-2.491c-2.774-0.178-5.532,0.516-8.021,1.722
+ c-0.292,0.19-0.583,0.382-0.873,0.591c-9.198,6.574-13.717,17.453-13.508,27.301c0.333,5.737,2.45,11.024,6.418,14.594
+ C141.177,186.048,143.957,187.287,146.963,187.534z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M152.871,163.726c0.6-3.865-0.522-7.005-2.662-6.849
+ c-2.314,0.169-4.753,4.052-5.243,8.456c-0.463,4.194,1.088,6.84,3.284,6.14C150.298,170.817,152.301,167.43,152.871,163.726z"
+ />
+ <path i:knockout="Off" fill="#1C86EE" d="M162.636,162.831c-0.229-0.074-0.595-0.122-1.02,0.095
+ c-1.451,0.724-2.662,4.385-2.89,5.114c-0.319,1.026-1.306,4.479-0.473,5.754c0.22,0.333,0.541,0.539,0.91,0.59
+ c0.917,0.124,1.58-0.733,1.997-1.385c0.242-0.378,0.491-0.838,0.734-1.364c0.351-0.751,0.686-1.621,0.961-2.508
+ C163.516,167.019,164.369,163.397,162.636,162.831z"/>
+
+ <linearGradient id="XMLID_156_" gradientUnits="userSpaceOnUse" x1="157.2424" y1="146.5264" x2="154.0309" y2="160.3349" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.4169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.6466" style="stop-color:#FFFFF5"/>
+ <stop offset="0.8302" style="stop-color:#FFFFE7"/>
+ <stop offset="0.9894" style="stop-color:#FFFFD4"/>
+ <stop offset="1" style="stop-color:#FFFFD2"/>
+ <a:midPointStop offset="0" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="0.8136" style="stop-color:#FFFFFF"/>
+ <a:midPointStop offset="1" style="stop-color:#FFFFD2"/>
+ </linearGradient>
+ <path i:knockout="Off" opacity="0.75" fill="url(#XMLID_156_)" d="M141.049,150.84c-3.562,6.513-3.258,7.708,7.139,8.935
+ c7.664,1.236,11.396,3.66,15.189,5.776c2.492,1.122,4.064,3.785,5.62,1.77c2.158-3.913,1.6-13.077-3.001-19.51
+ C158.905,138.266,146.682,142.015,141.049,150.84z"/>
+
+ <linearGradient id="XMLID_157_" gradientUnits="userSpaceOnUse" x1="174.7786" y1="143.7949" x2="142.9488" y2="191.5393" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0.0056" style="stop-color:#1C86EE"/>
+ <stop offset="0.3764" style="stop-color:#FCFFFC"/>
+ <stop offset="0.437" style="stop-color:#F0F9FB"/>
+ <stop offset="0.5465" style="stop-color:#D0E7F9"/>
+ <stop offset="0.6924" style="stop-color:#9DCCF6"/>
+ <stop offset="0.8669" style="stop-color:#56A6F2"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.0056" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.5" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0.3764" style="stop-color:#FCFFFC"/>
+ <a:midPointStop offset="0.5763" style="stop-color:#FCFFFC"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_157_)" d="M171.884,152.011c-1.553-5.683-5.044-10.198-9.621-12.281
+ c2.69,1.772,4.894,4.438,6.383,7.697c0.524,1.133,0.966,2.337,1.31,3.598c1.867,6.835,0.87,15.174-2.249,22.22
+ c0.136-0.382,0.264-0.767,0.388-1.158c-0.129,0.322-0.261,0.641-0.4,0.953c0.01-0.018,0.02-0.034,0.027-0.051
+ c-0.985,2.716-2.309,5.289-3.931,7.549c-4.159,5.805-10.422,9.747-16.525,9.768c6.978,0.854,14.433-3.608,19.244-10.475
+ C171.976,172.024,174.278,160.775,171.884,152.011z"/>
+
+ <linearGradient id="XMLID_158_" gradientUnits="userSpaceOnUse" x1="187.4504" y1="142.1313" x2="164.2581" y2="156.7162" gradientTransform="matrix(1 0.0046 -0.0046 1 1.194 -1.0432)">
+ <stop offset="0" style="stop-color:#CDF0FC"/>
+ <stop offset="0.0783" style="stop-color:#C1E9FB"/>
+ <stop offset="0.2197" style="stop-color:#A1D6F9"/>
+ <stop offset="0.408" style="stop-color:#6EB7F4"/>
+ <stop offset="0.6339" style="stop-color:#278DEF"/>
+ <stop offset="0.6685" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#CDF0FC"/>
+ <a:midPointStop offset="0.5763" style="stop-color:#CDF0FC"/>
+ <a:midPointStop offset="0.6685" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_158_)" d="M164.172,141.119c-1.251-1.094-2.555-1.922-4.174-2.326
+ c-1.721-0.43-3.498-0.503-5.252-0.271c-2.867,0.38-5.571,1.604-7.956,3.206c2.497-1.214,5.264-1.912,8.048-1.733
+ c2.463,0.156,4.609,1.043,6.593,2.491c4.159,3.037,6.765,7.839,7.839,12.81c1.209,5.607,0.653,11.332-1.254,16.71
+ c-0.419,1.188-0.931,2.332-1.526,3.425c-0.005,0.008-0.01,0.018-0.012,0.026c-0.298,0.54-0.612,1.069-0.947,1.583
+ c-0.012,0.015-0.019,0.03-0.032,0.047c-1.693,2.599-3.881,4.864-6.448,6.695c-3.487,2.492-7.753,4.108-12.088,3.753
+ c-3.006-0.247-5.786-1.486-8.109-3.333c-4.351-3.915-6.502-9.888-6.484-16.264c-0.254,7.866,2.438,15.275,8.14,19.584
+ c2.119,1.604,4.413,2.494,6.758,2.782c3.801-0.011,7.666-1.546,11.044-4.104c4.957-3.631,8.622-9.341,10.458-14.954
+ C171.896,161.679,172.442,148.35,164.172,141.119z"/>
+ </g>
+ <g>
+ <path i:knockout="Off" fill="#1C86EE" d="M374.069,178.561c-0.518-1.209-1.943-1.804-2.892-2.197l0,0
+ c-5.054-2.121-10.609-1.918-15.247,0.558c-2.162,1.159-3.67,2.625-4.479,4.36c-1.121,2.403-0.544,4.625,1.627,6.257
+ c1.782,1.344,3.916,1.957,5.948,2.472c2.727,0.688,4.185,1.78,4.465,3.334c0.336,1.868-2.13,3.869-3.915,4.377
+ c-2.181,0.618-4.308,0.205-5.683-1.104c-0.185-0.176-0.364-0.368-0.558-0.57c-0.627-0.659-1.334-1.405-2.301-1.709
+ c-1.347-0.427-2.814,0.161-3.671,0.928c-0.735,0.661-1.07,1.479-0.969,2.361c0.159,1.401,1.395,2.667,2.545,3.305
+ c3.47,1.917,8.33,2.054,14.451,0.416c3.881-1.036,8.297-4.134,8.815-8.484c0.578-4.775-4.066-5.914-7.461-6.744
+ c-0.476-0.117-0.923-0.225-1.346-0.339c-1.201-0.327-3.317-1.071-3.959-2.365c-0.252-0.51-0.25-1.06,0.008-1.683
+ c0.848-2.061,3.841-2.931,5.852-2.302c0.743,0.23,1.438,0.76,2.173,1.318c1.413,1.071,3.013,2.287,5.056,1.076
+ C373.666,181.157,374.587,179.784,374.069,178.561z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M347.107,185.276c0.838-2.559,2.233-6.842-0.644-8.913l-0.273,0.378l0.273-0.381
+ c-2.172-1.555-5.265-1.475-7.4-1.277c-1.379,0.127-2.694,0.396-3.9,0.8l-0.27,0.09c-1.246,0.419-2.42,0.814-3.707,0.793
+ c-0.68-0.012-1.313-0.315-1.98-0.64c-0.314-0.151-0.638-0.307-0.976-0.434c-1.359-0.522-2.783-0.835-4.225-0.938
+ c-1.434-0.099-2.77,0.006-3.973,0.318c-0.513,0.132-1.015,0.305-1.498,0.473c-0.822,0.285-1.597,0.554-2.424,0.631
+ c-0.888,0.085-1.829-0.053-2.821-0.205c-1.745-0.26-3.555-0.532-5.178,0.471c-2.08,1.279-2.789,3.631-3.419,5.706
+ c-0.123,0.414-0.243,0.806-0.373,1.189l-0.715,2.152l-2.154,6.479c0,0-0.567,1.636-0.567,1.636
+ c-0.486,1.382-0.987,2.81-1.335,4.26c-0.215,0.915-0.79,3.34,0.968,4.18c1.994,0.954,4.081-0.618,5.264-2.601
+ c0.522-0.872,0.831-1.827,1.131-2.751l0.138-0.413l1.44-4.322c0.176-0.522,0.349-1.061,0.512-1.583
+ c0.571-1.813,1.164-3.685,2.087-5.318c1.573-2.787,5.328-4.991,8.656-3.695c1.48,0.577,2.222,2.113,1.892,3.915
+ c-0.164,0.891-0.488,1.788-0.8,2.656c-0.126,0.348-0.257,0.709-0.375,1.065c0-0.001-1.401,4.227-1.401,4.227l-0.218,0.664
+ c-0.337,1.037-0.683,2.111-0.997,3.175c0,0.002-0.031,0.111-0.031,0.111c-0.346,1.185-0.822,2.807-0.093,4.093
+ c0.318,0.563,0.837,0.931,1.492,1.067c1.182,0.243,2.59-0.309,3.4-0.923c1.763-1.337,2.485-3.735,3.065-5.657l0.122-0.4
+ c0.462-1.524,0.964-3.063,1.45-4.552l1.061-3.292c0.638-2.021,1.592-4.279,3.836-5.688c1.438-0.904,3.823-1.608,5.817-0.617
+ c2.174,1.083,1.719,3.6,0.988,5.918c-0.732,2.33-1.563,4.969-2.454,7.511c-0.734,2.092-1.383,4.896-0.317,6.393
+ c0.471,0.662,1.208,0.995,2.189,0.99c3.044-0.005,4.46-3.898,5.145-5.767c0.883-2.428,1.67-4.931,2.436-7.353l1.134-3.557
+ L347.107,185.276z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M303.573,170.912L303.573,170.912c0.318-0.958,0.758-2.27,0.384-3.487
+ c-0.366-1.18-1.568-1.734-3.222-1.482c-1.99,0.3-3.494,1.76-4.475,4.338c-1.388,3.639-2.576,7.433-3.73,11.1l-1.695,5.323
+ c0,0.003-2.808,8.527-2.808,8.527c-0.082,0.258-0.195,0.556-0.312,0.873c-0.595,1.588-1.414,3.764-0.416,5.264
+ c0.348,0.525,0.886,0.857,1.557,0.962c1.188,0.187,2.64-0.379,3.459-1.033c1.376-1.093,2.119-2.739,2.668-4.206
+ c0.347-0.936,0.632-1.902,0.905-2.835l0.382-1.281c0.491-1.585,1.033-3.189,1.559-4.74l0.738-2.202l3.164-9.55L303.573,170.912
+ z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M277.81,180.669c0.863-0.629,1.755-1.276,2.476-2.125l-0.358-0.301l0.358,0.3
+ c0.911-1.073,0.336-2.331-0.084-3.25c-0.059-0.129-0.115-0.256-0.167-0.375c-0.488-1.143-0.618-2.146-0.382-2.98
+ c0.305-1.075,1.21-1.617,2.17-2.19c0.991-0.592,2.014-1.204,2.471-2.429c0.338-0.916,0.052-1.52-0.249-1.865
+ c-1.092-1.256-4.009-1.08-4.948-0.874c-2.221,0.493-4.303,1.802-6.188,3.895c-0.698,0.775-1.31,1.65-1.905,2.496
+ c-0.859,1.22-1.747,2.484-2.875,3.413c-0.188,0.155-0.389,0.304-0.603,0.463c-0.722,0.538-1.54,1.147-1.945,2.065
+ c-0.516,1.162-0.032,2.259,0.392,3.227c0.098,0.223,0.19,0.435,0.269,0.639c0.667,1.755,0.507,3.067-0.026,4.873
+ c-0.423,1.43-0.904,2.874-1.368,4.27l-0.203,0.608c-0.263,0.805-0.563,1.617-0.846,2.402c-0.333,0.902-0.674,1.833-0.972,2.765
+ l-0.055,0.166c-0.501,1.555-1.433,4.441,0.079,5.865c0.47,0.443,1.09,0.663,1.785,0.636c1.309-0.053,2.718-0.966,3.472-1.796
+ c1.068-1.176,1.72-2.629,2.265-4.023c0.805-2.062,1.455-4.212,2.085-6.292c0.416-1.375,0.849-2.802,1.316-4.182
+ c0.465-1.36,0.929-2.575,1.902-3.63C276.292,181.769,277.03,181.235,277.81,180.669z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M288.105,181.76c0.083-0.25,0.202-0.528,0.324-0.823
+ c0.411-0.992,0.877-2.119,0.693-3.14h0.001c-0.124-0.724-0.484-1.281-1.042-1.606c-1.065-0.62-2.455-0.224-3.004-0.026
+ c-1.848,0.672-3.002,1.91-3.743,4.016l-1.5,4.156l-1.475,4.076l-0.869,2.563c-0.484,1.436-0.979,2.921-1.53,4.354l-0.11,0.288
+ c-0.532,1.372-1.197,3.081-0.886,4.665c0.171,0.868,0.702,1.497,1.497,1.766c1.273,0.432,2.955-0.13,3.851-0.918
+ c1.775-1.576,2.488-3.801,3.173-5.956c0.14-0.436,0.285-0.886,0.436-1.32l1.614-4.665l1.284-3.709L288.105,181.76z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M287.126,170.453l-0.06-0.033c0.801,0.536,1.919,0.518,3.075-0.053
+ c1.077-0.531,2.196-1.592,2.273-2.767c0.03-0.476-0.102-1.155-0.915-1.695c-1.119-0.745-2.646-0.381-3.702,0.207
+ c-1.235,0.688-2.013,1.726-1.981,2.654C285.834,169.261,286.073,169.956,287.126,170.453z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M263.784,171.393c-0.5-2.365-2.247-4.543-4.795-5.978v0.001
+ c-3.849-2.169-9.13-2.466-14.868-0.841c-4.233,1.202-8.194,3.629-11.456,7.019c-3.144,3.269-5.534,7.291-6.912,11.633
+ c-1.854,5.821-1.277,11.148,1.578,14.613c3.38,4.106,9.147,4.468,12.279,4.322c5.15-0.246,10.108-2.085,14.349-5.318
+ c1.531-1.168,4.385-3.341,4.204-5.813c-0.037-0.514-0.276-0.958-0.692-1.279c-0.674-0.522-1.683-0.627-2.386-0.502
+ c-1.226,0.227-2.24,1.058-3.138,1.79l-0.449,0.362c-1.908,1.507-3.986,3.035-6.548,3.733c-2.5,0.678-5.005,0.737-7.057,0.17
+ c-5.951-1.649-4.499-9.141-3.911-11.397c1.328-5.108,4.568-9.584,8.658-11.978c3.939-2.302,10.393-2.634,13.36,0.57
+ c0.397,0.433,0.725,1.006,1.04,1.56c0.81,1.421,1.727,3.034,4.082,2.331C263.346,175.725,264.317,173.904,263.784,171.393z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M218.376,165.557c-3.85-2.166-9.13-2.463-14.866-0.837
+ c-8.435,2.393-15.473,9.535-18.37,18.648c-1.854,5.823-1.276,11.152,1.58,14.616c3.381,4.105,9.145,4.468,12.277,4.32
+ c5.189-0.244,10.181-2.105,14.439-5.385c3.166-2.436,7.522-6.221,8.751-10.965c0.56-2.147,0.171-3.742-1.091-4.484
+ c-0.788-0.464-1.762-0.532-2.617-0.594c-0.191-0.013-0.373-0.026-0.547-0.044c-1.563-0.15-2.854-0.183-4.066-0.103
+ c-3.681,0.245-5.999,1.249-6.891,2.989c-1.021,2.007,0.73,3.055,2.009,3.818c0.6,0.359,1.222,0.73,1.529,1.137
+ c0.83,1.084-0.178,2.822-1.055,3.723c-1.199,1.227-2.729,2.139-4.538,2.711c-1.364,0.431-6.073,1.677-9.396-0.416
+ c-3.129-1.971-2.963-6.216-2.586-8.572c0.588-3.669,2.018-6.985,4.144-9.583l-0.363-0.296l0.363,0.295
+ c1.919-2.348,3.799-3.947,5.751-4.891c2.163-1.048,4.733-1.465,7.433-1.205c1.816,0.175,4.261,0.805,5.594,2.798
+ c0.215,0.317,0.393,0.659,0.583,1.02c0.336,0.633,0.683,1.288,1.229,1.834c1.149,1.147,2.866,0.466,3.6,0.174
+ c2.104-0.838,2.382-3.322,1.723-5.41C222.328,168.742,220.688,166.86,218.376,165.557z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M374.069,178.561c-0.518-1.209-1.943-1.804-2.892-2.197l0,0
+ c-5.054-2.121-10.609-1.918-15.247,0.558c-2.162,1.159-3.67,2.625-4.479,4.36c-1.121,2.403-0.544,4.625,1.627,6.257
+ c1.782,1.344,3.916,1.957,5.948,2.472c2.727,0.688,4.185,1.78,4.465,3.334c0.336,1.868-2.13,3.869-3.915,4.377
+ c-2.181,0.618-4.308,0.205-5.683-1.104c-0.185-0.176-0.364-0.368-0.558-0.57c-0.627-0.659-1.334-1.405-2.301-1.709
+ c-1.347-0.427-2.814,0.161-3.671,0.928c-0.735,0.661-1.07,1.479-0.969,2.361c0.159,1.401,1.395,2.667,2.545,3.305
+ c3.47,1.917,8.33,2.054,14.451,0.416c3.881-1.036,8.297-4.134,8.815-8.484c0.578-4.775-4.066-5.914-7.461-6.744
+ c-0.476-0.117-0.923-0.225-1.346-0.339c-1.201-0.327-3.317-1.071-3.959-2.365c-0.252-0.51-0.25-1.06,0.008-1.683
+ c0.848-2.061,3.841-2.931,5.852-2.302c0.743,0.23,1.438,0.76,2.173,1.318c1.413,1.071,3.013,2.287,5.056,1.076
+ C373.666,181.157,374.587,179.784,374.069,178.561z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M347.107,185.276c0.838-2.559,2.233-6.842-0.644-8.913v-0.003
+ c-2.172-1.555-5.265-1.475-7.4-1.277c-1.379,0.127-2.694,0.396-3.9,0.8l-0.27,0.09c-1.246,0.419-2.42,0.814-3.707,0.793
+ c-0.68-0.012-1.313-0.315-1.98-0.64c-0.314-0.151-0.638-0.307-0.976-0.434c-1.359-0.522-2.783-0.835-4.225-0.938
+ c-1.434-0.099-2.77,0.006-3.973,0.318c-0.513,0.132-1.015,0.305-1.498,0.473c-0.822,0.285-1.597,0.554-2.424,0.631
+ c-0.888,0.085-1.829-0.053-2.821-0.205c-1.745-0.26-3.555-0.532-5.178,0.471c-2.08,1.279-2.789,3.631-3.419,5.706
+ c-0.123,0.414-0.243,0.806-0.373,1.189l-0.715,2.152l-2.154,6.479c0,0-0.567,1.636-0.567,1.636
+ c-0.486,1.382-0.987,2.81-1.335,4.26c-0.215,0.915-0.79,3.34,0.968,4.18c1.994,0.954,4.081-0.618,5.264-2.601
+ c0.522-0.872,0.831-1.827,1.131-2.751l0.138-0.413l1.44-4.322c0.176-0.522,0.349-1.061,0.512-1.583
+ c0.571-1.813,1.164-3.685,2.087-5.318c1.573-2.787,5.328-4.991,8.656-3.695c1.48,0.577,2.222,2.113,1.892,3.915
+ c-0.164,0.891-0.488,1.788-0.8,2.656c-0.126,0.348-0.257,0.709-0.375,1.065c0-0.001-1.401,4.227-1.401,4.227l-0.218,0.664
+ c-0.337,1.037-0.683,2.111-0.997,3.175c0,0.002-0.031,0.111-0.031,0.111c-0.346,1.185-0.822,2.807-0.093,4.093
+ c0.318,0.563,0.837,0.931,1.492,1.067c1.182,0.243,2.59-0.309,3.4-0.923c1.763-1.337,2.485-3.735,3.065-5.657l0.122-0.4
+ c0.462-1.524,0.964-3.063,1.45-4.552l1.061-3.292c0.638-2.021,1.592-4.279,3.836-5.688c1.438-0.904,3.823-1.608,5.817-0.617
+ c2.174,1.083,1.719,3.6,0.988,5.918c-0.732,2.33-1.563,4.969-2.454,7.511c-0.734,2.092-1.383,4.896-0.317,6.393
+ c0.471,0.662,1.208,0.995,2.189,0.99c3.044-0.005,4.46-3.898,5.145-5.767c0.883-2.428,1.67-4.931,2.436-7.353l1.134-3.557
+ L347.107,185.276z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M303.573,170.912L303.573,170.912c0.318-0.958,0.758-2.27,0.384-3.487
+ c-0.366-1.18-1.568-1.734-3.222-1.482c-1.99,0.3-3.494,1.76-4.475,4.338c-1.388,3.639-2.576,7.433-3.73,11.1l-1.695,5.323
+ c0,0.003-2.808,8.527-2.808,8.527c-0.082,0.258-0.195,0.556-0.312,0.873c-0.595,1.588-1.414,3.764-0.416,5.264
+ c0.348,0.525,0.886,0.857,1.557,0.962c1.188,0.187,2.64-0.379,3.459-1.033c1.376-1.093,2.119-2.739,2.668-4.206
+ c0.347-0.936,0.632-1.902,0.905-2.835l0.382-1.281c0.491-1.585,1.033-3.189,1.559-4.74l0.738-2.202l3.164-9.55L303.573,170.912
+ z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M277.81,180.669c0.863-0.629,1.755-1.276,2.476-2.125v-0.001
+ c0.911-1.073,0.336-2.331-0.084-3.25c-0.059-0.129-0.115-0.256-0.167-0.375c-0.488-1.143-0.618-2.146-0.382-2.98
+ c0.305-1.075,1.21-1.617,2.17-2.19c0.991-0.592,2.014-1.204,2.471-2.429c0.338-0.916,0.052-1.52-0.249-1.865
+ c-1.092-1.256-4.009-1.08-4.948-0.874c-2.221,0.493-4.303,1.802-6.188,3.895c-0.698,0.775-1.31,1.65-1.905,2.496
+ c-0.859,1.22-1.747,2.484-2.875,3.413c-0.188,0.155-0.389,0.304-0.603,0.463c-0.722,0.538-1.54,1.147-1.945,2.065
+ c-0.516,1.162-0.032,2.259,0.392,3.227c0.098,0.223,0.19,0.435,0.269,0.639c0.667,1.755,0.507,3.067-0.026,4.873
+ c-0.423,1.43-0.904,2.874-1.368,4.27l-0.203,0.608c-0.263,0.805-0.563,1.617-0.846,2.402c-0.333,0.902-0.674,1.833-0.972,2.765
+ l-0.055,0.166c-0.501,1.555-1.433,4.441,0.079,5.865c0.47,0.443,1.09,0.663,1.785,0.636c1.309-0.053,2.718-0.966,3.472-1.796
+ c1.068-1.176,1.72-2.629,2.265-4.023c0.805-2.062,1.455-4.212,2.085-6.292c0.416-1.375,0.849-2.802,1.316-4.182
+ c0.465-1.36,0.929-2.575,1.902-3.63C276.292,181.769,277.03,181.235,277.81,180.669z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M288.105,181.76c0.083-0.25,0.202-0.528,0.324-0.823
+ c0.411-0.992,0.877-2.119,0.693-3.14h0.001c-0.124-0.724-0.484-1.281-1.042-1.606c-1.065-0.62-2.455-0.224-3.004-0.026
+ c-1.848,0.672-3.002,1.91-3.743,4.016l-1.5,4.156l-1.475,4.076l-0.869,2.563c-0.484,1.436-0.979,2.921-1.53,4.354l-0.11,0.288
+ c-0.532,1.372-1.197,3.081-0.886,4.665c0.171,0.868,0.702,1.497,1.497,1.766c1.273,0.432,2.955-0.13,3.851-0.918
+ c1.775-1.576,2.488-3.801,3.173-5.956c0.14-0.436,0.285-0.886,0.436-1.32l1.614-4.665l1.284-3.709L288.105,181.76z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M287.126,170.453l-0.06-0.033c0.801,0.536,1.919,0.518,3.075-0.053
+ c1.077-0.531,2.196-1.592,2.273-2.767c0.03-0.476-0.102-1.155-0.915-1.695c-1.119-0.745-2.646-0.381-3.702,0.207
+ c-1.235,0.688-2.013,1.726-1.981,2.654C285.834,169.261,286.073,169.956,287.126,170.453z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M263.784,171.393c-0.5-2.365-2.247-4.543-4.795-5.978v0.001
+ c-3.849-2.169-9.13-2.466-14.868-0.841c-4.233,1.202-8.194,3.629-11.456,7.019c-3.144,3.269-5.534,7.291-6.912,11.633
+ c-1.854,5.821-1.277,11.148,1.578,14.613c3.38,4.106,9.147,4.468,12.279,4.322c5.15-0.246,10.108-2.085,14.349-5.318
+ c1.531-1.168,4.385-3.341,4.204-5.813c-0.037-0.514-0.276-0.958-0.692-1.279c-0.674-0.522-1.683-0.627-2.386-0.502
+ c-1.226,0.227-2.24,1.058-3.138,1.79l-0.449,0.362c-1.908,1.507-3.986,3.035-6.548,3.733c-2.5,0.678-5.005,0.737-7.057,0.17
+ c-5.951-1.649-4.499-9.141-3.911-11.397c1.328-5.108,4.568-9.584,8.658-11.978c3.939-2.302,10.393-2.634,13.36,0.57
+ c0.397,0.433,0.725,1.006,1.04,1.56c0.81,1.421,1.727,3.034,4.082,2.331C263.346,175.725,264.317,173.904,263.784,171.393z"/>
+ <path i:knockout="Off" fill="#1C86EE" d="M218.376,165.557c-3.85-2.166-9.13-2.463-14.866-0.837
+ c-8.435,2.393-15.473,9.535-18.37,18.648c-1.854,5.823-1.276,11.152,1.58,14.616c3.381,4.105,9.145,4.468,12.277,4.32
+ c5.189-0.244,10.181-2.105,14.439-5.385c3.166-2.436,7.522-6.221,8.751-10.965c0.56-2.147,0.171-3.742-1.091-4.484
+ c-0.788-0.464-1.762-0.532-2.617-0.594c-0.191-0.013-0.373-0.026-0.547-0.044c-1.563-0.15-2.854-0.183-4.066-0.103
+ c-3.681,0.245-5.999,1.249-6.891,2.989c-1.021,2.007,0.73,3.055,2.009,3.818c0.6,0.359,1.222,0.73,1.529,1.137
+ c0.83,1.084-0.178,2.822-1.055,3.723c-1.199,1.227-2.729,2.139-4.538,2.711c-1.364,0.431-6.073,1.677-9.396-0.416
+ c-3.129-1.971-2.963-6.216-2.586-8.572c0.588-3.669,2.018-6.985,4.144-9.583l-0.363-0.296l0.363,0.295
+ c1.919-2.348,3.799-3.947,5.751-4.891c2.163-1.048,4.733-1.465,7.433-1.205c1.816,0.175,4.261,0.805,5.594,2.798
+ c0.215,0.317,0.393,0.659,0.583,1.02c0.336,0.633,0.683,1.288,1.229,1.834c1.149,1.147,2.866,0.466,3.6,0.174
+ c2.104-0.838,2.382-3.322,1.723-5.41C222.328,168.742,220.688,166.86,218.376,165.557z"/>
+
+ <linearGradient id="XMLID_159_" gradientUnits="userSpaceOnUse" x1="365.386" y1="171.939" x2="344.2614" y2="240.946" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_159_)" d="M359.018,181.556c0.949-2.313,4.176-3.272,6.421-2.571
+ c2.354,0.732,4.128,4.052,6.852,2.441c0.854-0.505,1.794-1.634,1.348-2.683c-0.435-1.008-1.702-1.561-2.639-1.948
+ c-4.786-2.01-10.259-1.912-14.848,0.538c-1.771,0.949-3.412,2.29-4.278,4.146c-1.052,2.253-0.464,4.222,1.485,5.688
+ c1.706,1.285,3.739,1.875,5.782,2.392c0.822,0.207,1.726,0.503,2.54,0.938c3.183-0.361,6.069-0.898,8.662-1.623
+ c-1.773-1.543-4.819-2.036-7.065-2.646C361.214,185.67,357.886,184.306,359.018,181.556z"/>
+
+ <linearGradient id="XMLID_160_" gradientUnits="userSpaceOnUse" x1="332.6799" y1="161.3398" x2="311.5294" y2="230.4315" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_160_)" d="M346.19,176.741c-1.972-1.413-4.771-1.407-7.085-1.193
+ c-1.288,0.118-2.566,0.37-3.795,0.779c-1.364,0.456-2.669,0.93-4.135,0.906c-1.128-0.019-2.087-0.716-3.11-1.104
+ c-1.31-0.502-2.694-0.809-4.093-0.907c-1.272-0.089-2.581-0.018-3.821,0.303c-1.347,0.347-2.599,0.985-3.993,1.119
+ c-2.551,0.244-5.455-1.25-7.801,0.198c-2.307,1.42-2.799,4.262-3.594,6.646c-0.255,0.77-0.51,1.536-0.763,2.305
+ c1.946,0.332,3.863,0.65,5.77,0.95c0.271-0.656,0.565-1.295,0.911-1.911c1.718-3.05,5.729-5.265,9.233-3.901
+ c1.829,0.714,2.521,2.577,2.179,4.434c-0.189,1.035-0.569,2.04-0.929,3.039c2.079,0.272,4.121,0.521,6.127,0.747
+ c0.193-0.593,0.389-1.183,0.576-1.776c0.755-2.402,1.832-4.563,4.029-5.943c1.803-1.132,4.296-1.623,6.274-0.638
+ c2.585,1.285,1.929,4.247,1.227,6.475c-0.306,0.971-0.612,1.938-0.925,2.902c2.224,0.15,4.383,0.266,6.479,0.339
+ c0.567-1.771,1.115-3.544,1.691-5.308C347.444,182.748,348.816,178.631,346.19,176.741z"/>
+
+ <linearGradient id="XMLID_161_" gradientUnits="userSpaceOnUse" x1="305.2522" y1="152.4683" x2="283.8183" y2="222.4857" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_161_)" d="M303.511,167.562c-0.36-1.168-1.658-1.318-2.708-1.16
+ c-2.174,0.331-3.378,2.125-4.105,4.043c-1.647,4.329-3.001,8.8-4.402,13.228c2.078,0.396,4.143,0.781,6.18,1.15
+ c1.551-4.686,3.104-9.371,4.657-14.06C303.464,169.768,303.835,168.61,303.511,167.562z"/>
+
+ <linearGradient id="XMLID_162_" gradientUnits="userSpaceOnUse" x1="282.7883" y1="146.2827" x2="261.7765" y2="214.9215" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_162_)" d="M279.927,178.243c0.826-0.975,0.095-2.17-0.32-3.141
+ c-0.439-1.024-0.714-2.195-0.402-3.291c0.683-2.417,3.825-2.43,4.651-4.655c0.899-2.427-3.341-2.408-4.659-2.118
+ c-2.379,0.526-4.335,1.965-5.941,3.75c-1.693,1.88-2.862,4.337-4.831,5.957c-0.851,0.697-1.952,1.309-2.418,2.357
+ c-0.159,0.36-0.194,0.717-0.163,1.073c3.784,0.841,7.536,1.658,11.248,2.442C278.087,179.879,279.129,179.187,279.927,178.243z
+ "/>
+
+ <linearGradient id="XMLID_163_" gradientUnits="userSpaceOnUse" x1="294.2581" y1="149.7964" x2="273.247" y2="218.4326" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_163_)" d="M288.667,177.878c-0.3-1.753-2.064-1.77-3.43-1.273
+ c-1.848,0.669-2.814,1.892-3.462,3.73c-0.136,0.391-0.282,0.781-0.419,1.171c1.991,0.41,3.965,0.805,5.93,1.195
+ c0.127-0.365,0.251-0.729,0.375-1.092C288.038,180.528,288.873,179.048,288.667,177.878z"/>
+
+ <linearGradient id="XMLID_164_" gradientUnits="userSpaceOnUse" x1="294.8293" y1="149.333" x2="273.1385" y2="220.19" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_164_)" d="M291.243,166.296c-2.219-1.479-7.096,2.231-3.918,3.736
+ C289.356,171.395,293.643,167.891,291.243,166.296z"/>
+
+ <linearGradient id="XMLID_165_" gradientUnits="userSpaceOnUse" x1="257.8372" y1="137.8828" x2="236.4768" y2="207.6601" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_165_)" d="M242.406,171.526c3.845-2.247,10.615-2.931,13.935,0.658
+ c1.487,1.604,1.817,4.604,4.648,3.759c2.125-0.636,2.779-2.368,2.34-4.456c-0.527-2.486-2.408-4.449-4.566-5.666
+ c-4.369-2.46-9.845-2.12-14.514-0.796c-4.294,1.217-8.162,3.684-11.25,6.893c-1.124,1.173-2.15,2.446-3.067,3.792
+ c2.661-0.205,5.331-0.341,8.002-0.394C239.215,173.815,240.714,172.516,242.406,171.526z"/>
+
+ <linearGradient id="XMLID_166_" gradientUnits="userSpaceOnUse" x1="220.092" y1="126.3511" x2="198.8581" y2="195.7153" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2417 0.4947)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ <a:midPointStop offset="0" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.5" style="stop-color:#F7FFFF"/>
+ <a:midPointStop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="0.5" style="stop-color:#D9E8ED"/>
+ <a:midPointStop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path i:knockout="Off" fill="url(#XMLID_166_)" d="M202.628,171.224c2.365-1.145,5.081-1.499,7.681-1.248
+ c2.254,0.217,4.628,1.04,5.939,3.001c0.608,0.912,0.968,1.997,1.755,2.782c0.843,0.846,2.133,0.456,3.095,0.073
+ c1.95-0.775,1.994-3.115,1.453-4.837c-0.691-2.197-2.432-3.919-4.403-5.03c-4.367-2.459-9.84-2.12-14.513-0.797
+ c-8.675,2.462-15.359,9.874-18.052,18.339c-0.124,0.4-0.238,0.807-0.346,1.218c2.617-0.811,5.346-1.61,8.161-2.383
+ c0.751-2.209,1.853-4.303,3.32-6.103C198.358,174.236,200.281,172.357,202.628,171.224z"/>
+ </g>
+ </g>
+ </g>
+ </g>
+</switch>
+<i:pgf id="adobe_illustrator_pgf">
+ <![CDATA[
+ eJzsve16I8eRJnp+9/P0PcDH411pbVH1/SF5NQcoAJJmJUsjaTz2zng17G5Ios0muSTbtuaO5jrm
+xk5kZERm5FdVAYW22880U91ik0CiUKiKeN+INyJ+9pMvv35v/eL22eG98iJbPX3ys58N94fLx9v7
+D1b449Wn19evHh7v1Y/e+erdVV5cZOpR60+7b+mRvz7cP1zd3nyAv9O/3avnv/PZ5av7w83j6pPb
+m5vL+xfvrt6psn++fHwcrl89e1c97Jurx+sDPPDucH/18Pz27vDty8urm2+vb7+/vXj44/fvmsOB
+7beXj/DQPH+/fb/IsnpVf1C2qy8/Vw/Z3L66eXF18/3m9s8frN4rik791a+KqoY/lXrEJ1dfHR6m
+H7a9ff7qJRzxl/e3zw8PD8Pt9e39wwer4cfLm9Xnl9/Dby5Xvz1cX9/+CR69/rT+dn91fYD3+vLy
+cdXhO19/mhffbl5dXb/41auXzw5wFvK+w5+X3+J2//QA+8CW6nv8efvtpy/hR18fHh/h2ODV8AR+
+9fFmgNN++xIfCD/E9c6/fHW4+8//uIfH/+5d3vX+9u7l5f0f4Jnv5X2h/ipXRQbvK+MX/ubw8u4a
+Th++8e6iXrXwh/7PD4E3Quelyy/gBMNGZVtewFZ9e5H3fbeqisw83J6owx+vDn/6YPWr25sDnZP1
+/ePXV/+uPqsG/qMffvXq+nD/TzdXj3CY+me9Ph+f3744XMNj7ZP315d4GnDl9m96xDeX998fHuHj
+vL1+9YiXXZfx7+Ccf3b540F9ZgW9yBd3h5tvbn+NB/lemZcXdV8Vq7JuLrqma1fwXqsGjjPLqlVT
+tKsCX6uHH5T0yjn+hI9Pbac245cpS/VpfQkfyBf3V99f3XzAD22//fj+6oX9VNti1em/8M1cdOJP
+z3/omOEMPD4ebviswBU1fC6uj+zi86/Vq+5uXgy3L9XH8IB3wQFeH65cuHvot/Yf+DvY4tUdvQ/8
+wbfwqX15f3WjNn765Ff6d923X16/gl9+fH/76u7Tm+9unz55R1uCLy8ff1htrg83Lx7gVoYPDj7T
+1eHPj4f7m8Nq+69lnX9/f/lC/X/14rD6Dm6Lw4M2IvBw5/cPF5dXd+9OvNw395fP4cBWXzz7/eH5
+I2zxa/jfLRgKNAf+v+fs+KU6rfc3X9zod3L/6uGH1Te3t9fhu9GPV3f2Qb2Xl7ePV9/Bo/QPLu8f
+rx4er/7vq8Mb+6JwG814QX9n82H9jbzkcHl9fQXX1N0PV89nvOpz+/Dwld1fznn1r5/jJzv/I736
+7rtXD/YV6d9vzEupz+67q5sX8Dpfv7p6FKfm9uXd7YO6b+1J28Gr3iivv7JPm/NOtgdlF1b616k3
+sbv54+H69u4OX4i/Xx0eV2g8vkN/O/OW//rHl89ur68eXsJW5nv7NuyP5mwGdvn+YI8d/wn//+Ty
++naWJbi+BBi0wl+Eb/3LAxhiwEurFz/eXL7EK/TFf+fjVE89PP5G72xfq/4WrLy04u+99/RJm682
+N9LMfwxW9wq8BACtfwIg9vLwYvU9/Qi2CX8G/qlabV48ffIvT5/88umTal9ndVGXdV03dfv0yUf4
+03yX74tM/SnyouCfZvAj+KNXjj/N8Beb9abfdJt2U2+qTckP3xbbfJtts2E/7IYt/3S3htXj6nYd
+/rRa/ezbzb1+4Tbv8j5f50O+xYOAly/Koirqoim6oi/WxaYYim2xK/ZlBh6/LOuyASzTlX25Ljfl
+Fta+yqq8KqpS4b6qrpqqrfpqXW2qodpWu2pv3lCX9fhnk63hz4BrB4es/+yzfZ7lOf4p8E8Ff0r4
+u8zrvME/Lf7p8Kjh3eCx9/kGjl/92al3YV5NfalTyH9n+HeOJ9X9mx9R4v9Lc+Llo+BjcX5KjxQf
+y27YbfBkd7t21+zqXbUrd8Uuh3e33+622+2w3WzX237bbdtts623lf7I9Ac2DMNmWA/90A3t0Az1
+ACdzKIdiyIdss9/sNtvNsNls1vz29sU+h5Xt9rB2O3gBfP0NfeAdHYU+Dn0keCx0NPp49BGpYwK4
+hMelj0wdm/pszbW472F1uFpaDa4aV4WrpFXgyvXx6YVHqY5zp48VzpY6Xr02fNz+5UkfYZlVWZ21
+eOms9aUCn4G+NOq8dT7wDD+ckp6ln9ngH/X8Nuv4A9Of2X4Ph7XdD/vNfo3vUL2vCt+DPrfqaAdz
+Fvb4NvTj9TP4OQ2eBXz34tH68eoZW3zWQM9Uz13r5zvvGYxEdlFWed42AGHV7VYCdL6AK7MvCoS6
+bZb3Ta6wLv3sos/6DgB3saozBb3VTgrRfrt4o80DHo3+KWwCe1UtbtJ2Vak3KXq4R9UmRVkXCLv1
+o3CTPr9oa3k8S7fSRwRXARy6ejYYpFZTC3h0UVf4rKrP8N2oJ+f62aXaXhzIqTvg6xsypRb+Eqhc
+Y3dP/F49d7O1noYdyUznssqLLOZg8OfwQqVwMmQulMFQJmOD/kJ5DOUzGlg1eg7wHZtiA4YTzLG6
+GtUdqKwBWKH1Zq2+eljdGm6wdbtu1jWsal2uwSms83UG165yK9sebBZsv+7VVwergQXEsIfLqgfj
+DCZ/r6xRt+0GdQjduoOLvlNfLdDGpqu7ClbZgcMBw67u0n0Ltgts0dBu+GZq67Zs87ZoM7BpYKPg
+bazVk5u2qRtwOU0JDkLZoh1YL/UG+7oFF9vUFThbsBJgn3bgj9Tb7uHlgDaDl6rBZym/lcN9Cxay
+BHsLXm0Nvq1FL1fDXQPuEC6STFlP8IMbePPwtooW/KPykhX4S3DaYOnA74D32cLpXIN3Un8aNE/w
+5Fx9ZWC2Bvyzdk2Q8b2Z433bqP8t4IgqzwcPYKl31gvDO6vIC3fCDyvgkSP0qDT4qDs4R2s4UwOc
+sV29b7Imbwo4jxWctgbOawcf5BrOM5g/ON+7Zt9m+AmUbQWfRtO2bdf27brdwOe0hc9r32X8aalw
+AH7CPXza6jMf4NNX18AejIy6Jgq4OuDg4DppetgErppeXWxwHQ298ka7fr/O4CrL4Vor1+AK4cqr
+4RqEl4MrssercwPXqbped+v9BuAEXMcFXNElfMQ1XuUtvHAP1/4a7oAB74fdZo+gIx8KdK7lUIGj
+bWC14HbVhbyGW0Z9bcEvga0GPJUbJKW/9naxc8OVi1WIVYpVmQUXKjiImlYjVitWJ1Zv1lqsjVjw
+OZGLwUMXyzlo9eU7WvMZ4qcIK8e7scQ7s8a7tMVPVH6eW/o8M/o8S/o84RN9+gQ/0R4/UfuZ6k81
+w08VP1f6VO3n2uNnu8HPdjCfL3zCcAXwp6w+5wI/5wotGX/aLVq4Dm2d/tQ3+MkP5tNXC06UAQxr
+uiN3iDlzvFfBVMCd2yHKXKsX03cn3p8F3Jvq/mzgDgV/hdZgA3cn3J/q7nz6BP4u0NeqO7SGe7RH
+e6Lu0KHcAR7Zwz2qbI66Q2u8Q9U9usF7VOE0dWnkcI+quxRuw6dP4D6Fk4pvU92lO7xccrhLS7R6
+6kEt2sE13qsbtI2A+uBezeBezeFuVQu2ca0OWVm0sXDye/h4W7ina7i3S3xeBhejsrQDWtoeLW2D
+trYEK1HAMWRkbQc4NrBpcJQd2twabS6cIngnGdrdLVreNVreDt51A++9wvMAJ1udFbBf6gyp21dZ
+307ZXzib6kRUaINztMF7tMFbsIjqzCtL3MHn0OLnUeFno75yBOfqRtyhRYbb3XAkDbcZcDPk1qCb
+YDcsDbsZeO+MJ2U/2qIfBR8KvlZ7UeVHM/Sj7EM36EPJgzr+s0T/qT2o70PhPJIXVVZR+dEa7aTy
+peRNhT9VHpV96lo9ibxqqz2rA0T3jhWQ1mEQS9oTaWd6uWBHaZmkxWqcVTurEqt0VoF0xq7cW5m7
+dvtgia8QULcE6Kq664qK0F7OYLRm2KdBsoa/ADfhlhCQ8fQ9NGitFKxFCA4fZd7QBrUB4fD/rEPA
+WFUXcPV3qzq/AGxUiWM4fQ99DMe/h7a7yMCQLzoPvMdyAFwmAHCpoiwGAGv7hnZ5RzGLCsylQksq
+XgFWGDGfQkja9irLuydspJBRh/Z2IExUajQEGEijIUZCGgdpFMQYaE+eU/tM9pboJ514jLs2ZjEh
+3hKdl/9KLCTS81eAYdgr5CKGlApIxMIRZA8bHYvSdhAMhraAYM3I/jWGOzBz2BrW0JGlY8ag7Ruy
+BT46vp0zSfSZ7ucmTGbDZSWGAAoMAagggF4Agc3/9fcqNACeEQMEeqHjhP8jEcHV4/cdoIWe1pqW
+imTptaZoFpwcFYKDHfW/tmYppKHXls2YWurgDYTM88ysIrdf4NLgEyrMKp1VOat2VourMauzC3bU
+cTR/rYO1iaytWINeyGV20RWYdAOVc+2vI6tQodBi7KucXLW/YMfgZ7TayGomFtzssGO3eK3lgh3X
+512TO26OXWhhz7r+q+5ogpfKain7g6wE73oV8e7xXlP3iWIemnUM6NkKZBmKYWj+jxF45BTrCu5F
+5PzKq9Xk1TTXZ57PHB/4Pfm03DB7xesFq9c+DThDbVi9z+gLw/6Yy2vWxzxes73SsHjk8OAdNsTi
+mcMzi6+IxVtOJ3n8VvM4ZPJqFczlgdXXhtG3gtWvkdlrbq/Y/RYZPnN8tZQhK2ip0HeFC3bEcHit
+aBWGx9VS0Ls3a01LHdhglv2y7ldRcXBh7AgihrIQqxSrSi6AKbBjHVnN5GpTC3ZM/g5TC0cv2HHu
+Y/t5C3ac+ci/+o4h5jt5RRHkG7ejxJQO93QZp880e5Fm8hNNhk9i3MznkSF3jLFF+2VvykGld5xE
+lElH0ZKfqLxO5T0h7yr/jnTv19JZhbN8a5DZpa3Gdh+sEOTHvoZwgWUbtpvoWidXn1xgEzGFmF7t
+5Gr8BTsGP6NVn7DAosOO1eJVygU7luddkzsWxy5kdmdd/1V3NBE1ZcWUxWrRGoHdQfsyoL1Q9kDd
+6Sr1rxPt6s5R17e6djTD1vxasesGcUtF3JqZtVB4ACLiyKKOKWpGLfm0z6bhOg/ZNMYIddatpoxb
+PhIH9iLBT58oWOVEg2PxYI4IbwBvqogwx4R1VLjUUWEdFwaMqmPDOjos48MNxsdVjFhFiVWcOMM4
+sY4UbzFTp6PFKl6sI8Y6ZtxQ1LjCEFTBsWOMHu8xgswx5IEw+JpyepqJWdanOCGcR4osl8Q5c8tY
+ydVoYy2ZsGbImjszq9asu1VyBYeTM1Nn/s6snrm+/aLIgAyE6gXOVscVbKxhEPGIjYhSyNU7q5ML
+tTptsJrIqqOr8hfsyN+XkysREHAXCqRYj3OWhQqfPDvjlxerekN39OLlqFdQwgwM5LZAILVq/AJu
+yazv4B+h1uSI55CI4iIHI1K0VuehH8/qD/34urloq9wRVxz1PPVaqDhvLuo2r1ZeSD3yq8VR6rqI
+R6nh5zJKrULUOqkfpvS9hH40nb8LE/qYgrMJfT+l7yX1De3npH4krf/0iZMWzjEQUA==
+ ]]>
+ <![CDATA[
+ Ylq4xhC3TPLHUsI6xc9hga4HQmTS/IOXEtZBAh0i4KRwR0nhtUgKm5SwDhnAx5UFKWGZEO4jCWFO
+B8tU8AYliRsO4dKfLQVslTxxp4wv/slJqFigoa6MSLEimWKDRp7TyC2afw6tbkhuSXJFTi5jiCdD
+B8OhTZ1srtARNRi4bNFNrSn1PKA0ZIsuTSkNcryatNirwmuqRiFLhy5yjWKRjU5FK9kmOMs9WuQc
+r7MC3W2N11qDbrhHtzxggmSLqekM1asFOnL11WJgSYWW1iruAlegwtl79AwFXnklXXkNJqmVOkAn
+qQeTpM4pSV2bz4IloVtyYIPjvKTDYqekNX4VKf7YhZB482/DCL9ZOwpZqyNYVdxjYYYIbtjc4NnB
+QbQn5Yi69dMnR+HaGfoGwLqeviFQN8S0Da6yQeoa4BhZ1yA0Daxo0HoGrWbQWoZS6xhIw2D0CxR1
+oCiDiSdw7IAjBBwFGIjhr5mhG5Zt2TDzydyox/cYDNnS57vB2KnWSLBKosEoq1ZKqE+c1BLqc4+q
+D6X+0FcgsnoirkLUOUTWUbCSgrUUjprC0VOwogI1FUaZqDUVYEpJV1EGuoppZYVRVRyVd52x/go7
+Hv1lVHBn+1q2YyAY79FdbEnRVVDlAGu5tqSytBpLobD0ZOThl64esOJyKSzXdQ1GnE+ZaBagV/io
+xuSVO5FD3higMTCbM6YXg591qEenOoPRKgNHs74VGndWrNdmZ7u33R1rCALdu698l9p3Ur87VQm7
+3fYschxH1n7a87UEJke1u5DQXGS13k5xCE1VWAivFOGoSWc5D1AMKYVZvhfp2RVzwfch9fm9pjlW
+RC716zOfsZzMJCQ3NUpuCkFmzF3C6gutsmjp7ugxq7lBYKfLNzLUW2rFQoP3KMNjBY7hoOle5buV
+71d7x1pVtNVFWxoltdFIpuAq1HRKEiqXUrmkytVJh0pphRKsWroleLs2GVUmVyG9UgRLUyydZTV5
+VkAyVnnLultNsNbokUIVdelTLNLckuoWfN0ORcNMsZhkMc0KSVaMZgnVLWoex0lWnGK5tjQ3/5eV
+WFa1w39b/U5tlDus2mmNXqcjnc6arrXeWNe1UedYarczf+9N3RnQOrjmMkPscoq+laS3YW2NoXgY
+xesMsesp5qfp3QbjgLomADAcFfdlFDt0SR5f3Y1RnXSo/WeSt0GEuMPrHT5PhRkxTKav+wLRpI55
+jhO+nVEgO3QP7osG74YWMewa74cNJjpUejmL0r6eSJ/WJWO4AUmfOjEl3RcpdfIe7wuf+MmSLOlu
+BsoPsuOSrku6G3Ze7By5DK/BXBzjZFsAtxUFeZbhWI5jWY7kOch0UGXA2NdVCTPfcTVxhcN4Qs6j
+6ht83hNjPvGIfpT7PH2C7Gec/4wpvC3/SSu8pzhQwIJcDgSc6CQW5OiZXRWzzSf3QcmiW64o8saw
+o8kYW+DC2WGRD7YZYMnCQh6Wi2ytzchaNra2OVOfkYn8nsPI4Jrja9GysiN4mblGDS/DOuI4M5Pc
+LDfK9gg3c5kZXMUhN5tiZx43E4p3uNrBex2jevcV77GviHg8srwkO+wYSb07yvn42qQW7Biq7GOr
+H11Ch++p8kNtfria0SUrlMJVjawytWDH0lH6+ystFA2qAPSCHeMVAdHagDNVB5yLjvilotVFlyGY
+TxaTmkcsh/ZVAtpXEWifC8rbIrhK0WwNg/ySRlvQCNAdIIwE7wUJ9Bm29wjbBw1XCKq4OZAeo9Kc
+AwHADq7J5kFkaaOE7DYXUnmgXUMTnRGhnAi4z8zJjCjw7sN3LfsfWCjplc7JLAmAeAxS9kEB3U5k
+TDSk57wJw3pdINlSQR2XScIC4zjQ2hqF0p7yKZlRb2vAz6Cfgb/OsOjCO00BYKFcvzdkwBICLscb
+hBaIyAHnYUxxHlMFXHCRlrQqs2qxGrNasTqxenfBjv1m7Sz/awhWTOVklF6w4y6y0rZ77xQRDl6u
+aBfNFeWGUpSULdKEgv+uucUFUAabN2qjGSSbR9oQ0dB/bzV1xnsPaYe2m3C/xelH5RAQS0MaBGBa
+DMFUhLNOWPJIMmjOP22Fhk3XvGYOQdElkSWJMrQ4Q5dHtnjXw8LwOJOWNV0yiGJI86T1crqKNjNZ
+qxyLeQqi9SUCz0rf4EhrWkNrOqI2PV2EA60dabr2Jr/FZKfAQkz9HabFwMpUJGVRFEivntZG31T1
+QGtjVGfsMXdGM8HVAzkSJV6VWFpao+mTXT1Sqc4QKl5aloMLdtx4SjnPq4eqjjaPrJIXWMIysurx
+NaPLRjquyb1LRmKbBJ1jSalYWspPTLmpKQC+YANqryFCSNZsisqSNZumYrpGhA2sczXeBMG0QKgN
+dZMNEJi8afoGBA4+idYTZyGRo1SWpnL6SlhjKKrDq0ZfSZUUaiG1gyuS8rUDpbjWeCWzZItFW7aY
+l4VbewyVsXCLpVt4l2FbBSngkhIuK+LS7RZ8IRdLuTq6yNRtUZsy4IqsCEu6ctIKubIuLeyS0i4t
+7hICL7BerSfzqqmAmKVeVu5V2KorqT4SuHSHYR6r2t1G1hBbhqxIcmrj6AWDXoeSDk6XnxgdBTsl
+6Gg8MThFRl06WpKQkgiplyS0lNSmCi0ptbTUEtMS2y8IekoE1VLULfltTh+uyft3hqr6ZLUySKMw
+CcWcVG97Q153hF0GQ2GZxq4J93QmzchtT5jSMq2tCE1x7RTjrMyQXCa6THaZ8A6I2BjIMNTiL4KH
+hPaYDjMlrg0xZnKMCwkyL1nFZ2USkg9K/brUZg92AU4dOgeAdWtv9cGKfbW8YMc2sprxlaDyR5D2
+OFV3mmRM0vQ5FJ26Y82k6dHlEXOyCcfR9VjJvVkBlR+j7/OpfLjGyP0E4acw3LwVDQbEgwPxNS8O
+5C+wrdOPOjKFvTjx/dcPY1xkVZvVPfcXtqnIYlWW8GTUa9bAaxwl5+wnLQ12AOmIBjvUz/0GjW5x
+XWYgz17Im22BdWHyIiXlDCsiCITfAWLpkESLYYmOLDnnTjboGSmDQt1dOI/CAjrOpGgZnepEwFK6
+3gle2AAG5h5F9rEg0M5BjMYNZGD/nw0FM7Ys+DSSTxZ96m5Afj8gGdIwElBwS5mXo7S9njhPaUMZ
+oj+QIwe1PYJqii23Jl+5HhOFeoGIMiYNhUtK9AoydD6mRPfV7Oo3rs69MQLEytHFt5il1CJFq6i3
+HQXWJGVkWSMLHVm5zyJI2zdAqf2pgwDXA1B9QEliVJai6v/rjGVDvQC4A4ANJWxy+PwpZ7khqMrh
+A/33jqrx82jYoDbBApuz5ACBzltKeWpO8tTCE6h2BP1tzlLmK4Hkw53JNL9Gil87GcuBMpZ7umdz
+6qLkZiv5XsO7DO4jylcqkapLWF3844SmbMDKBrEqky9JAFDVvcqBoIOTQ3H1bTGFW5BFgTtsKo9S
+iZyhm0EZBAntbe7EEFGdRdQaSlZR6jwiZxL9GqHcIaFEQdFStSarKPOK+6BOSFYJcWYx6B2F9NLX
+WCbzi17fqGh+Ea7UmM6yjKwispL1mm6NJhCosDqTKzHDuktRU+lUTorKR6xLd6sRbdZQ0jSmapKs
+RekaUDJJ2Wwu0ZA2Imx5krBtXL0n3Uf2rvFVn/HsYjK/uG5OyjDyvTEjw2hIxxiVGF/RPGCUdBxH
+QjxKAjtOZQ6ns4cONYnmD0/PIMZIxzT5SNGNwmTq5+ULZ0N+F34HetKOlGu66XBumg431Ddbp7o4
+0RX2zbYpLlSmPX2S6toZ7Qi4rXZCUZrbkgbqV207V9u/C/FI+bfb6Tonjap9lvt3abRXrMAqnSPJ
+zlcnd3yhglTITseSx3txezFkMIJHljYYk5ESnvh9su0FLS5VwRtJeEL9xGWsz4/2efITfVou+r7I
+VTGY6ZlFXY7xO1SLOt/hU1pF7/C7roILPLaNJpncSLrsVbVfwBJtCWCSZp64AzejVuxUUUfVQrqm
+Z7dwpI1ipx33ddYHD89uqgsA5N0q7y+apuidZtQLt2Lxru4gbYS4jiK3ZdqMp1Xupt6Wqjgse0fX
+u3izxUeVned4lisUyrJJkPbGJ+2GgEsaLsm4JuQOMffyd5aWAzGHHTeUx9sacr4PyLlLzxujKJDk
+fG3ycoPJyO2cXFxI0LXOoKVAqZUKb4zWYIcCvxRFr4XugEn6mmo0jYTYNG4yigMsi/H1BmunXlOS
+9Nyp2QyrNtemwZNL0WWrp1wIi23Tp0aoAHqT7bcUPVZq7heo116SsxMN/eS/ADVi2QjTcbetn2zq
+t3Ua+jHOdxv36XL90jTrkw36uNSfG/GxfJhb8NlWe2vK5tvFGaY9VYlmlJkqDR2vsS1xQ23sekPH
+dZJCi4gpT68IkWlWLOtFZU6+JSXO2uTgMfOOf8fqReHSBV+htTm6ZnTr1YxWho5LQs50XAa88G7y
+CHnpLNlBzfYkzJx8j5vxcXM+tqhMZnyagFwcQS+w5XWMfBdOcZmVL65FDlhmgQ351ne4I+PV9FtL
+eVnMWzpZ4K0R9EbadIAVCht1rI8h4D79VjXEywh4lH5n4ZpsfZRqeARgDciy39jIp9g+yW5k06CQ
+ZGMraZ9o70aJtsyMdh7N1tNepHD3OKrdx4g2Nad2SiydbGiKaqfKLOH6ObbUMrgTxL1gkPM0NT6K
+Mhtp7aKs3pEZvnl5PkOnExm+SUluesGOJ2TxxvJyiXzcMdm0EWotyHQryPTOKdGMDcFw9aKGSlM3
+g6mOGVTeJchsJgi1T4LtOKiS/l1EvrOPLjCBIAuYdD+C2vxdm1KmJqsdSn3G1jPHUWpJp48n0FKG
+FXQGoJjizN4AxiCE1Nlext5wKXGhpSo2euo92XrEuXLqNoxQhml0p1rKODSa0m9pGo29bnxC7W7j
+0ugwz1qDzy7nMej5TybyTHwt033iM28MlJrEhGlYPOJx7rxwJyKpeD5T7LLiAlpLM2m3OHVevtni
+o8rOczznoM5tgjq3AXV2dZudWD4tXpuEl0+NBTk2WTUL512KPEKSHRH+jmmykOIXRn4qM9mdIcrr
+CFH2M9lAlJ8+cahySJRtO6MtEeXMSPPdpka2rZFPlXdJqizF97b21iPKALXGqXI9iyo7Xd2I/Prd
+3yzx5ZrZjfO9IMOmrz13mxN97G1OmihxTpS4MNlplwzj/wEI6D713J2+Nd3yrNRd0mIrcd9pGSb9
+bWjx0yck4KwoRx0SY5aybwwx3mpiTBnqHKkL0+KKugq2SIo7kqkG1Fg0Uoq1UnKIsRoEit25Y9S4
+9zLVE9TYa74r27UOZrlSx4jY0ZJf2FEKHYuAAs8F/gb6k0jR77HiZ6HtPLhUFtoIosEm9KamNZaJ
+3gs59JqE81YKrfPQToUrhvxYAM01rm6Vq1/nGuv2I4gw5noWU+GZ3XzT/XtTPXrDnrsu4fUpb2Gi
+UV5uGStTY6Q3RXvH8stIe2HHtCg4RXzdvkJuZ6Ecm8TNzjKfpL/w74D6tVLfqarScw==
+ ]]>
+ <![CDATA[
+ 0F6e9XQmypukvicSXktvA+p7LN0NSK6hvvPJ7hjVnU9uc1RGxZtBZkxtqbQpSW5t7xKDAyrqouHQ
+TzMRR/5b/qYRIXb7GySupu1eQ2F3+3cnO3K4vupoRikLeyIJWbAU8+YR2Tsu5JH+gOIkj4ylX7HY
+IuSRuQhZUnAyzSt71UgIv8trVL5nTCixwyl+h9TuTSOUPF/YGaPb8JSyjinQHEa5dCseDaxO5YrP
+JA/25XHDvXk/41xywS6nH0e28AjOQRu7BG3sAtroFPGaqkdLCy01lJnTzCGHgh4CbYxRxA6hm0sS
+ByeTmsqlwo4mmxrLp8rmS0bw7BNFhyQ2NNbW9ryVsuedIIq+6Lnpmz6s4Nb1QJPC54jsOTIelYki
+NtcMc6pzqOLGWZr++e3EN2aEmRxpZqmgGGqmmikZIpgTEeSWSixVdgeYcTt0KVRmOghUEB1p54wk
+07XPWyFbHqgCb08Vzxm9bGGkywUytIaGgbWm8VJv8qW2u66ub94HLZd4yGtFxbuGGlIdc4QcRvKm
+rWm7ZMmh32lXVx275PA4euh+9WLZkq7WJ4GJajc48ZgDCqlgCIVH2rq4ZBDuqzAvamTJwYDwKCE0
+dBCFyTguPKyQDXOjtuFRKSpjd6ImVtPBFss4YoNt/dZHsQawo82PTqCE8wazpIeveGNUzIircLxJ
+lPolhMWC/AEsG6N/XuYzJIBOVSj3aIhRwLVXFRrKjJ3cp6SAcB0fnf8cz35ib/Pp6z5GA4+R/s6g
+c7PEwfMymkTyEuLgY6TCHtWDHU8mfPEMZ6IicTTHOZ7h9OsHj89yYvebUBac6vy/Ia9hx/l5eUwc
+67cjD2G7/8tGldajc3vELvKdpWr2N7aNovudbm/bGZ0UFyx1pJXiRotww3p07ziCJzW30YQhtixL
+EDw7cpbuqVBVOyRJXZto6Ba0dBN19DsRiqOgm6F4WkRrKZ7WWCEzKNpKNSxiiqd1pjp7qChQ7Pl/
+TYrHv84qRcyYlzEd66jhLWtARyne0q2ogy+/FX0maRsr12UiabaJUrwlu5x+HNnCIzgHxesTFK/3
+KZ436EcMETYNbPzWNbWgcA01rTEV/ThB28/3RTN+oj+om/OrKOdHZA5gXjzvN0boHErn0zmAotyc
+yzbmygyh83N/EUrnEzqSTMVksn72L0HpfEIX9N9NU7qIji6YIWUzdZmTr6O501LICgSsNLWlUtLK
+06y4e1DnCFu50rQXWTwib7Aj0zcxJ5pbrAgCVxJ9q2ims83p6SnMhr7hpOPBVJ/6BK4wFail6Zrb
+YAVqaypQe7f5lJY4UvzVz++1mN/rohTOZvc8Agdk4jgKVzurEqs8ohmJbEOymaBqI6DVkDXRgRPu
+m3j+zjY0GiVsoZQVrIVXTRrJ4Y1Xk3qEDXOuct6c7VY7k7L5hA2rnOdRtlnTLsNplSlKJhryjBEz
+n5rFM3Pp6k/Oz0UrQJ38XCRDR2BtjKB5WTqHoLny1A2VExydpxvP0sGd8LopWlpSei56Nl6/OZec
+RciYQ9FOI2ZjTWOOo2WJTFyiIcsYJfMzbj4JS1Vnevk2pmBYfhSQMNt4VNCx1lCr1lArS7V687fb
+xb6j7/hnRLhwaBl3tLd97U0DSteHHEW+hF4zlVvDkoyAfNmu5s6UnDHaNanHdCkXKiKs4iFoX5am
+YMCjsyZKwRr1A3wWzuh40yiYSvooOaWdLqJ4E/XOueiITc2iYEu3IuqDpzKgLngaV2bSySQFW7DL
+6ceRLTyCM1CwKotTMPi5T8FqZ8mv1qNXvbPWXr6MMmawo5c1E1RL5M6czJnMnXVO7gyoFlAwn265
+hKty6JYkXJG2QYpwYeug3KFcbg7Nr0vcWsoVyaBVkdZB4TzJGOWa3TpIN9MnI+/5JyBcwfheb7Cv
+zoHJ7wtq41MR5WqojQ+PDa6pelDnxlqRI+OWPky0ZEufnRhJstWdK4lmcVdgTbEKmSETBKuN5sf0
+SJKt6fqrKwp5LEnpEKw2TrAc+aSC4cruVqYhQmsElHYa5S4gWI0gWBuiVztLrrDyrSJ6pUiEJ0zx
+JiNLfBXt5Gj6OK49EiWBpYWWLricO2zOkqkKRcsm/0UdYm1jnnFCFZNEptvzBIM/EvWB7vAPJFTw
+uS2kVD6hQjFvnFLVwaqCVTpLjnIPqBPsGNKnFIFahwTKo096qHtS4hhmuEb6nhr6BHYnJXOcqu+L
+yxxrCi6cTKDMNW6ub7jyvevbUKgjKu7mUKEz9N306FGyKm9+B84lfTdnyRaXtcCJ5bCIQo1QpghJ
+2pDttiQprLnzRYmGIGEAzI6OcuZUG08qKZD82+abNma8l8k/Od8NZqbzlkoXmB7x39Sn36NKpw26
+Teal4B5Ljrk1NCnMRKVJUURcGGaixNDXTgScMN9PFCnD/leCIlHLFx4wKCgS//uiz9V099jzPYqk
++riUIdVRmHomTzpuByJL1FXmIpNtTBvC9/Q+Vnzw42Rp6VZEUnRTFDm00Xk2nk+5TZwsLdjl9OPI
+Fh7BOchSniBLeUCWQgK09nJNm5AS+ZknMyABHBlRIjcDVSVokcxCOY1abB4KpzvKZi1+LqrzqJHT
+sCWWi6JJxqkRMTYbtXPq0AQ5EnVoSI1IMLaAHKWokakAY4pTmDwSrzIXrXVJEGglga2oEgMChHLA
+3soDRYaJqc/G5Jpkjmkrs0xmweFgL8hiJNPUyUwTLptn2lGeiYefYGMVcJ2lIUI1pUs517R2qNBO
+EyEv0yRpUEsdMONUKB+hQjtJhcaJkDNrR6oF7ZfbqN5tUu+SHQEHPcIzMsNNkh5bA2ZzSBhykP1I
+59CesTxSKdqihOK/SDWYN/XQnXuItAdnzdrJhycQnyTtKYIVzpvI5BJlQ7uQ2ABJGRLZIZ/eBAQn
+oDdIcHC0w1iWaJgt4iMZH8WaE0K+qIwvPS3+NTQyOQPJSVKYCZJzFL2ZJDknNh8hknPG9iMjowDO
+1H5kNNOjaYyt1+W50A6JEVmenal7L8REaAzLBmPCdmLeO48MkxOJdw5J0ROKDVHh+uo8x1nFLKxn
+rQZqNKQ1P66VJdGXkbwO1Qb7s2qNj4+I5/w8TpKyxAgL2LvGCe5QGCdJYYpCAVKkMJjVEBQG6YSW
+3HG91RtJYSrqR3mRiaREQztddPgG5zGYpTvp4yn4cWJcA5/OFZ/NSQKzZJfTjyNbeATnIDBFgsAU
+AYGRWpCdWIEldua2FU7/SJG7wSoIn6j49U+D0aN4ZCWSxamwRXxjMjk+XRkSdCVeDdWaxhkx+dwu
+2mMyJCzB0HrU9Z+HsEjNY+3QEEtHOrGYjEjpW0+EZI1jFiQtsbVLtmppJ2VwhqIUgQRO/19FxzlL
+49ITztLwlMYEPXHGxyM9waYF/jCGQRIUHMeQi1ommafpiJwIehK0uvAJynAkQZE8XzZvrczi6ViF
+m3Exs7B2Mu9i5l3ZyVZpKhKQkUgGRs/pa2bTEbdLo5+F2ZnmFKIayUjb4p0aI4TEpyPwOZ+JkES6
+E+yCJXtVDBHCYSkH3CUB7YjXDcXEaQ7xYOph5rvOmywX0I9QpBYd5xHPsozWEZ2rnYRDQI6p65lB
+JBbKyiLkIlH5My0zS5IM0QDi+E6H0QzKeAOIkwiHJhmWYjRmJu0QrelpQimZJBiAFxozv3rNQnoh
+/TZCMEkiqEKX6cSOJxRbYkGEIqNKXUMrxGChkoNzHtk4otUfUYyIcEzmRizBoNmqmFknqjFNLWIS
+sdiMy0rMuBQDVJQtY6KBwimHaKBWCokGaqks0WhNC/1OSYnq2PPfDKLBqYwMj5OeXeuWAnD0zB70
+wY8zjaVbEcRnAZqjT2u5v3xHm9tt4lRjwS6nH0e28AjOQTXKBNUofarhoNhCLH/Mc+VQisbQCY9Q
+wI4y+xGpw3GkYalqHCsPA7czmQdxJWKWWnTx+XJgTo5ptODW5dg8iJgxR80WQmIRrcpRg+kNteiD
+tTG5Cy3iGkzuwhIGK+caDGVAMRcPIObRxDKrIdrF5zTYuCKBl5R46QvAzHEDatHTAOXBbR9PNMK2
+QrBCrzqY6MatEDYIObdII3amiXxmZrrx2HaT50DHyIPad95UN00i1GxF7lOpxQREJGiqW0Gj1Gsj
+lFx7VCI6MFeMzPVH5Q4ma8FDce3wWz3olinDGGnwaYNt6m5zGNS8gO7UMeIQqYgJBFy2q506Z2Eb
+A9nZTlKHMqAOm3M2MhjCr4231s7qR6gBQA/YcYwgMEWIZScSIiy4w0Oa0G5SlSzTtSwDjcSYbjcw
+W4yFgwdiDQeSlVuLqMIIGRihCkeThBGqcAJBmNEk4OQ2AcubBCSblQfCKaIDARkwVADnweKwmYEH
+zWgtw0fcdD3zIL4F+rlpysOteSpqzsM1nzy+pKbQl8rBt6ZNDzXpcSjBzO5shgYEJMClADRkoyHJ
+IeaXKS8aFuTHhttHoT9JQz3g77Q3ga80FWiVQsjpEM5UwHRt68xjElSgLWqFCCvZ78sCeS6NH2EC
+J21ARMDAVYqBa/SuxzHDsc/kAAt2IdiNJ2llm2dr2MzlMR3/egL+L9jl9OPIFh7BOeB/lYD/VQD/
+Zc/vRqw2APecMeipRZSF9zZzoCQZPtAPob5fCSLAflgNgj2h/J5qNKdKwP02AvcH0YBbgH1M+Uvh
+U6yzWkL45AyV9gvxk2X4DuAfxNoYSdJW/JTFSVtbn2G+s2OYqdk1SpVs1UZOLa9Lyg9I6ZIP7tc0
+pnlD8iUN7VUxs5kORfA+M53OqBE2wXsX4MuRzQbeK4CPIpgCazo0wHfHNnOmYEsypp0Co56QqXEA
+voqDy6qOGRC/E0jRmem8FgDeAfEU95cw3gL5giR8EszH4LyVJHmA3oHzWI+Bztr2JAtzAa40ya/J
+CHIBTqH7Jtmu2gX1a8r4eNkABPS6wmc+qO+D1XmrdVbjCYokcAfoDjvGwLsX4yf4Hsb4I1F+rKIY
+j/THhEapSD+AeLAtLogfr6iYITZCYedEAwZnXMrxKwnCR6sgpisgIjD9hEHAE9F8hPFHRfSn4vmJ
+QvJx4L4NoHq0BJzAugvVOWpPEyFVRp8kxzTewhHOShBuobgF5Lr9iv2bIXknBLIb/TfsyB00B7pv
+7Zy9aYguI/URiO4CdC3/7PTkO7eDYaI6wZf6+MDch+UqaCD6DfZDb4C6nsFjgXqJE2oQqLsV4K2p
+++44mB88/U3A6VSIYB6vETY9p+VoOw2VGcXqC3fiabw08Ufqi1qumrYNvXiXKFxfsMnJR5Ete/1z
+YPU6gdXrAKv3Yq3F2nhLYvKdxOMuIkcEU4gSBD8EH+Jyqe7ZOdNjEZfjeI/xQHxvAvH+aJxoIB4r
+tttIiyx/kuwuwOaJnsdOxbaPzaWD2FmkzYsqpHOjxuFgOhcLFNjlseQ5rICWqgB7t1RDbVG4xOFW
+o2NmtOoprTrMjiHWAhE4FxIwEm+DUPtAWHznhNoLN9ROIwQYi3OwfZsOthssbuv2HA==
+ ]]>
+ <![CDATA[
+ JI4dvMexuCSVjVi1g7UruioLEzrPaXqRh7jh3rCY26hvxnA39QF2A+kCd2NO3UPe3rRUvyzAD6Z7
+OhxTEe30BZ6NvbdhOB2vrhT2boJVe6uS2FqsIoav9SAWL0TOGNtF2Sk1jYeykTNHg+XxcLkYWpRQ
+1YCtOHZWL2PtRH9e7EBxTqw9EvA+cQ7oSCj8qIrjWXqZoOJ4cc2xwdoj2DqFpqOh7yiallhaNVal
+uJaR5JOKRQez9d+s6XSD2jyGrBddNfQgMh5HhpEaO6M7mF09jqJlqDuKoiWGxiaVenK0Ge8Swc+J
+sHYMPTvt4DpqBkfMPI2lecBlhjM6BJY2ILszEpk3EUuTYAW8eN2YYDXDvpYbJc3B0gt38oZz0sgT
+DUPNSE3TmWkcS5++yclHkS17/XNg6SaBpZsAS8vA09ZRvssVj2PnhEgEaoY7sTLoxe9uFHY42gYx
+bTkpBLEzxn3Sce1Ur6MRGYso6B1HzxzXZvw80l5Wouci/OIYtMXENUlOrOhERqc7gZHB9hh8bDXs
+tqUrF9u6QhQ5uLEkpGzEKDi+sTNY2XYgsoW3iJYRlUm0LIc4OpM6wJLRIMcIXtaNABtPmhLgZRct
+Yy8eHy+XYhVm2evRouIwFj0QK1w7uvQYOo7HpZ1OQRGpCarU4ajD2PQUQt5FleqEj+HMHoeQJwUn
+2O/KIuQyWIW3ZKpGjr7xUTDiYJpLMYxg4RgallFnr4cPisqySCefROw5qjN3Ys+6u5XoZnXE6M6U
+1nwhJh4VgUQx8Ylo2MPEpyHhSKTZYOLlZaoG/0ZRsCkxTUo+LPLVuDd3cS+iXh07gstP+UAhQuxE
+e+6NGLO7cbDtjv7W8RGSF9LIXc5C5kWpfIHXVW0c68qYcQLrMtLVU4CUTTSYdwzf2kqTjYwME761
+eScxgUbZhjTaNUIOM6yP4G5DkeSLjruKvpFolxXHPHVAg1TVs0X1v2y5EeYcuLt0K3+whFSLNNxc
+h/XkE3j39E1OPops2eufA+8mhrtXwXB3Z/p3HqzCQ7RxlYYdj86ibD8qLJCth239genBJDycmeQ3
+q9lTbNhGhl106zSsMdiW0K2p/4xVgM6p/0SDYdBt7a2Wai0tdu0Efu1pwHhHTWJYQs0yat0yfks4
+VkR6RV2mHFGgVReNaB7TikEFqLwAdBtBsk4/TVul2TgDyVlevUEkuyccqxpaFwGSXYuObXuT08zN
++A85tVF9RF5e0eFXlnkNDlaVkdyeAsWMVy1iRcwKO7pR3TRutYoKOektwK3BAHC36Uts4lt0gIBF
+rvjJLMKuDnLN3BV0mt85a+tFaS02JXQq2vO7CNWN2IbyZl/gbGK23kS1I1GqWw+pMSpYhwUolZsM
+GZw6V4Q8E3WeMMFsIibrDLI+Co+mIrNOI5Wz1TLGGp3YGkQRf7VDe1rCoTpzycVBGGURGrmNVwsf
+Q5yysKUwdfFW+6YjC3UwQiWNPWWkNYk9qRUVdt51ap+n8WaXHHpvGSdmWzT6RMWsgz6pTQnDPYE+
+uckJldjFnu/BT+qC4aPHGr6diT+P20EDrZqDgDk9Dp9dqSlXHWpjuVJRy4XHAOjirQj66TYfngTC
+9sI3JYu8TRyBLtjl9OPIFh7BOUBoYlR0FYyKjsDLSoRNaycV3AYh1J6EmgZsYvBhFwGcjLk4nBpv
+HC+rAkmMgJWBoRxBw846WRuYmNqlQCec3GWwsxfLhkPt2ojFQdFBNIXbWXCpwAa28OUAaUHNPyzA
+rAJBQeeCTAExSVSgpmIZkElt251mIC7MlJOxNMzU7UAYZramms8FmrujgaaUy1i9AX81AkwKOEn4
+neCkBJTYlmdwxAIMKl2hroGVjmBAinXdCjwfWI4JdscaqesAdygcGOZDSwEWXcgYQkcObcrwZm9U
+1QQgYcdmBEQGMNIHktHJT7F6uRSUDCUA86vmXheYnAheBmByAYwUYPIUEJkMafqVbnPCmlH4GAeM
+fuCSx41sfMBoe+ga6LhjmGiqn7U8i0Vauu5Zg8SS0lE1juVliZape3YqhNNAUYYpk0CR5t2tregg
+kXKPhiR9gCjGBWDqIQEXK9PpTvn+StSjNYCccI7vRffmIkWOJObYqY7hHYXSWjMWdQZQXLgThU65
+QZw+mYyv8EyuqKxtFCKeuMFJr56d/rrnwISJ2bJVMFvWkQLaLx/zMe6zreUc5GexH0pQiyDg6Leb
+c8WocTlqpvEfeJx0sZg7RCjdKdtBgGZu61wM6Gcm/ca/ewoiiSCiSIdnJv9OX4ASLNprqE+DHM3D
+xVwS7w00O2VnwooC74kxPbahUe+EFrduaBELuzTmq2KhRcBGp2C+Sizbu6QQqE7iuj21VeRgYYDt
+wEO1TtCQ8Z0bOEwiPIHvKOkdmT3aB8LQoEmb6LQQBA9x6NIxGG/trd5bsjqu9UKBIZLT8/9CNDeO
+52RgMMBzNKYrLJ9yRZ1hCjsZHgSrcBymm1/cNAujRcqepgqeJgJ/1L0gHf47uvRJYbpEAHAcw+0M
+aitGw3wuZuNmorXm+sbWWZwmg3laJsQ4jXvwC7Qm2DAmVxzslhRQCryWQGvIGBVLrAxui4fxInNx
+RTg+aDdoMJueRSkwm5LGaczGtUiE2WozlMU2FvOf/2YAN5Y85jrdSXDLFBWZaYo6QzyK3JZuReAJ
+T+qKzymnqnmQienHZbaJ47cFu5x+HNnCIzgDnKsTcyrrYE6lU1ltC323QvW4i4bsbNiuFGE7O9Yk
+HbwLwJsJ3xVB+K4RFUUhfLPgLVbvPz0Dsue+wXijmw6MDM38UJyAabwKL+vrh+UwMAfwbSo4J8Jz
+FJzzc8CNHFoP9sPNA9vR9Zno1ssButaAtSGVB8b6mcbMI0WoBssbRez4UNvlmjtfW0i2oQE+HHLr
+Alhmx3fYWh2GZlaNOArOYuE3rNoZze0GIz0mAnDUqTkNzzpvucV9TQSIGSjmATGrIjwWjMXytAaK
+wR00mqudAmMhFAO7EUAx5ZxPhGOT4TIHji0EYsnKmIWqQKcKfQR+CcDVJfKqEnDVDLhsrxVH4dIY
+kNUKkNVTtxDuGWITD5aQ7grv7p6RQY0CLeqSDRTNQK4EwEpMzYwMlEnDLVPmrZOIAm6ZMeEtRcdS
+cIvjR+ydfbDE4aU03DpxB4JbjMZySgBqjMTz2FqqRpkFt5ZuxeXphM+cxGzNgsCWO0FNwK0Fu5x+
+HNnCIzgH3EpMuquDSXdWRy26VuYeoGJQJVsmWVDlxMScIQwWWm09aBUK8iohyHOKtTFf48fGUmMZ
+xrKjBlzByXXglagvyR3o5AIoG+2y8a7GhIhEzAsb4odxr70np8spGxfGvWxDI4p8YXuQvRf7qjjb
+ScnvNJyqKe4lwBT19fPhlJ10aCcjdAIwSdAkYJOJZ3nA6ekTDzrZRkM+eHJzl25kS2QvuagDPWe8
+j2gMPm3SsS3M+Ej4VHurclYpVuHFq3KO1UqYBNfvHKiUBEthLpKamY+VX4zBpUjcimiXhUtzMoZH
+ACBHjDYOhqZlaQiKRqZ6HStO28uiiQg86gkOmSmcJIG2gMiDQya7AGdZqDB86MOFaAyAuGnDnlun
+2cZpXjHXVIYwAoRoYPumMZ9xJL4UNrtKDrQwcEhlhhw4xKULOf3KoCGMCCHcwZhM7OlvBhqiFN9F
+TlN7NYShUomLlrfRBz+OhpZu5RUYy+RjzRE2oVKjXeJg6PRNTj6KbNnrnwMJJUZm1cHILDPqRwSP
+hPrLzwC6oSRfCzag4FignqDIVoaVfNxjg0prqQqLlCOM4Z4I8vFwT2NWLTRbvKzUzp6atRMo2lD4
+gkb0KR2XCBcVHsaxIaM2inJ2ZgItYxxVPiCDRr1BOUM0aBTBOVGUU5tVmcWnonCxjBcG4iydxDPA
++AyiiQWEXKm/VmT5ASGbr5Nyf7c7+lGoxsM0hbdyZ2UebrEhnp3B2xK7bKgQPIVfJhFMEO4ZaFrw
+InH+yQhmRgDHIJhlyCUlpz+uzHM8nBNDKLUZsreOTMCg1gEGqzAq2RpUYjAJFRcVRv/JjaQqPfLN
+wSmj2bAQmZjxZaZdYSQgkx6x5RRAp/EJirs1QKGgDAMUFsQTfnhzAQr3ASlIkI3PLgliXDRm+uQM
+gLJ0K4IGrJjPKaChnTu/H6GPGkUoC3Y5/TiyhUdwDpCSGLZTB8N2ekeT3HfOcqGIA0Zktw9ZE0nD
+qyUc8asj58iUEJKIQTb+hMzGASWBTMlIEPUw5T4COFzYsaGQig2u0MB7E2ApuFs03LslzS6sTcaK
+wyzcq4671W0pZ5VHZ0ySxAjc/RgEqQUA2TAAUQIHD4RkvIQn2tFyoYYFG5x7isANOKo8yEFZEbgr
+EQo7N0e6Y6DIqzwddHhzyXfO2nrAQoCL9ToOLmDHEF7MARjJrm0k7BiDGAHAUHkIAzLmZH6OCHqI
+gSLj4Y9xcY4AEzGZ9SkSHSG00eJKCSP2QVd96qhvAMWectYyR+12gpfBVKIcnjAvmeOBe8uDD2by
+qakHnDFwJ1KPyiCCOjZYEFGzGPoiZyENgYiKW5hdtNzVzH+6jyF0asRDAMyLZ2GIo3YgDMGKj0Lq
+c0qGA40ZK6fbEoxiiKVbsVhbS4vplHKshNp/XZB6x+4ShRALNjn5KLJlr38O/JCY1lEH0zoIGawF
+QtiIRI3ECbto8MJDC9gx08cLsSCGLG4TQQxEDc5MberqmRp+F8cMW2ft5CKlxd6MiWN0wD1sS8IF
+le1oQGoWRggWI8geXZmZL2EnTPAk6t4PU+juVhhasChhFk4QDVdtTmLtIYKOBrC4qECkVmwgAlNJ
+gwhGuCkWNxwRKlTc7gOIDLR9N/0H5mEDdxqbqydeewjAogA3yCBwgNe5VWCB6KyEGQkTCghOBhxO
+xANzUiBzJLpTSCAi0T01sIDv1Q0dcNdB25XFdmQxoRgx7YV9vK88s8lSuH8DQX4kiQEflOfp6z3P
+NxdpvCP6A6d9vQkGFErRIOS0VvnRmtDBG+nsGzxw5aHh/zn3eyo5OcFNhmb4+qU7sd6E3k1B23ma
+XJMWGff1C3Y5/TiyhUdwDnefaPhfBw3/hSP3HLrRYVi3Lh07BwI8147Dady6da9l0khD0OhkW5Ir
+jrp3UkvkjmqCl/2qhYqCKT432uzJ3aHjo2ErWx4V5bTctM68Nu6cJ8Jays/OvNLO3BOrbqgaNebO
+7bQ0TkLwV+W4bd9xcw6BKT3lERCqNCKX4MpLbdtLUePtum/feWPT1Cn37eLIzll2roTrpmtzTQWO
+WreVdIh7zFmHuYEkdU8JQk9y17Oc9YiE84RamoiE03PQgXv2HXJFDllWKpLQ3bhmdsZrGvmw9hqA
+7W2lnhe+CmL2eC8IR2yat7ZOFips9xQ26MdWwyl3zLKCiwLT6MIdm66JDTdWfEPdMdfNFnKke8l7
+gqOENzLTHy/dypM8FLIhZMVNB20aYNwhL9jl9OPIFh7BORxyomt4HXQNF85WSgEKJw==
+ ]]>
+ <![CDATA[
+ zM1uV5YKW1btOF8aAT3Frud25LbiSNcB184SWXPbg4eYJDPmtVHMmbJd26yFYtWlw51j7Hmn3a1x
+uHmKPbOcMeJwbcPFnFZm3OqeRAeha+0NfJAxc3CuBEdi7DgmQfQdbB+yY3C4oYNtnFWLVXlutDTX
+UB6wXuNKUYySdqdhsn0y3c6SQcehznOUc6LbXBMxK8o9P8LNIr+YAxWTYDvjMG0vUZEzI+c5kADG
+rZPKTdd36vnuOc4YazWu0kzgLMyVMDot0jawMQ5Ta+uEwzSlnhielbFqdEYmYO0/9c3wlVyvyIOQ
+tYPjMoKGy0i1fGzUVS7ciTwUF0gW8t0g9+Ugr9kh7iRP2+CkV89Of91zeMVEb+E66C0sbJr0fbWw
+gNL/ufRzHXpAumsSEeZogYAVylkSqsQnBip7ikCrCF+bIVg74+usVJ+EbFpfRzSvodZdnfF3cq6D
+nexQ0GQH6e/WRC/1bKKdKlZrPWhOR8E+jf3ahk6v9G2BdxPk0eSFHTFaRI427eEi/s1N7Mt+dI4X
+M35MkkLpx8iTUdlJ6MuOkI7RBOfuKG82x4+lBF/He7C07/I7X0u5KWFKEU7JRPbDb7SHSM7DUAGl
+M5M4TC9j88lG2nGE9Z8JX9VwhJX4jPVVpUmn6g4uIw6LDHlFI4J8d6M7zY86rNN2IIfFk4kKyntq
+N8ONRhuKm87yWEu38qO/DkfkXKQ+n5N+a8kupx9HtvAIzuHGEt1J66A7aUDUXHflx0td0hahbUZK
+xU7rFLe1FUuEtMg5sYPi6GdJHM8O6eyMi0JKhglJ6aRyGQeNuKkh6aaYOLbCFdlIZkXmqRBCJY5o
+yqov09XIdK60gqXj3VJml42UG+djHVDEBQlhkXFBYJjdCOUpbmgeWRonSsLZHNV5cSIlGBkfJhpl
+6IwBXYfWzcgaR47Jbysv7efToTqv5DjUvjLnZ7oVPLsb7VGEtzEtDAv2KextOLHX2Bne7rPfDF/D
+mSb2CfjsgvF8Y4aG4MNGXc3CnfzAJtliikbqrc1r8CZxP3PyHqceQ7bo1c/hYRK9Duug1+Ha//J9
+ySCEla4/ccdaEwmiNPlRHsWZYVKKxV9t1HswxTHD65jkYMuV6iSiUwofwX7C0hfpLWwOTGbBvDwY
+NdqRgzQmPYbxB9YnSM+wMUky3zv4+SsiKdh9Mj+7h5jlGWKi0WOJSDBix6vlJ2+wJgpNgiq3VVAQ
+wLUDU5T1t6NScMifIJTJljJJD8ARsYuiV4ZPeACMC+nHKJj9xroARr2lHBlbcN6n4VLTGS5g4U4c
+r6NOH/qEBlE2w1lGfcDpm5x8FNmy1z+DG2gSPdKaoEdaxNh7wgunMUaY/fHKRJ3+Y67Zl4ZfJoFs
+DSWrD23mZk16Rc/Q+0SBmnfrmYMbbeZp1kvelq4RMHrOraj8YBLAZt017K7EweujZUQO48Zd6mPX
+nimfYcx9sP/0iWfMjSmXE7jnAvnxlegDNQnpExPRWCH3S2w/uzfU0SGOnnu24weUsRaDB8z5Tcb1
+jMHWHZWExaYWSwBU3fE1hanrazDCHXu6Z7FFRx5rbk0/yBkG+6gNyDIRkC5l+8WCAz0N99nWRz5u
+rxfuxBRCv5dSTnwpuAyuIUW/3SVur0/f5OSjyJa9/jnsdaLJUhM0WXIroRzLLPMSMsiTKuOXOXrf
+Ppu+TEIpvhWgW1rjMsgu+LB7pxrzJu0x1+d1xu62ppFAZcIwMj8QV4iT9cW2vaH9tbWNtuaxEbZ2
+1NoG0HmNGuZj7e0sGysX2tu0ffV7haLHNp+hnJVo5n57drUSttTU7ZlzFs3wp+2piaaXFGBne2p+
+0dhxYG+gPeXqolLEhLkQ6aLmQuY59nThTgEet92GOZhAp3Lanp6+yclHkS17/XPY00SrliZo1RK1
+naVJybL1ZPs5UkHk2E+uvt3ZqlwKcevGIJVRH8kwxVqGKZL2kqMklWcdc9PJd0ftFlwLOY5Prcm3
+qenSs4a5buo3Hkpw7OFsZDkdMI7YP08a7nivDc4oR+bgnT+2c6Y2WXgIp00/2TldsyHsnJG5cGyX
+7Zyh9/oWjz39TbBzjGZK2ZmgYJRn1B360McN3dKt2PJScNixl0yNhb2kXeKW7vRNTj6KbNnrn8PS
+Jfo9NEG/BwcR1sKy+QHbtbFtUe4umhtxno3bOLZkyawtm7Zmsv/4jrCdZdd+6DRtv2x70VzaKmGt
+rL06yWLNs1K+jZJJV3MGRZcH72xoPQzVQtI7E6g0bZOMTF0XSwujZCBXbea1voFGCYV0mDXq1H3E
+z6Z/XNSm3HnaKC3eis0kKby5/Fzf0IxYah5wOmGVFuxy+nFkC4/gHIYpUUjeBIXkDrRyCapvhlR3
+SUNwTA/ZThidBISC5YlnqX3ZmoyMNTMMkxKGxnQ53gmjkoBBqrMmP+8YoBM1JFTnZt69ptut966U
+EQXTaYwHUVg2HNQ40xoOW25a8kQXMhymHcVFbVuOe88nw6EzmZW67UJRLt9tI3bjlOeT2eAmCZUs
+m+SWS7aIQx/4uNlYuhUbMjrwknpZkPUhJFSbNt28TdRsLNnl9OPIFh7BOcxGoiC1wYLUWpqNrTQG
+eJN7tzjeuvbG7cztyFeTe4M52Qpzm20xXUyGxLvZvObP9DqOEfBu/9TN3W9MQlOZL+912sKwFDMY
+LHozs7CxcurZ1BbmQLpt4ul//XvZqPud7CWnyqLZy7a7yLreuXMW7ELHwUiFi730DoxuxLwpuvKr
+6gKYZLeq8Q6s5MEs3YqPSJ+3iiQlehduc2uUJNIW5Beqw5FzKKfu4R+DKIfLdfEbPN/03E2Zk1Oe
+vtyaJKrpmua1WxPmUtEydMOQUNSYsC6BYMSxMsxmNjTPJGZtprjJetMJq9N5r98IozF0u1OsTvvW
+6sy3OvRYHpDr3yH0zSyrs3Ar3w46JoPO9Vyrc+oeo1aHrdaJVmf86cutTqJaqWlfu9Vx+2Juooim
+pqG1bIG2SQuU6M4o7ZCJr4xYo2j8JG2Tet1bTyCwDfbo8Qlcg7Og1pbsYB9B7CYk7SAL0T5K2CwS
+7kZs1vDWZk3YLKZM3OXXp0w0m8iEFkZs1tKtxrEb2xsfb00YraM3ORWvxY3W/Gcvt1mJ0pSme+02
+a2LwuGO7WGegc2ZRvZdnJVwRbuuHdxxbRjl/x6INcT6XjAqP462erBv2DHUs3Bqbn6h67iJi59RY
+4Q22Ud851s72TC2kzbN2L2L5aJCvZ/roAn9r+eZZPhMdkc05eVBdJMY8YvmWbvVmWb5j8V62CC2e
+w/IlSiaa/rVbviLooTJh/1BPoPuXaDvYUuB7M47kIr1DpmxhbbJObBN3ND8zhfICjdNcoT8NY7BD
+GGrstVhE7SNaSOx34eX1cVKotpRrbSlxwEQetZeZaW5Vu3bTyflRrfUs+4mW+i10nGtAbVZKKgdy
+7v8slAMkDEob0MVbnRj2O8qCztnlb9aEtolygzaLmFBpQH3z6RrPMdNpSxHcLpCdUdkH8ixjRLkh
+lB64oIUMdtiClq1ux0BldH5SXGilM4jgFoxhZYGRTuvLOYo7j0anTGwgJD0ShK5FA3s2tiUP6PZM
+bs+gtMnV2YKzNtTrEcO7sYYXG/NXgfk1gFU0+G9T4FUa4v8ippiJ8DJTPGsXXw9GHBN34D60tif/
+LFO8cKu3pnipKU5UErT56zLFwfjAGKIdN8gdKTbRLJM2ylYUtLPNsmxIe5px5pawbKIFAp5pomNl
+srNMdcJQ946hrthQ68annrleC3OtG6iiuYYz29d+dsc12govC6ONU1Raz3SLWANjZ9ulfQpF06Je
+fCkzzm1XTUSCS7Rq891bM54y47boQOjvuHvphSwyHTHgp2/yppru+TvEjfcxz19uvhOFC20RmG8Z
+iggDEdJ8jwYhuGzIaW4X9Fb3AhOOIs+Y8cKMLuG2q1go5mDsZMBCafQ8c+7OLI0ZdTeQ4SSo4AxY
+sz6YER0s8a/JvIf4OwhwKB3fqHlfhsc3U4bedrc25n4fMfiZMPg9fAYdnO7K74AA5yg0/Dvf8ONA
+DSNIcueQ2xmfXldw7Ak+D8dLZzDbHaDTsi7pzUX1MRW0seMxFXTMG5y8CdcGq6jHyu/AYLpX27qr
+SY+wcCc6K+y/3M6t7PTElNJRt7Bgl79tt5Co8mjL1+YWnJrS5c4BJ2Hq2v6GupXqNnA7VR9nWr8d
+6yK2Yp7UORzFzkx45HpXdhepcM24u4j19kw6jiO4Qcxp1D47CGYSxV1HKbjCRnMFdB3q08qr/RwH
+Atwh4kBw/MN21I0EPCI2WmIOp6Blpl29dSnndynUJMLpjMD1babbmWmZOeZSlu301qWcw6Uk6nPa
+6rW5lEizglmOZcq16L5fezNmmR3MWjgYl4O0jnhkP+ZizFjjcUfjB5qiyVXpakxXsfkOJylKmXQ5
+5+UrGydhmwhNBcMG1p4LClO6XsAKnRAwGNWxDf7sqsFzRWXSGWUpZ6TGK1SZ55LCtHDMKemG2NSl
+9BSeM+6i6H6JuajqrYua6aK4r0RBKWHtWWhX23l0hotauNOoi+IxFctc1Kxd/ONwXYxxclMu6qTn
+L3dRiVqwNqwFO5eLkr3KuC+e22XCOqpqRLlIjoo0Q9ZVddSsUrmsPXEi3QOvpZ53lJp2ciBJh0Uq
+JN9lif5o53BcpGuyrqvk5pimLSb3CRrJn6QdGCmlrAuLDcub6cxijown9Rzpygo3+GYGy5mZBKMO
+rRQJ840IyJWqzx22INWzNLj99Dy3plhW0q3hrKBy0rn54/zW3qwHmvQw6uIm+JceYaTXW0f3Ghwd
+Hblpq63dk2mwasc50HC6EU+3dKu3ru4cri5RqNiGhYrncnWNac/ZUyO5QXAzf+JujJs5ZUZoTmPs
+TPXp78jxbR3HVwvHp6ficjCwDIKBplTJbSUYuD7q5TzpAMeDhI1oJhhnb7WZDZBTh+hxRzih9XLb
+CQpXqHuHpSbIHh1WJHM+xe76MZdI7G4r2J0e1KOH9PAAOesYh4Rj3KJj1ExPfZXkGFV37o0ZLeWX
+fU25x3LcPeLsiOYoJ+kzQB7fx/3JJyXEgaOMuEk9SkWttMP0hu7l5BzZML51mCMOUz/fGdhnclgV
+/BTfge7xMe4uF230pjrL+TvEneUxz1/uLBP1tW1YX3suZxmOIFiPcMTJcCYZ2lRAs6ABNw2NtjGO
+k3pkW5mFYYzJLBo4TtSHBQ2RPMfpjEJY7j4xU6QYZNx9tmbIDo9aYCe6JSe6PsaJygmySSd6vBtN
+OFLRX2EsUDoknGktnGkeD5USw2zteTJXcYZOdWucqp/D25Jb7fAaIaeK4dMt800zGMsXhxQznGs1
+7VwR8BlFIHwea/x0yMlGcn+NCbOu3TCrmTpo7r+TWOmEw53tchF+WOjwlqOOulwzclC+BZ4/KAYg
+zXC6S7did0eOqSJSS+6KnJgYHzzudk/f5W/b7SZKxNuwRPxcbldgbIev9slcYhiiFQ==
+ ]]>
+ <![CDATA[
+ 7tdry5Nwv+UOzVlm3HBr3LAezBtzwxtRU+TxV2r3E5GvR9ywmUk36Yynw7m9auDjNsdPuGPJ3jy3
+bLKUR7jloD1R3C03uGqxFjloVZR/hIQmdM9NwHXzaa7LkQCcV5WPuOlGc1/jpjcUFtZOujRBYea+
+ao4lOml1NWIe2i94neeuFRue4a6rNY5ZGSbddjw7OjA3pgmOhZncRXctnB8xtWtZSFm6bt1bXV9N
+b934a3DjZta9LEzgtKgYlas7tIy68aVbvXXj53DjiX4Hbdjv4Exu3EPyVTjMTzhzb3BxLN9Kfa6s
+OGjMmW/Q5Cmjl+NgR23yGicTu6WAtCxg2IgCBpGLpf5ZyYq0iEv3hs3OYNmjjh2MlxxAPO7YpcNi
+NlmRe88d9z6MFEmYHC71+0pWwUXc+/EOPuHiE33ETuPgoZPfO05+I5y8AEXayevzNsnI467eZ+S9
+YeQVOntw9Wbc6OZkh9/Od/hwFLtqf6Lb99m6HdtMcF27fR0rW5xRTgAAjPDQ1TYCAXK8NW3wXP/m
+LQSYhgA8uaggB447sHrXyHnnIICFO72xAEC8G7vDEQDgiOcvBgBdoltH53br4AsHbx76xvh+q+pv
+R/z+1qME/kj3ePJ5G5D5gudnBCOmw0mjZl6JwAA9+lZCAmQLJbmPJadLmpwWSU8DBlAUP1afPgMP
+6BH0zhjiKVwQ128RMgC/oJFBrMrdq3PPt/aTMzHnECGkk9sjIQD4vFO18uM4ocXViFUvwQzUJuV0
+gfPgoYZuJDQgtWHJyH0sxyHQww6QA7db6XCSTqULOm3DFSrpbKyCjPCDkyhXAAKzR3pwOSIIvH68
+qX9wPRyDJDq8f0Yj/XAFGyRRZ3B0RV0mEAXX/vhpdj8D4AcTDKrA7JGr0gSLYbCF/hKf9RHJ+Ghm
+wGILXHi1BiiDE/EVjwCzmI3sY20e41vKNxVlqANejDLmbEIog5sM8KBEjQ3oyM10rV43+RpFGQt3
+GkUZ/EYEPhDndC7KmLXLsWjH7pCdhHPk85ejjEQjmi4/N8rwWYhrMdKxhkS0Ad63mzw4Fm00GJxX
+/GuIRh90Xl/GH2RmX0viRAQCp0nuRXbfKsKdGbuEOVKoo0G53Uzskcz9G/ShJrfFEg6xEUox9GG8
+px9Wj2GQMA0RlEtRx0qbisijcyoZg6RQyCk4JIpEjmjW9jrRiDynjUEjCdniAkxSGEwy4FWlMUkj
+MQmeKsYka5r23CxGJuvjkQkcL2D7vyw+0TZmFko5QTQoNC6nYhV2Sm+xyhyswhNOeYyeRhjsSps+
+y/tmJlhZutXfBFoZ3WEGWpl4/nK0kui71BXnRiuy5saXE8v8iCt2iMjzdYQEW6GGgodjMUuBfr1C
+7MKxY8QuCgsI7NIKMYQfLxFyCMAbriAi1c9vTrykx3Lus+EXeLcjgonZ+MWvELM4po9mWyZiKUFj
+2NNiKXo2ZStWk0Q0M/AMNrw6X+n4PCyTHRVZKcfUo0cimp4QTaWjLFx2LnSTLesm4SrLKcaypWtM
+XWUNYpOq9JWVp+AahZNOwDVYaZhSX6bQTVjk4OsvK9Zfmqit5lHEoQx/Ks8SiSkTkZjaRze08Lp/
+i3TOj3TM3PJczuWhEecXrQInmLHRUyrGgM7Snd7inHPgnEQjsa48N86RVsXhTEm0ky5G3KlOt8lm
+MYx3/OHRI3gH+1VxsVhFArnOoh40QBb1VGElhot6AKW0vmokEbHpZ0dsBtxtPvpJa0oQ/5jp8gr9
+yOoNWf+fVpX4+CdsUrkbQUGxSg8HBWHvZV95cno0p5tAQunIThQLndz4cxwPbQNENK5Q8fsQeNEd
+rFMaL0rVZ9jEPuC6U8jI9oSTDXlsQ9EhjPWQWNWL9WCkR8d6SMGiDkdHevDqo2uv8LvKZScjpG0M
+IWE90wRCwjZDssd5j9eT26PO176ElSqJOBBGgVrHnhFzM3ntEm1YvSgmNBIVEjGhSFToBNyEONbi
+yoTtf4ubNG7qVJpJPUlO9Sp5iLwZ+jUHOC3danzyjz6X0QbjEeB0+iZ/27gp0S2vq86Nmyr0fTFO
+NqalSappqMF3uja1FrEiX1GbQk9bRA665yf3o9EYiuPxMnJUTUWOAOu4WpuNo7wtvcZ9jKG2MzDU
+HvWXZ0NSqCVydThuHewpSErOPCudFgs70udIPNVMRZUwIyo1Or6S120oGFPyhngK028GVfnIKo2t
+EsgK2xS+rgaFp6GqJHKNoio3D8laKDzLR2MrtzsUFwIF2h54k1VM20PoSl2PlcZWeD1uz4iwdksQ
+Ftx/cCefiLPSxUUWZzXpfJuwdmTpjkZbcawVadoRIK0AZ9HCe8nHXKaBh3asMlZFk6prchZvIVcS
+ctHIVJQ2c+umsqVDNxOme/3rcci1cKs3CnIdv0G27PXPAbgSvR+7+tyAK96KIBYMT4etRJIu2jrf
+BMcnw1YR4KUKsQz06hFg6Cl7PLdDh7FaKvtgCDYos41hrDKSvBs0BPMa80sItg0gWBjGikAwVSrm
+uh4a13oMFBsTRMOn6qX1nGIppynJNBjbKTAmrxV/SPdMWJZM9nlDBcZhWRjmisAycz0rYKYzwb1Y
+KZA2Kw0o+kcf1UN6rO76LBBtuw4bcDIYZoiWaiRjwl5uU9JZQE028dyYIBj3KnPaeHLFNkmwbXpw
+sEFYDIFV5kpV1+kGr1Rfor0IrmFIbBFcQ4BazARtaZFUIo1IEqlUGtGDbGQf17Og29HALSXx9mCb
+vMPwknwL4M4P4Gh+80VOsS2Nunh+sxmU0Gt0Ngrglm71FsAtBXCJjqZdc2YAl6hR7SL8MaUPd7RW
+NKgiqraKwLhmOn6GDs+NoDUISTo06TQymeJpVVlSPE3rsHTd2kAcXMbTbE5ywMYx27gW67R4GrrF
+SESNapvPBulUux1ykmeCdNiZwI2wWajBmiO3C5tsaepXf0fibTS8I1UTd0K8DV2sG3EbB3ZHQzvs
+qj6pWp8J7vYM7GZG4PwpVX5/9f16tP9dot1uvCWRzRsTmPZg3g5hXh/G4/BqtrnO1onHbQno2Wr9
+2sTjRnVgSmdg8uzq2u3w6vV074BWlgO+3AI+mjRwNODDqtb6PLG6oCNAbWJ1o/ox0+mDe3xoLcdw
+dORuiXZ+NHZ3IgxU4xPf4sBZOJBSmzQrXWM3lo+ZDOAsGLhsp3H8pedhLoWBc3Y5/TjmAMHx5y9H
+gol2vV17biQY9iyppsJ6oZWyYT3UunJgzzYblIgw7FAUQ4RmKgxpoGM51QqxTIN2vye7r0fzZgIX
+tgIXunnW0s2zIuGnTCsO0MqdlvutCfJJjb7sacDI0Gj0TeP9RK4V/WlzJD4c0fFzJXtMyxbtQxx2
+InbnfRaowxZhP4EQd/h5DN48mHk4MZKXpT5BMjMbr1tM6f2D6aJmQECYm93gWou1KBwo5u+c0KUp
+hhn9oQOvFTE2DmKc01s6QIz6zM/CjbnAjZtJ3NgmcKMbIGTcWFCAUF/VujqFGM9rQY/FedCjauLX
+dG8mhuSEyl+oQiEeSux8DEkL7+O3ePI14El6BzzFBzeouO7SbN/r6OAonly401s8eQ48mehD3XUB
+noRPS8NJdemGeJIu3xScnG6ENxVkdEClyXpMN71KjRn0Bg3SGAkHUCorwgYOLFeOgTHlGBpyDGub
+PzYSPi6D4PzxJi7hg9OTLv9MtsuKNsuiUYY4mkLDyoJhpfKhHrTcYLno2QAmuuBSS9XPAzBxLlGQ
+V7YAc8iHDO37zkCddJ45n5b/RTOeky26xopKcYSGLSpFiKk+qpkw82igic7yqJYaU+FJMZZjHGzu
+HLhpw8LHw82O7utUz3R3srOFm2UINxnmm3a7uborCHbyaMmWYGd5LOzEK96XD+rrvaVwpSnNoCtd
+X+dcEK0oFNqS3CvdgOv8XPCz1JO5uD3pEviJQH1jgwYIQ3t32tfIIJIJGCqm56Vlh1TeYVQ+nBjS
+1hrt9JAN+aKw5gggHWsJMieweQIoRY9jgf+bWyASe67Fk+FzY5j01D0YkhJ0YrSkkaQqjcXIpB62
+OROTLtzq5FazMUx68iZ/25A00VO9688MSTvi0/PmKQXVI37tLbquWP2IG+3cedHOIpL/JmgKJzKY
+gh2FplvlNgigVuQ4lLNJCxxrp8ZkcGKfBTo47ue6DmKfpYl9diL2uRMDR0u/sxrATn/e9hhE3WEH
+8GOBarISBd1gExdAjvSKD6t6TU9YVB2IaGgSqpZDAXBVA9YdgaXNEYDVq6JAZzlVARz0cxur/4X7
+IJghHoWsA66NWIuipE5F5ang1YGu4yNrlkLXQDwZ5NZHoOvWg67+RPcAuupP4UgAa4fATgPYeiJu
+mhBWIhzlKx8BLF7129cIYys83rPBWOxcszsSzPo1hGNgtp6IqSYEmWThybYrMAurGOZ1gJmWagYR
+1mNrbOJglhbahgDYRhOQDGG0d+bWMW9xbQzXMsDi52gwyoN/Wt3YX4FRrGkexbVLt3qzcO3RG2TL
+Xv8MqLZPDArow0EBUVTLV+4kqlWAS1q1uUHXMOyKQnPqCxZVd8bDrlO5fBwcGGTzRS5/F+DbNRjD
+DeCqHRo4jXJ1GFajXD8Mm1EltezBJ2YWUMexGdXUc3P8gFk11jXBWKH/LAjnRpAu5kP3R+LdEW0o
+9jKb18VPhmbldCRPHQpI19eHRjr5KWdlMG+t6qGOQL5u5xupCcCuLNQlbUa19lxNgNY5j3cBjKLf
+ZfhXIGCc6HRk35zxAC5PdDqhc84yHDw4IdyWqoiXKga2Bgf3Cge7n8ZsPDw4eDheaKRz9CEePkJ/
+ihiXpoPgHTEgJx/y9WvHxc25cTHAwKzNF+LjZMHSDHw8Q3OA+DhjfAyWphr+Ep1/Fod+OQD8XwYv
+jz13Ll6eswfhZXpETu0PNcblcdctF5zPgcsLd3qLlpei5cTAiz4ceLEMLauWILXBzG48OCzNdOPB
+gVRBzTGcKGz3h23Hx22LwnY4kUkF7ChmbvIODK/6s0GEprFzJrBzS9h5IyLEmRMhtiXwGywU94vg
+5cQvf/pG7dVNbf0iePA1rj72OORcKcX5+fAzXBY2YnwW/AzIOV5fNYWfu6Ed4O0gji5HcXQ3J4IM
+12Sqh+TYRBBf9CBqsLDRQ0JbO4qit7gGsRbhaTEXdeGEEV4SRZ+Mpa0oJezNHbZACHsmxeL9YxPk
+wqiyjfLv/Kgy5r3wU4EbAS7zJKbuZ2HqKoKpW4OpS4GpBxFj5v7x6q7J8L6xmLrHKLPG1CrGnBGm
+xsYScHGvya75VV/b86JrPH5V7n82dI15LUTXYLfKtvrbw9holdqhW4S151SPHYe0R6LSgrmj7ZmH
+uZGqmQzyW8w9hrkZCWaqR4AJLLO2t+UmAX1f5PX48JbFW50sk56Nuuds8reMuhODW/pwcMsy1K0g
+UYnIu07Gqxl723h1UiaMbYFYKDw+ry7SDT0WsYYTOVl/Noq+S9XWGYBuC46YMfiAOg==
+ ]]>
+ <![CDATA[
+ jRwxeIkZVI3BZeeChIwY0Lftp667F2SIwct4KyrRuyARv8a5u2GV2rHx6xaeVh+NxZMy46dPKJod
+r2Sbr94wQmNA4SmpcbKbqIPG1+oii2LyjDD59hhMjj1k3Z7jC2PbOCs4rHibH9vengGXdw4qH5uU
+c0Kk+2zz/14XOq8iTOpoubLpXcHoXOHzUtnKs2H0bQKjFyRktl3me+occoSUWSFwsHwDYvQ1XIwt
+2ED1p/wLIfWOLODZkTpYuKZtXzten9XhfkoCrdomG7xea7wOqx/mtfx6rb3x58bIsUBCWqMjsDvD
+tLfYfRq780MzOJcmyt2ou0HhbQ2z50H3hTv9DSD3sQ1mIPfxpy9H7olRRH04imgZcs9g5Qa/p2Pn
+4XS0mqLnEr/DnR50j8gjsXO3LezGwe+ennpk4vQx+D3PUQCMHkxH0teE4vfovXLEjTpG1WAcvScN
+iuwzYZrJAn4XsXSB4lORdFdtzZF0obYWk6yXo/i1uv7Ph+Xh2KQy5QxYPjIh+xQsP+BHvkY8rxF9
+TYi+0IjelBWO9a8w+BDnaLlK7dG524nSwvjk7SWIXrv1rViLsL2Y6L1w9hMvgejPgetdFrbxNCzx
+mZi7tJabStIsH4tpuWd0vUhG3UuN68GSgj016L5GfF8QvrfzNVuar1maBrrbmK7Fm6+pC4y1rqU8
+oj/GJq3zpgj8gLYQDl6je/yT/wUx/vr1YXy4kfrWIOWZnm323E8sNHax/vzYfFQfTki/IqTfaqQP
+azO8oT3e5kTpaeHBBqg/hV8E6k/gl7egH0E/zQbNCJ5rrI7RdfgGO27onm7jgP/0XU4V2Mew/ql7
+nHoM01fC+LOXA/3E7Kw+nJ21COi3O1h7BPs5gn03XN8mw/W+wJzEMgBsbMB+agpEJ8Qy0fbBylTi
+sPbU+NKjAX82ZDu4Ufd5lhcI/FXwvibo36PT2+oyS4SYXGbZorjDAH+0nCihwcHoFYJY2wdED6Hm
+jvIS+LcC+MdaD7c0Bt5MkjgT8N+Cz9icAP8ThZhwjDaYHx8K5gtr3J4h6QHz6WLMNlGKGSMA+2E3
+bGENSAMWEwG4BsNZFouIAI6ud4s2lxOBZVSgd4jA3GFlM8mAGQY7SgcWEAK36MAN9YeFB4lQP3Yb
+cgtvx4Q4sVC/J8TBYfKtF+ovkRIAKYATC/b3OGJAd6OdrJEU5xAxKMV42UEI3lsSvJM4JxC8a3FO
+gXebvs+2FPbX4pwGQyYVWtFC29Rslw0eQRjOSxGoZL0RhaILKYLuppSiCGAIhnZ7IlFoXytRWB9L
+FNAi7ob933qCQNKGI4jDNB56SxzUeeurPFfAPqvarDatUXrFBBTkV+qUeh57WLzVqWdlLoWYs8ep
+x7DsmlhOIRLTd/Xw3YIJxC9RcbIm2LqhHiEYt1ZmFw0vz9AoTb/kGrtscCRbm2F3PFqG6vAc4aFW
+p9QG4irjjD4WzTMZaDLRbKTZTKOhBhPdG8g76AomHD7FRrsQhluZbm282XyDAYe1Q+ujiU7uaZNq
+Iju27+omqAvwO6963WIA0I0RntrRatoMx2YdtjIko48ZDmv4Ld2RZEcSHUtyzvyFO+b4LSAB1SoC
+FuD5DOUEGXzYGbAE+B4+Qmx23av0kUJO+HaUgGZr1l4RMNhxn+eYfSnUxWV0VJyHUXqqnnIxipQN
+VNtAeRmjr8oRnuhmgg1CC6536JA4KDCjsP6OKx9Qd1Ui0KiQerSmdrgz5E3RNzUyz17/fO03Roe1
+xvikm8ORZK6jiog1XuPYNUfNVjZ9c0qnImJNZE53zTEdc8wnWtAC3mr+n9NnkuGnI/817xM969fb
+Hec+4yPGxojHFEcdTMJKi9CYrVopGovRbImILRIxzAfbSMWTWLLkeoy5eg1tMG0bDmwWSRDiPLa1
+EDPUxuE6xHQUkhaRCD8W4UcjZsUj4KbqqJdjfIxSpE1+pIOpSEaaWIQcoWRaQpkUZE6NoLY27hCw
+WP7a4hpo6bCUzmqjx1AUYocnaIeebYfBnx0cya7SnlhlRHfYdWoHJIsgsNpUf6kLSfkB7UuUJ1L+
+S/k9tCoqe6tmY28B7IJ3VzRP2VO0xwisdyZe4l6J7nUYuRKHDFk4X41+gXk8PScmVcbaLeEwMbeQ
+ia9Qe42GgwLcRKtT0ATXcaItljdWyjTEChoCpNbmiIWjbxymE1/9jOXGamKrnVhNalG5VT2yqpFV
+hktMSC1Glt/wYCROFLnXRiNHXuzoRKbXNBddXS5jW7yH5hVFwUqqi4xaoitmpEbroHyIWzOaEuS6
+vQCEkzv0YsEmi1lGfGKhHlgoWcZf0fPmM1aBQYPCrJJWlVg1rUb485PfS+KQogdU8gvTQqWW4igG
+ag+ZchF73KTALEdFJQrt0ydUpKAg9Y6yHCVF5HqEykrWlJOgScXgNqVp+pbjf8oonvoVv0+3Qpu+
+DUyraxTZsNlAdGXMSk7mAG92dLfazfboXJVTrdCR5uhAlevcoLPs0EGCWwxNRAb3S4GBi4sC7qZc
+jS/IV5j61L+JBIDmP0fdfOom7PKLssb4CO/i/nTxTRofJqVnSZXiJkVSY9fGWQOtLeKqgcrAzaI7
+IhfEX5V56AAAl6ioMIAOBDSI2Dgc0BNV0kEBDgvYHFjGwQGcjF6KfFhD0Vw9kLOnqC6HCbY2VIDB
+Ag4X6DxZpTNlFDTQaRUOG2xM6GBHgcvMZEl1ntQPHrBcvKcpCLq1gBSNW9m4G0aQrbm8RgM6lACI
+yJY7+e0GWEweSiblbATZhrZMFD6JGQlEO12LpL8kFeWlLZNrq1y7hSED2FGHDEoMF+jVkEWrVMWD
+CSE0+HOanUVWTts5ZenwtKi6HNhxo7+DhXAW7Z8ONGCoATMT+AX/L0zQoaDMRU3W0YQe4JZsqZxL
+54R7IwrVxV0byjZuKRixwzeKW1JAojR5Y7VaGl3LS4clNsgrBl0KhvkPLSbNkXtwcIKH2nJ4gorD
+gKFsSea1x0YNOs9cYpkYZ5tbZD0cpthinmRn7lHd9KzGu7CrAZdSoELddfKOUwfgZZOpOTGvwVkb
+I83j1ZvhVMwFNBvg/FyN16LmBSVdo8QNRL7OFfHJrF2EI2AzO5cn7B2e4GbxYs1zvSwsTnqwsx5a
+YrgOx7UsFzmuZrmccWeeS1l3NSzYcF3OvVu2K+S3gu+6AlyH7yrGC/Z7d2Rzi65MtUJGzgtX7gzW
+S5zVXXVkuQ6jFKsQC6wdMV3kunqJxA+R6a39okCKuSQtCyYmDKyX+TAzYs2JNSuutngrIS9mbizZ
+8Z6Iu43XgN0xPFnGbCxb1nzZMmbLmbmgULLmrRrVKpizy53dXHbAoKNZ7Q0N5e7Td0n0HvHvEodP
+A4/2FQtCsxAUGp6yIhx7Bgs/kovTZJZpJj6PjY+x8DlcfIyFn8rD0yz8WPYdcG/Lup3pMZNqDWQ6
+BZKqGn16j4xli146J6aieEqHPtdylNzoBhzNgCoWQH85o4WeVQy81iTJMZwPeV8kwF84S5PTnB//
+mo7GPMuQWWRrW7yp1niJt3gpVngB5cSzNMdKMawtmmTNsAAEocmt0MzmaFh3RqDVG3EW9xOlimtj
+Upg9SiNhb2EbELM3lL1BZOCJLmjTQ94Pz9rQrA3MdhyY5eEsWN7mB5N0iMdOSvYiQTxUeUQ4cOIO
+FEjirHpGYR98thnt0bOQ19TmNdUFYO9ulfcXDdxYMpy0dCs8IjccpQmweYY6dJXil7G0uU9YzIbj
+o/D0JDwZsookWp00qxh1wdzSJu0MWnbwUwQ9RcYyOBHoWdb1r69cod9WuRqdw8/lMTo11kPik3F6
+eCiQOOXpSy+ERKtu3albhkVM4K0SOe42CLwpvLjTlBNpZiEkxhh+Q0rZq26xhk7uyMVlKGl1u4X0
+pmvf4MmOS3J6NZFDgB+m9zXrN/bUw491G1azwYqNQdTXZCSgY6WGkvhKEZ2V0cVUGh0FXri/LAVd
+RLilwkBLHVVnDI46o/CqTqNV+DoOgP3pxvrG+FN8rCrD6jIcKTqlniKBlEi381j4JFBmYDeK82sz
+cvo7xyBNQbqMkgIuhVFmWH1GY4LGOryir2D7d8/hFdiRlRtrc21vMLSyM39rVrYnMX0urnmr6jDK
+DrjeaxNg0eoOfSf01EFibTq/D0bjwX0sMwqs8JcKr+jRkbUZ0Knl+T3pPVj1wWJ9dd/sTHilMHPh
+bXClwztojeHutdBAbY0CpIhqQFrqxrOmcKiW9KsTDgeH1bHcmcfqQUyHTHEvFcEM+VDen6tuzZ4q
+JMxLcM5C/l8G2yrxUzdQx9eSvbroCvN+ctTXXx1mv91xYkcJ+f20S5hykZBawGnCJhJEA4AG7MLK
+hobIQUXRnpwowp7iOKxe0PEaHaUhxQJFZDAW8/RJpK6jNdRhfBiBVcaI4m4wz5nRxXB5sFXFuJoY
+d8STWwFQcAUAIDpfD9M6bX5yL04oq3JidTlDepbv5DTfWGWOrgyIK2HiUcEZOhhsei+VMGHKz4/w
++PUofUDjRJpPTL716VwuIhKh2iaptKG4pY1MTutshhGdDVyxRHFlTHFaaRPX2pDaBq73QG9j4oZz
+9DaB4kZd76l44VhEPR0rRI1YNFo4FiscayiMrZeO0eAcGf8zc5njNVEnxARhx1lancnlNlc7Sb2T
+qtTyBvHNVfPMU/XMUfdMaXxsA7hoxHG0RmwkBjlSORa/g1L3UDFSQ+Zq1rqEZs3PRIXtJYQvgfvK
+V1f2wptU3DSO/Mme/Mng5Z2ETwH4qL3KmMIyHx29aXJN2qfAKY2qK/FiSOeZ4v4EvQkAe46QbJAa
+dKbKTFGLjCjIBumKojHgvpz6uVLrSLGGbk9VdLaOrqXcWsVaUmyzodvbbKjZhnLVWFVHAF4lcfV7
+5hGLa8qvaQrQIrXWjW5yk2XbmwztQI32eiQZrDO1jbEp74aNObj1jTo3a2zQoRtld6YCVo+g4fby
+6nzpWtjc1MLuMKwwmBYeulqvp0Yeum5P07GaSJoKUzB1UzqfXN1k+EdTPfVnoNy6JoU9UkRNGVv8
+0xGpZKKpM/pIPDCAosiGjGRPwtM3Ikr/dsepHTkvobUehZDMaQrKf/A6MFTjL1AWurB3DIDuYbow
+1DRP4FqixlQRbUSsCqNUKELmGBX3Nd6aklCaLErRqN50h7TzREtTAkqdYjBlvDXln4Xp3s5ln7ro
+czfsAX7mYFVKgKU12MQWQGsP3msDSHQL4HavwpaqPAYF57UKOQA668HHbQCvblWRKBaEFljyWWNJ
+Z4dFm5u9DWRzDRXH67hE1hTJmmoqVwgVk0JxzzjRRmIigpfuHWdkUNhKwp28kq6rEvO3qUO+PsNc
+Xotd8gGgt7bzJp7xDUJ7XWq7w5rVDClAgee/RGpQ46egP4cOacQaPw34PIBE6M9khzWuGFDGz6ZA
+elIhXcGgEH5GHZKaNX1SAxIfKurlIl4svediXS7NbekT7E3BLZfX4lO9EmH7NQG9pg==
+ ]]>
+ <![CDATA[
+ oFvQDyxcUwByGoROQdmxhLoGylOwekpa78H6iDhgSlIwQUAiFMZfERnFm5Qwyqj4V+X8TNKHFep5
+TKxewv/B3kul7cl7nFzUe1E3+bK6YtpiTvLq21/d3nx5f3XzeHXz/dMnv7rD3/X6d+v7x68ff7w+
+wDbv/6+b2z/d4L9WHzx98s6/fHl5v3rxn//x3eWrx9+9u3r/V5cvD6tfwOO+vnp5d30wD8xWX1Ce
+lvKt+eo3l+onX6mT09E7gm90o9PWnFdcv1mrh5p//aj+9Q/w3e/hZ39aVavPV//yu2z14in87isl
+c4bNX8AxfHkJ72f14dMnq/e3h+/UN/ie4AyId8QnRZ6A996Tp+bLy+vD4+NBH/+Xz+Yc8Dv/8tXh
+7j//4/7y+8Pv3sV3/Jt/V2dL/PTpky+fw5+NPQLzOsd9Kp9dPTwGn0T4VvXDpt9t9CXzTP/y6x9f
+Pru9Vlv9P/xz2Mz/aeoV6MC3t89fvYTLb3v5eKmu7Pf5B+pCUf+8ev54dXtzef8j/eA3n3/2q9sX
+B/2vd376gh4Ol9vXj/AK36/e+fPL6xt4xHvqL5VifVddgz/7Nv6AP15ev+JH9Kv3P4UXdn7/+OMd
+//r99f39ZfwwXh4eL1/AOzjHUeQnH8UfL++vLp/BjXZ4fHhjjuTNOJC/9Pn40D7q+Q9X1y/uDzf8
+KP+KFg+9fIQjePbqUR3uL/TvfhF7Ux88XCqDqu6Zv8JnfcR78w5cPe3hgz9OH+87/+3m4Vv47B4+
+TDxWHnrxV/hY7FuJfUD4y5nv8vmrh8fbl2/2+3T/OXalnn5twKcN1/Kv8OxMnrhnVzcv4AH5m3rW
+5JuJXSDXt8//cHgx443e3N6kzsdf/U3ym3j918Yx99ObbzVeyxn7S+4mUdcvtIRSn0vAgPnKADi4
+A17drT67vPn+FYDc1Ze3d6/u6Akl0LH3vzpcXqvn9KsvXj3evXpcfXX58Hi4v/r3S3Usq68OD7fX
+r9S31kVtbm+v6WW+vD88HO7/eFh9c/jz42r34urx8tnV9dXjj/zo2nmJzw8PP0y9QKMaXZu30q8u
+7x+f3V7ev1g9v72+vQfcfm8u98mHfn9/OMze95m9LFVyu0s/thDHMPlQeQxAN/61rHN+x6uXtz8e
+bm4UITF3SuzT21/D53+4Odzr8/24EjZt8vWfhXebetzj/eXNw90lXH7Pf4RjvHqxerj694O9lMSH
+zNfZ6goO/PLxAFse0PKPP/oPN2CabuGK+v7+1lxzefJQw8361d3lHbzph6uXr64vxSUS3CkV7Qob
+8T4tv9kXd1cX/rX7cHf76L/e5fXVg/+zl5cPf+CbpeEL+e7yhbC3609X61ePt+aqNmawyvKLLMsq
+pSw2n+7Xv/742+H+9m5z++d/vnrx+AM/+L28L9Sji6paFVl3oaPr8Sf+5reRWzFbfWcukju+KW//
+eLi/U4TvYeIZz6+v7uBTUHD2z3Btfw/nNjgX3lPgg72+ujmsHuHGn/nQh8f72z8YC6aCQcZgyYff
+45l874+H549wAT+7vL68eX5IffKeh/j6cP3J5SPcPp/dPr+8VrfJAz4g7k/Mo+EwDvefbp3Hyt9/
+o9iLemnvw01+Rp8crr7/wTw6o8eusviTfn11+JP8YD9Ul9rz2/sXhxeRt716/1e3j+7vzecKu6mr
+8X8d7gN7Db/68vvvIj/9zWXUIeTFCq7tz9QHt75/XF3evNBGPvQI0saDAdh9+fWK41n4NG31/ae5
+L6afNuPVpk6FuU3ftz7z/bvvX/7h4uXl/R8ebr/77uLZ7SOAfc9ryoc/f3nB99Dt4w+H+3kPff7y
+RzYWRfyRcCceroy/nnGk9/Iq2r2Ca+uw+vTrL1bDLZjhF6v9Fx9/tS5auJr+6ebqOeAEvqiCI7z9
+7uraJ5neg17C8wOiKh9z/+L+4UITJT6k8VfGJ1ze3Bhbm8feMT6K7/6Hh5FzrR/56ub51GMAjsL9
+ykYanO5//kfM5Y4c+p/vLgSkjb0QPOL27sWrqUc8TO7x/Hbkc4FHKNs88YjbGzD0j9q8jr8cPVQY
+bbx7Yw8F3BK7Y2MPvQ8e2tbxR7rWPHo93OmrYeJagEcBEPIeKEyK/9gfLl8c7g8TO17nygde+oDa
+exScw0ckhOMPeqnswoM9JYkH3hy+B2jzx7GbEx4FVBsMHr/NxNEf/ni4Hnmx724eLx5ePXsYe3vq
+MS+u7+6/u3VAQ+JxwmTMMGaPt3fzH3x9+E4cZ+LRcJMfXsQs+tTjpV2d8XB75DMe7B55+EGpByPg
+fQYceeqBCovBfS3Bb/Kxd8Dvrm6+u5188Xv5duKPwXfDD7oo6uTbfnH4TmG7PwkwG9v097fP4Bp+
+fHl5F5iKCSeCrwJPf7x6NB5szlO0oxJuL/leH1QuZupBrkuJXgbP719cKMR9fXl38ce5Dxw7aepx
+j8CmDdGKem540MPz5zejt7V+0N31c8PL45ZSP+7y+mDewOQDf5h8p/ffzzgd8CDeKeY61GPubh+u
+Ju4D9TC4Hu9+uL3/94mH3d4rfDp1Yz2/vr8wLOrZ9eXzP0w8mH0xEMyxm1s9VFjPiQta3T0TcEQ9
+BA/y8kHfZ3Meeztxe5gHPrt9dfNi7P2oR744PFx9fzN5Ru/u7i8w+DB6TahH/QDm9OEwaqfxcX+a
++bgfDlNmX28nifmEpYGHiw+my4qLImoq4XFXL8E+u56q7pqLbvzx0lN1F9X4g62fmnyo8FJdlaeP
+wjlndV+n3588bVEUA48Bb3H56nrUPcKjjuEYD4/X9Pi7uxcjr64eR69uHzhjb3iwuk+vZYB7xrPU
+TQMc3D5p6pj0Ewxj8TQcY/Tu9vr6gIxYBAU/NOFZJbdY86NXIoQxxaNTd7l6PSCfE7bgHrDo/cNB
+7Xc/cgbUQx/+cHUHlvWGLWucfKIpggsXDMf38Xf5D7fPPgX0I9+jG5nAeMaMwERro8QUltCxvfd/
+rSNSG5/DiOCnevQXFO762g13BY8bVNBtoKDbV07QbW6cWG0zFhyWbwXf/tx3gg+efiP4sMXvA3cZ
+exu5jAnf3Nq45urqBsOWChn4d5r9PPwoaJb8yL4RvNg7c6O7OKdLbMJx6a9//TEqfr6xqa3C/moP
+ZEv8xgnmvbh9dsAw5t2l+aBK+1Q4V8+vHpzsDP9q9/LZ4YX+vCMbf3OAz+syOGl0NF8DTTw8Pjoh
+fv799putfwZwvz8/fnHz5WXgAmhHFY8V95h497sbMG32lT6M2CIhE/OUSuoT1BImdQD8y6dP3le/
+kD9SNm799fDpp129PShbijv//KN6+4fq77/4t4+yF//t6/8P//lR/8nf/d7+otx0Zdf87+bl//7l
+e/+2v23/ucxeiKd98u1huL//6PLm4+tf//7Z5t8+/8f1+hc3+e8+/Pv81932py9e7eBltsMn//q7
+/H+s25v6J8O7/1g9lH/3jz//+18/ez97/+efF9Uv//GDD8u//+Zxs/2u//gPn/z0q/95uf0u++1H
+5rfFz//nV80PP/nvd9/835/84offf/KTnz+/+NlPfvHti3/5yS+K/dc/eeeTB/Vu1E9+e1F+1v/k
+5x/9z7uf0cv88Fh+dPfuL+/goP/hJR305Vcb+u7f/uHv8d1cvP9Q/1/47uu74CHwDh+6/c03xTv9
+b/8OXgZOVY5v5At7bPf/+vB9By/dvfr5Rx//5L9VD8XD57xv93H5zx/+9Dv458fX8Nzfbvmtf/Zw
+f//hw/++/92HX36RvV99/Q4eLL6qehn9wh/n/1r95ofPfhF91d99v/kk+apN8fv3f5J61Wf3/+f9
+n/+zehn3helVf7V596f/dHf9WexVH376f5pN6lU/+egf25tfe6+KL4MvXL37m59/+PyLz2Ovev/q
+3z5453/87Jc/+bfYq2b77O9/mXjV5qd/1334Xa8v6MjbrX77r9n+m80/Rt/r/7u/++BnX1x9/lX0
+VT/+6e1n3qvyfYMv/N//4bPq89RJ/qf/n7337IpbidKFv89a/AfAgdiNSlk4k22wjQM2OIAxxtnG
+Jtw78+X97e9+nl1Sq9WSWh3OPXfdmQk+dEmquGvncP7uxH2EUed6dnhz+rV3I7ickc/8s55zXb4O
+ELAD787MFI7Wfxlt/uSocqs+rneP+v78/auPzytGXT4K9j59WeqMKsPkBj5svXxSOWq09PnFTPmo
+t6fmzi+WFy7KR92NDjGMBeOe5V7M3D0wFaMGX+dmVk43y0f1594v3L71K7dWDJM/2uPg2t/w6nHZ
+qM7G9rOVilHDazeCOLhXMerBEQB64+zly9LlTm9ev3Nz5/TrXumom8/iV1U7vHWzNdX+qqOuv/ux
+AUjLb/L03MXM/UVu8nzPqFtHv4K/838cGTX6Uxx15+GT93bUg9ZsYa0yTBS02286A3ct982Ks/Pr
+WVQ+6sPpq3jn4CQuHfXpz9Otzqg4m+6Bt9t//yxWjPp2wXmx8/eqfNRt73BnY+PeVNmoOJuXD789
+rFzui8fhyw9Vo645r5zDpHzUnda1l5+O5m9xVBmmuNxXh3cuKkd9NXt69Kdq1MfO69a9lbJRZRgZ
+eH3h9f34fLV0k98svjysHPX79MudlYpR34XO++MPCxyVkFZY7pO9bz+WbzxZLB318HD/qHLUs9N7
+s1/KRpVhMPBj58P6zlr5Jm/smen9y2cPy0Y9P3/SumZH/ejNFS7PQjK/7nFUGcYcT19udmOo5fMr
+b9XBqIs9oz69M/v3cH3/vox657ww6sLy2cGiHfVHMt8ZFRgaA9/4/HZaybu7cmAeduOK5876k7eb
+GLXVS2WftK7/9m7tyqirl8UdXl//3uaoPJvZ9cUCXpz5tGAxlHd9eXW7Gy+eLtyJn7zFqEu9o4Y3
+pu8cbG3JqI+mOqNiGLJZ7srTr7rce8vP2oVN/n52Z/2Hjnpvb2ene4flcL9/PSOVFc5qdzX/1L38
+NeUu//6Yshy9L1zdnPI+/fpT/tSfk8tzNzitenouEPH4W+dpAXX6b+44O/c9ly/0YvQ395yd5/f8
+qqcPnJ1P22HZUwXoN6vO46nXcdXn687Tk4fPq54eOS9Wf1xWPH276Lx4dW0q3bSSF9rOy/uPZ6ue
+Bs7e1N92+dPbU8751VRkn5bQG//tlvNqb+qOvlC8UP7bR86rL617VU93nNfXkwdlT3XT3j5xXofr
+q1Wf7zpvrkXvq55+d97vv5mvePouct5//7yYbVrvC4lzuHfLq3p63zkKj5KKp0fnpj2/HXSeFjft
+eNYkH9zHFZ9/vGZWbh5uVD19YbafTT+q3rSTM/Pkh/ut4vNPc+bg+/bN8qfB4e+Xt25fvil/6l7s
+Ts3MPXqSbpo7c3d2q/uFB1Ptrft39WkRz7mXP6du+4++556utuaf50Ww2U8vF1bOLp5kyEZlNH/x
+OXDQigDg6UqZAGpFzHvmxv2ly5nVjZf3ooO1NxsHL9ferN9uS5uzsbrSPlldXVnaXg==
+ ]]>
+ <![CDATA[
+ yEtwH278tKvxFK1moy/cvebNUB4kToOk87aD55Yex79nnKU7+1e4I28FFX6+nUmr15a+3fk4J3dp
+ev0ifra8W+Q6z6fdmTu7LSUckHRyaD0/avAVks5Z+aj+wX7ZqCBrHHh641M3Ws+PSkmnYlTha0XS
+Oa4a9QNHzQF013KnN1tJbtRPN29e64xK7j8b1SvsMFj/W+momz85Ks9GN3l6Nr9c/8X1zqgiFJp2
+5ajk/itGDa+B9X+X4zrtwNly31aOKjv8y60clax/YVQVCu3A4P4/VY16Wj1q/OTZfvWo4CPyXGdx
+k8FKHFWN+qwHoK4tL9rx+ZcF9+UyECh/9VajLv13O5XvyTBdr87t6quKOtydsFtJ1HWDN65E4p55
+u9pR15B3UzyTbq6XIRv58r5Z3DOL2T9v81K77Dn29U/+Vn1Y+I0+nmeTeCYi280zzG61oy7rjA+A
+fhTc0H9wqq/zLLAd4Wm2kDUIgBt8paCLupts7u3Kz5s37D/H+zlm2YLAs84llvffrpn19xebOWSX
+m/Td9Rv2n8XHZ7pByrSnyLmzBoHDVd3DPAh0dn9l6evp2g38I5B5z3nYmVbZnLJXKua0uK5KSPlv
+uqumTEXIjb+q3PjOrvMfu0JK1+kKOxhaF7k7lQeU8hXyn+d9zlBY5MedM6TaruwYj67m0+mrVFO2
+wrPspPucoQzT9xhvLQy4X71dcTW2t8UGvTWC+c2DP4WtzzRQA8OX89lMH/S7QenWq+a2Zvf7QWuz
+G6RE+pYzwn51Y6H2WQ8WOliE+qFrhGwLBjyRdSxkM9dBzg4ge6gATUQ0d5PgWb59B4uX9dMhnuc/
+dvuoTS2/nuvvXk2V4fHq66miTcni7pntne7r2b2+ZotrXWuw187pbvsmLQ2pMqVnpzd3f/Vf101d
+VznMH647pxc/XqdajrIja3hef7oJhlcO7pvbNy2kPS/FM+vv1pYG2puKjTk6z3Ba797cd04v95Ys
+BGUArRJMaW8fLyq7Agj07a37Apo/PRfwo/u3ftUpL9D/Am5AqfSw8gICf80IE/h4MUNPsx3Y6FKp
+yvvHG+77q5XtfqeKf+z0VUHdCyCywg4+tBi6q7fFlVk7rfzcFirg9njD+bzafluxzKfPyJUBdXZz
+Z3XH4v/tOZYf8Xk92uWpp1xnGSLqvC/r2r+oYhIasJJP82Rts4hli5Sq7pC7NvLTpjm+PrPVzdyW
+8FWNmKofyVS//brzcZZz6rIUlk3LXXmTPCqnntl0+s+J7OCP5FrltDp0pNkZ/rhedoZWIiDSvVZ/
+jLkz7Ob1GpxhnhAU98s5PT7aGw9EEKd9P301nt46BKbQFTD04L19nvm7P75N68PwDbhpn5dn34xp
+0wrYbeBNs2qwVGdzefdvQbp1V/YPK/ERuM4BOOcvW82lxS6ancdpW7DBbDXkvku5B1nSj+lxXc8t
+2Ei2BxGn56oh7cuWd/3W9s7gG5SfTootOsztEBt01G4qSNStph96aDQTJydG9ZVqKmfSBx+kM6nj
+OjEZt7F8VT0Tuf2py0gD+VHGWv5bTkcv717UkD8BFQ5TkB9pwOz2UEo/anFOHT24TOf7Q8EHx+v1
+EKnKlGyELg1IbvveX/xuoP7ooJG5wh6mDjCcVoEd6Sc1V8/p8lo/vUBTVPBwIFRgOZviIjsrbI4K
+6lYow7jvLxdmRtn4HDBUcQ8delME3gpO/97s2qWZX/m+MdAKKXiUHuPX5jezTnQXiWjz3d+CUDjC
+ftWS+o6Wo9l+1V/2SohIMXT3ZW/3XvZfj7ove4UYV6GL6lKmeNeXp6dHVDr8etStGvNyTn2Dyhz3
+zPbNJgqDTDFJZFNxp2RxZmbkxXn3Xr18nLcUVutCKkmSdz356zRYF1n1Gl3IIxnm1dnISyJz201o
+B1cS3TOPrrqxe3FjOmSt394Egykru3U7eULwqFa9U4YUulQS3Wz2veXdyw6bnaq7vXt7NxroH/uz
+2X+2y3RshXvTf/vu7ZlK1Vg1XSxXQm4XSWM5WOS55MrFkS6Oem/u7d2ZawDuVr6pgvg/20WCOAS4
+Lz+bovI+TwuHW9INv5l2sBYVbJMCjoIKlBeQvSkQv9K96c/mYoO6KV81QDdic2dk6GszOaOu/LUq
+bbOlWvK8UNjwAu6/qLdulIFFh7PpHPzm7q8yCjiMyg1dQUXb4N400NJKb93c6XAYGpfHjKLGt2eD
+w5ubHdUewF7my3pJMfQgHS0MPp1u1960o8WxrKvV6aUgezajhd29tZuxHM3sHHNzvZzo/sum5gnI
+N/30ZNLbqOQnJ3tibptHpR4f1ZbCyt38dNNdanY2eaN5HXYT0SaYK2A3aVvOsXc9/mkDYbe9pthN
+702VLVAYzvFgN24aehuTDUq6KsNugzJQUGh748ACsOuX4qWBsEDBm6IW0vp21Go6HUrSNR01wST9
+p7NUdEvoMt18PVu4k8JSOX/QfWgLlXK2KrpyFsilUt7F+pHZKwOJaL7oMyZt1Yh9QI+uVXnwsAE+
+KnJsRSvu/qtRbMLFrjKM28dfoAHPj966HCrKulJlSq33webBHwrdo7DZVsRd7PaZGqIj9lLJ9XcY
+qIYdNfSqKPTSpbPRjmol76bTKfg0lRmL6/j1Ym8N9V4d/7Ra+ng8vblQpI/H0zsNZJ5reZt0JX18
+PTj33wuqVEKOjft/97eSOBYgrQl9fPe3nvsvg5JUL5A/WjPdRD/TB/0fTz8eD1mTjhpTo1qyJh2N
+7JzEXpxm3nb9OzL1xDFzhm1yH810q87nooY4ZiJukT4uzy720Mfl2SaHUUYcexkomczby0ZeXh3X
+jsr1L8+aokEyP7cubqNzM6tMeCJI1F/y3Nk0uOfS23BMcKn64ei80T1vADTLs2Hdpg0kgMppvurD
+f3a7wVWg6f1anXcT57+8gpjTqlZmNGBCC2TKXdk/aJFMdQ9T9McYWow7KJCpopeq9Y6rdY172jWx
+r5Xq69xuFtzgKkFmtd1HeBrAtRe9NSI1VX783V2FY1OmuCsH0zcbnGaeF6jydcSBNvL0VdiolqQ/
+XhR9sarAotmcerTJeYBucM/+5K+H/OUsbRyVQrU9BE0N8xQR+Zs/Xx0fMR3MRnL9/uHGy7u764OH
+89XH8k3YcOyRw/nS6ZfH8mWbNmo4X30s34QNxx45nK981DSWLycUjhbOVx/LN2FDF0cO56uP5evI
+NyOG8y3UxvJNZKGLI4bzVe4wY/kmqkMXBwvnq39vApHF4wjnq4/ly8ueI4Xz1Ttg5+2eI4XzFRyg
+CyS8qLN5u9bIiSbH8FVHIv0tkrXm0yrOqY9zlnBAme9gn7itboXUcK6yapB8u9bNG/ffqioBeHem
+1H+9y0zUdKu6FVLVW9XZp3IL+1oP8e/xWrrWJZTVxQPCC6jbRjA8VJ3VA2jqOzhkEF/TFRY0UJhW
+QxjtO6e8KcjaCIbd+H6Krvp70yR+rx9L3QW01a69h+tDKhw7A8rcn14WQn6buZiUnMN6AwNfx9uu
+j7r5cH1w9VZncSkWkPW9uzaKG4UNu6vwLyk4XPYPuxvOv2SiECG5NrLBZr2fRNB8b2r8S8qllDqA
+bhAoViPzdDl48Xp+dM8KnEV/JXMzRPHRveqrTGkaqiRzOurjp5mP8aiPe92oNYz3UbT1KoihuXSb
+aVQqFG3dikYwwYvWZaSj+9/E3qyPzGNojFx2yTKAzutGm8ejIabwsh+LOEhM4eFVPeEcKKawH082
+n9dxVc/ptBiE06UXaBDqmJtTjef90+eFgNGJfjGF/TzvB4oprDZMD3RRe7We5Vxn8976RPgUulLV
+UHVvS+NZJhVdd171SWMwyDJLbR9Db1qfKIMBN80bZZkdfbHlOjWlZZcf1ZetfuE7jdjcLaqKC7rO
+ymtfFZnWJ24v7aDGtrbVH/fwnpu+uPrLFgNjxiMPXt6rvuR5U8RspeIVfdxsqhKoRDaXdy+cPqlc
+suOu2pb6kD3emwYnXTCs1EhEVU4WCLarNls229K7F/VCXrfsWbkjfcN15+ttYCmywZL8pkvqF0Iw
+u3ZeYC8J0BdfLgeQkCtjjdarA/R7Abo+BGowOTvjLHusuA/HowvinDoXv4xPG+Tuy1Y1ubd5+01N
+xN9AuqASJtwytw8H1QUNGKNX8ITsO610TgNpb/yziSzjWMm0hoOq3jn1ZIAZfqsaxOLWTKtbe3Pn
+sqi9QVhUA+1NHtKqtI6/Ho2svZFhvOvLs9frxdmG7PujSu1NUcvRQHvz69E4nJNkcf7syPFwBe1N
+0cI+QDzcINqbifIgWcTDDeGPXDyqTHtTo7ZrtDcNo4NyPlBVAUKyQWUBQgNFB+UVxEu9jPSf7X6h
+sY0Y6W1igVG9A+8tP+vjF5bqBRpINd69vahBMGup+qeHSG83cNTtv7i5wuK6fTmaAer24GnPJsoy
+XCLEr9oZonmIXwfjTpRktWoe4tfYY7JGjNpuGMBSEczatTv0h67WnPaN8yv4AgrCnCkaZKVtrq8n
+ZDN7W7/IvI6NoI977miReQVrVBqcN+7IvOEhbaDIvDpn2DFG5o3DGbZBZF4WfNG3o5Ei8yZyoYtN
+ommGjMyrQJ3jjsxL/QUGjhMZLDJvoj5nyrgi87Kz6Q7Oqz7k4SLz0mEKwXlD24U2X52NI/Af9K7P
+qst4iwquE701wiQNXC+lK3csLvHzD140M3rV8rAIhBwxtarKN+xo5PQb7KVbxK6MYe/f0TApAIrO
+SeyooUGwL3brZDfuEqNGcbEWLv3ufDESaP3d6p++bgnN7uNBk2S3aiPoE1DVJ8dLA14/s3hIb9VG
+1QFdoWd6BMphWPXVwV0lSll1xC+OnuqYvdjLOJKIy47K7+NgWUbY0WgpOdiLQtp4GH/O6WNpYsge
+ZNMoJw5W2OOwhLYqsXsin9uuSZDs8fTzBoETfXHa6/EFyb4ea5Ds6zEFyb77O54gWTPdGkOQrPQy
+niBZdDSWIFl0NHqQLMLouiXIglDYP8y8cFGqUsEW/JcqQ0mK9/HovPc+Hp03VYP1c+0dU1Beh6yl
+cXn/SFBe4WwGC75tHpSXY24rBfwxBOXlNy0cj+xZFpRXK3tWILEhgvImsqqL5dMaU1CeFaNycXm5
+YfoG5TXkGD+i3loNmhos+z2ir7p9LgqGlcFD/H7Uy01Fi4+y6qVGH/T2t95+1NTvcFX9BS7r09U1
+5WwOignXq6xRDTL0MpauQYa4rhzIvdYo4PalGhvQYLRC5oR85t3uPEO5u3a4+RXmICkZsOPUxyKf
+s8+vR6il/mJK2KidqVbcOpqa375lphbXnr+eWnx1+ALV1F9Ozb98EOKvXby3OtXaPgqcpf0fkSVO
+d85+5Ge8df17qoHqDrubrQm7211y8tvcFXZ3MXP9LF8FthDsF3yd/Xj9+Y+KALi5d3Vhd4etylGd
+jZXwabfDZXdQWFeptWLY3WFd2N1UUDbqRBrst7l5fpAttxgUVhMAd3vqfU0c2rP7zw==
+ ]]>
+ <![CDATA[
+ uxmoQtjdrZ97TypGDb7O3389/6cqDu2gLthPNvlL/miLYXfvt6qD/W78WHr1sWrU4/pgv01nuXLU
+84svj65Vjjr17lq4V12ncGqxrmLgw5uFo8W9bXF8/pUGBV59KntPMXT3q0+vnTbpcvrpnakG751f
+Hf24keI0padYeA+XmiqZ5fPF2QKBrZO58v69E1XZ4ArM7e7NX0Xn/KISts4PZKJPTa/uMJthaqCl
+YpRM6/7fptOqnVN1iZpyj66RyuuVMcYTJSkmRiyv13V8trZenlUfbqtmpgf06KqpFNe32kqX72B9
+LbzRK+tlXRXL6vWy6k2BoX+hldwKrfdD5bT6uqQ3m9NEkxorfTY+m1O1K/qg98b5vOO/azSnvJ70
+T4EdHEdgX7UpYqyBfWWcuNV1jjOwr0w/VqogHi2wryyqb6I6keawgX1lXiVVnpAjBPZ1LclG9U3U
+BJQNGdg3hLp7mMC+OoAeY2BfWVSfqh/GGthXdggdZDO2wL4y6TpFNt1HO1JgX+/EHtdacYcM7CuL
+6usXsTJEYF8Py5MvJjy+wL6yE+7VC4wc2Jffr5TD7vACYwvs64BKlx563IF9ZWeY80wZV2BfWVRf
+GQM1YmBfWVeZr/r4AvvqjMVjDOwri+obbdP6RgcNtGmDBfb127QxBfaVRfUpWRtrYF/Z/ZrIFRAc
+U2BfjRvcOAP7yqL6ynygRgzsKwtBKxNxRwzsK4vqK7VGjRbYV3ZKPd7dowf2lUX11cmelTvSOP6n
+0pA/hsC+sqi+lN7UCmBVtgfMqZmM2ONz2+25uXzREz40u9aX7+gN6CsVo74/7FfGs2n0VYo3mrIc
+A1TxK2ODGrEcg1XxK/PIyLEc/av4NdyqkhrAPT63Dbfqa1+K3gUHeYmgCAeVNXsHnlOPRNAIPEvn
+VFurd6I7gLnftAYK152rRjaYVrV7xmBb1ZN9tBlF6RaZvOvJj6VukelRMRFKid2zmdpsyOJ/xU0r
+r/83BL/eXfyvIBQOqmluWvyvj5bD1v8bRXHD4n9j8IduUvyviT80YvpGLP5HZNO3/l/DvakOlcpi
+PJp5twxb/K9DPevq/2WhXfXF/5rmthNKcW1UiNgeZ4zHn+2BgptUCVkVZr38bORoom0S02rvh+Yx
+fQ3cG/t6d+PgR47K1bDSZs7GdTcYNfu6qedQ4XGs2NcHddc5qXVJBNigaAQntUJI02xHnM4BNOIC
+K4jfQJQPWv1ifNlQLvEyVb+PSnkAVytKBGNztWJ6glG90V9UelkNGog5SgnOjl6AHY0a6MteSmhg
+AXU27ajuKg5QQ3JMdTi1K+FiG6DOptG+309ne6J9v5/2t0Y11ROitz6xM128QL8AtO+n840QW063
+VCx+kt/QF78bxU7nhc1al+1XZ9Yg2e21/epsLMkLVjvOKKMFxuyNtbjj3liLO+6NnsGABQRLmPsy
+JWS/QMyFwUMoStxH0dHIdmLtZQxpDLSjhhy+lW+qO6rxRhrALXbC1pBsGkXRLITi4E/hMqZ82pju
+Y1Xdv4nB4j2HrftXqh3Ml/4b8j7muzKs9T3ifWxU968vqz6eun8TtoDg6Pextu7fxKAFBIeTuLuZ
+25LSf4NHp+S6ypL6ZP7Qg/Q2eN2/cneehrEb7/42dZ2qxWnC9fWJl2/K/ExoFF4j6bJJtK+ZLq0v
+n9o9G0f7Hk+fNoj7aBKIOYZo39cF5dewHl3sqLkAXq1VZ0ejR/u+7pfbbsDo+55c3AVPyCEKnPV6
+7SBea686Pjn1HWx2H4/OhwykKidr+5WxVEMEUs3c+ThVOJuhs+eht6/V4fMTufTtTQR86e1Hg+tZ
+revs3rRaKX8A2fPonHJ+c9mzArsuz7YbBFJR8GgSSyXTqhHT+3GMxGlFpvFjj+2WbSNwjBn1tGF3
+n66qznfQYpir7RxS6DWsDBp3+/GigcUn87brF3crvY2QVavgZCG9jasY5mo7qtu0weJuV/aPmpTk
+ABaoi7s9GDzuti5zEqbVsHRDHa3oXOO7wePfnQG7PVPsOexcnJ+7l9dtwOCj5ABxhi/xz/2phZP2
+I4QYrjLOsO3tJNez47tZmJ396+h8WrFAFsFlbpznL2p3abppdzmpKP43fbMyMu/86kO7VRDYu+v/
+3Xa/VJfhqyk56B+8KYxqQSCLG/tuKkd1Nj4/eVE56k3z6OikatRPMkxdabqVF7lRu2PkLq59Pa2K
+zIu37v69/itbK9Xd3UGXpSGB6SbfqSvDlzhVUYghNu3681/uYVVIYE344/TGhV896ubih1edUYkF
+ugaeOZ2NvlYFXbbrRt2ZqRxVhjm/2Ls7VbncqfvvWy+7jvY0ScfnX/Yw5lbffPpV+Z7itPTVw6tf
+v/t2GV77e7i+/7Tve8FXC31CNS0WQJTOuwcFjjTV3sz+6iGmG1fn1Zgpo3wd8jfRU8Shm5HNWZRS
+dPp2bXDvzHLP+zXIYxsVCqlSZUpNVT6ww93yzVB6p7UGDp8T/3GjgblMTm6jNIdQUyY4z9msjey4
+1dmqgtdWrcNl/VaVOG5VmhUn+oTHzVcKYAOHx/VxBh0Aqip9wAb1GsIK+zrC966wVPBAsF2dG9gg
+c8qH/I628Q18wBrfm1vV7u92Or1+uD3JTEryex6uj0U3vV5SMWYIze3B4mUDXdhEoypYMtVX9S42
+fWTkPLJZH4OZ6KBV6qgzoD5tfUg1WFGfhpDEke3fiEfsVrqUoc5GIYmNEq9mG1NOPdfHl39yPc3O
+M0Jv3a4opmgcQgDg3wam7ybI5nhjjJL0R296FB1yl40AisSxJeqS/eqxEQyaL6mgfvkR/yl4JBR0
+khPlJV6bx9lV83ONMll0xyX2c8Tv5yDbsUn/iPukYhggNuvjVIGpy6POEptKdZxddSqGZqx617S+
+VgYJDFZtUL1Uu9D/CLGllVV/Oia85rGl54VQoQYQMVEVXI7e+okxzSeG4Is+pcoH6K0S8IfatL7R
+RANt2pD5USo2rW9N6Oa9Vda7ywhBV2+lnGNZSGLTeMRMCTlcSGLTeESuZviQxKbxiNZGMGxI4pB6
+6EFDEpvGI3ZxnYOHJFZLCZWuVsOEJPacUkU8Yt4BZoiQxKZb2qGeQ4UkNo1HrJSkm4Uk9hdZa0x4
+9SGJT/fK11VXrDCFtH+4WGEFQNcHjw1eVq5c8Bh7scJ6tV3DeOb+xQothm6yVaMUK8yzg/9gscL+
+aruxFCusj1gZW7HCiZL07f9AscIcA9V0q04rr/F9nU6DrFZDFzxsktVqDAUP66sdTgyW1aq64OEQ
+Wa2GKXjYu7h8tcNhfaB6Ch7Wq5CqeOiBCx5WBQB6Y8hq9aipN9ZEv3jP8YRhTNgIyZELHmZflFY7
+5KaNo+DhWOqt9S94WK+cmCgElA1d8LC4uG4tQJeNYJBIwmLBw2F0nUMUPOyF0ny1w4n/qC1J0bzg
+4fDOsAMVPKyvdtjP265xwcP6iJ0OQI9Y8LBv0NJ4Ch4OEB43pmD8kmqHlTaCBil6ugoejuB2PUjB
+w/pqhxNjqlM43xcExlPwsHmdwpEKHma9lFY77DV6DVnwsN6PbqJYK2LYgof1slyNd/dgBQ9ro2Ne
+lkkE/YlZ5W5WVTssMUgOV/AwDSIsr3ZYrrOpdfEuL3g4THjcEAUPqyLSTEOus2HBw3FggQYFD+tZ
+g4lOncLRQy6qqx3mQWCkgocDhpIMW/Cwvtphj6Vw2IKHpeavzFJacBkZvuBh1dL1MubI2mgFDxuF
+x41e8DALIyu9QfU4bYCCh8Ow6kMUPCwBt1y1ww4DNWxHjaqP9hFxmxc8rO9FydoYCh7Wq8vygTEj
+FTwcLgnQwAUP68XuiWKyxmELHtZXOywTcYcqeFjP/Oj1HEPBw/7ppsZS8LC+2mFHpdqsoyGVXxP/
+0VOncFRsXFbtcCiPrpKCh31C9RXSxlDwsN7tJzNFjFrwsFYNtqrG4jEUPMzC2Eql1ZSsjVzwsF66
+17MZQ8HDeuk+lW/GFXhVUe1wKNmzrOBhtexZqbwfpuBhfbXDOvXDEEG6VdUO++nTGhc8rA/StU4W
+oxc8rA/SreDTBi94WB2ki2qHjZSQjYJ0a6sdDsjZVBc8rLdMTJSlNBqm4GHPRe2qdtjPr7NxwcN6
+sJjQ5MANM7uc9pgr2VZNKyyZyOpGVWuEP+8tLxU1wtJW4zRb4u+fAnRpHGUXVP0pqLzkgHZXOwig
+Sz+28Du/CQet2YlcADNce3+v2l1Ne7NfHp2unp/fff7t/tLl7UcPTPz6hTtzd3qNryCqa2vh5e7x
++dSNdws3p6A1mpo53Po61b7z/cHCrbt/GVB2+9bzg4WX336cOevr35ec9e+tZWdj+9mas3H2bcfZ
+fJa0nJ2HT46cnV+fvzhPf55+dV489hLn5cNvr5y9i6+fnVfO5U/n1eGdK+d169Ws82Zxb855/3H6
+qXN4uP/ZOXruXYIQfPD2Z5wPj2efnZ+fry+dX7w7u3V+ZX6/Or86imcvZqKbYBKeXyLUdKb17dPW
+060nyef7r96/+TI1f/PG/u71+NbPlRu7LzYf3fz648b0dLL0ZPbaz5MbD/3k5tOP3/fXbs9P2DqF
+51cfpq4W//hPPvBYNADvwcbLlzec66efpG33rBSd2LNhvOvFBQJcd6ZaKwd+rkCmDfZbuPVzeaVi
+v5Z92ZGrv86H24dz5+dPWgs1a/Xn9hduezP3nY2V7RVn4/PJI2fz6ZNfF9cOw48TjPdMpmxJx7t/
+1xfuxE/eOksbR1OIkHzmrL+Kjlj/0Fl6erpYuFXd16irlOGH2V8dFS2VKdn6OgQpvxmXN6fmvv28
+O9X6/ezd1MJJ69nUwpvZ+1PX1+KniAp+hH9uTbUeBHNTraWZJ1OtePFIy43Kz1d4Cpv01Pzfa7Lw
+47+xhXMtNuouAJ1eN/Or5tbqt+MlgxUe3b+1M3XOo9pYdx/H8teLP2bxy5e78terv1QEOEs/ptv8
+1rue/Lp0nNn2ksXQ14ErZ+1f30/n5aOtOR3w88zfBfxcsD+XZ1v42bI/d/wl/Uwww+X6yY+/ibMU
+PHQe/DrbuXiw/fr1e8EMl7g3dqp3o7nOs/wa7t5ZyD04vr56J32w2uo8cFfe7N1LHzxc6jwQ1uzL
+g9wwT0327FBO8MZPZ2nzznynLT/05upi7kFu6M2HbdnwxXmhcu8WpJdrc+77i+9XBIHN54Yt3r29
+qStnafd+p/MjMpLStrGIV+aFGT9dIYoBhowFxe7EgqOeyuHuPl2CbnqRVFl+7rHTeR4Qh9l96y09
+fvHDk89fyhFcu30NLyzICO1fztLBTmdvPqTDfJDTD9+01paOb99c/vJ7Zm/j9rr/PYdJFc9u7j/r
+iLhdyv6UNO8kKSYdsMuy/lTXuZOk+JZdzj2KnyXx5sb9mdOXaw8/2TKesq59k4LxS3dhbfHG1cbs
+1sOH7tzPo2sWyA6O/WzpxwQyHho37ePTFnZpUbY2+i0/95bsBfi475iPOw/n5K+3Rg==
+ ]]>
+ <![CDATA[
+ eeOlj4fu3eShK+f18djjX90kcTVPAwWQuryGctdzUFTwLkMF93DtH00t/v3zVF/JUAGwALCBRQXF
+usNLN7HMWSt4COq2S3p6Os9LKbT4xTx3AtHGP5G0HaVQA4cdePderx9vHM29pZOFIIA2LvasFiU9
+vfgB7+qteXvPzfSSu9Z6uyC3+85iejbAAsJPSNtqGwzMvsre8s+c5aaDjaUOt9WBNOonBE2kIAPV
+SKofkcvrz3JdzqfZ2eX0Qi9zIbNm/XD5dtp2n/cLLMfzv/Jzo02IkGEUV7y/+Phj5ef07w2z+GfV
+WXt0+8zpxQwiq+tBCnowwi0AYT5Z4BnmuTiyMGBzs2OmUHjnT4fv4JUJijq54h1JGRLlNu68WP/k
+fLrxe+38/M5Jd/1ccCq3t19P2NBFvu+uvvzod1g0tqEq8uO0jw83in1cfdz9K3QxvtK61zffuI9y
+JJxtU3cOfqmrFfmJi72uhA0AY/9gN99HcLbRIYggnBq5T3woEPHEhX4fsLG1gL/aWduS2gi0WaBw
+8YWc2+Xsud5pIUhvchQ4XfXX+Ru3pz7kMihYJkWLX78THOVvygPT7ixdIY0x98o2HOZYg9trFy9S
+roDZGpJrJWWg0+K8sq8X0xuflhY6xa+zPAypE7maM7LK2VlShrfdmS/mc0t6e+59TJe03JUA44P/
+tzDtCVsduycHx+Xdv3rwVx/uewuditWyX2e5qnRyD9qdDrJEFUgZkUzbpZ88fUwQeHo63ZPEYuFx
+u2LmHNUextzsvbfvyw5DlnT/qrOkbj6t8WEgJ2bax7t8B7d+Pc862O90oFxnoQ/mwRwBIlRVnp9E
+52wq5tHbx9H5QAthB91adZubaZSFfL0q60Dlm1/dJarfVWxaARh3j4pw21lX13unFx1ko9lh7Ksi
+Ftze7Xr1bKqyywbL5PXcPZ/OxvqVG2vr8cFJlxD5LoOvg3f5Odkq7X8scby8twA8H3YQVYqhndPL
++zFvYYfAdHgX4St/vSO1FXJ1ECh9Xtk/IglrWcIZvLvAz6WUom/NZH/RlwNUHKR5vps0k1Iv2p+r
+bdLxdvbl0sL6q/0tTOedd+/Vn5WUevqzOS49I7U8G6G2OWa8m+TmmPGZezt30weW+FrKe3V4P32w
+kxMGOuMrD708R5qRJ/Sb9xdyzHhu6M2NDq97yFhYadtZsizP5lMHnM2CijZLm3suGWlVqVreULjp
+1QWy25Yx3H3YSinl1bwlZrs7beXIZ+7syyXbfe4Afxr55xN+7mu/3r2Xv1WWcueut+fIQJHDPHjI
+A13IyxcHT9scxluJvfjW6eHc59Wv4cbTlZ/xtTjHKfBwwWtqV0WDcM6KK10+XxpPl2l/e06nPxkm
+3LuzvPpg7+atD6tfo+0/D14++P1a2feVt/OHCsZzJ/vfUrHzpZcB2Yc8kH3cWcxx6Sq0fHzeJk8K
+9cP6u7U5ZdWPp18p095hWkXY87bAdR0IQN1+qPMFvekw42Q+rDz8IJ6xHIgC/u5Z5pkinPNCeuMO
+L1QQ/ja9ezMThC9S0bWtmmYrwQX+HF2HZJ738XN5IWUR5bplt0q+eOUoFpBrB205nL7bZGnN5mH7
+jd7CcuXqlkNFamYBvZk+2J7lhTaLzu8P6TZva14ONq/e+Jg1L9q2PYO7v93OoZ3FL3eWUtZ3x3GC
+j9swTm2b3CubK39DgZcvT8H6ClY5OGsrA3VtTlMadTQlZ/+f8Faxib3J2CTJ5NLzq5+n50/Pv335
+9ntSDvTWxH8sPXhozN7vT2cb56enL0//83Lt7OTq1+nvy8nlyaUHL1YfPoyDtdOTs0+nk4sp/9Sj
+C+3S2hEmwzfhrze3Wx82zqLXnvOpV6d3/Hvz56vvH1c+PH724MHib/P+1j3zKl679ukKoVFrq1vv
+3vPWl6hmeVluyZW+XFn7nGz+2Lr2/M7x2mfn4G7uKpHznfnz8i/0XFtI5HYDctrbqUV348XU7NYF
+VoOWAyUeKhp0WzOglOmoSwvWQjLzd8MbL25sJNeff1p9/+ja1kIS/Nl9sOV9fXb/88s/t9Zfrzx+
+JMPc/7z38smPZ9dezzzYCk+eLiRh8mbtzcbpPpe7+v7hh29U+3Tfk1mz8CNC7q6DwxRwHv/uKC06
+F1iI5s8UAhZTynRwbjHc5Sxg7OjSIl65MelfZhbaklmLXIOItxjpjh/+odjIn3JZ3p5TYuzcTpES
+M5HSycPuzNdMsbU9l3+QXB5nDxbyD3YWTrIHrc4DKtUPo9Ps2VL+oz+rX7IHhYsxr3ci17Y3m927
+J4v5B1985JzLnrWJfQVf3HcUQW21NsAuPzF6WbfuPcfPZ/nOP35ZwOY+s/f55Hq0bBG5iNmq2z5p
+3TF6b54tUUQxJ/ceYuee2X5Pnu2xXy+nLdo6Or9hqVXLh/7uZSuvVbl3/1Z2BZ6v/Gx/mX+we/IZ
++c7Xth9OvejAKM83w1c9+VxTPLHizm1t3C7rsqy/1LO3X5fPdu50LmpwuXv9dPP9m/jLgxdX17+t
+v/m062BdpgPGeS7k4BCK20yn5OdWv3YvykDmtao13bVnqxD4Xi+l0P9aOv/4Hl65r01KX15T53OG
+vzz9q8fNpkypnKKC7HoOigrWro5vIbac2GBl7uf57v2ly3BrZd19uVaBCjK004xkduglrET/GMns
+0EsZ5p8jmR16mbue4yeZHXpZ8Lqu0yN24LvHt7Lnzj3JEaLr64dBXmXzrEdl41608iqbk3i7R+1z
+OXuRdbDbq/OZ32z7Ww+oGbLapbP5Xg1V63FOPTWbHHhd6qnw2tSNletrBRVXegVEZlL9pZyEcoO3
+Wt7NW2+N0Iy1RcCBGlbZBpBpa9v7iyOPwlJ6oY8uu+yG12Yq1R2ZvA6NR5W6Y2ZEdcfC76YS7sHi
+73oVk+qXWDEgJ+HbJb2b6M5xuvB4oZmKKTpvItJruLzMTobRPjoqpvuv54/lvBY2mDmWqCPblp/F
+8p69Mz/M655EaOdJYJjew1ga8TDm8mo3aBJzZs9GykQNXRl4EgX/fkStjKDR1ICVkg70bBr3Mawm
+r+PT92HOqeijK7nt1ofFhsC4mNsYGaa2y2z6ckei53NP0lyzX5zu90z1FLFM3Jt+cLPodsZScNex
+NrdXu95bms/N6bd3azed0y+34/ww++ml4PH7F8rDZXliFVfd3XytBo8cgckpPp6e/rakdv9Hyz3a
++rQIq1NL+TmYdCyr3rZWnb1p0qKZ1Aonf8FHjqRZOfKMNCtHruaT4H5Lf76/OFVW3bt++/YHyvrO
+58P7X/LUMz/VArXNPegWUXMP9syn7EGB8n7OD5MXBlrXH37NmGs1TpvNnelMDniSlwOETGRM3ZNW
+/sGfZYDvk6WOL2zwxFFGeivcwZk/Ufua+Xh4I+v82YK+8vGPwS181srQ03V35u4sPL2etS07Hq6i
+l2cO8SeQzcnWU7bYfk/evDWptmhjIbPuKkPizoXL2d68bOswztz12HF/vrixvpjMifDmvLrexSnM
+WvON8JrKr/b4NmZeNy+XmnZZ1l+2aV1dOrkuzdK1i9sLe7fOw7t7/pMH0ftPs5Z9f/NiKjXdvnU7
+VusOkLlzV59+cOkq37xezHPpW3dw91+3LYP+5qHRC7B28tQqU9d+7rn2r6u3h2S53PW546PUr2kn
+KhiXJtKYJRGJ1flBbsYDXsX5FDZe/LGvyI1LpWB/tiMFZ3LrjJpjTr+f0l1iTs1H8J6wmqGFjEuU
+G3d/6r29WKvkcXYXqeJa+rZ/2VaW9tvi8gLxhnf91vqjsvAQ796rJ9sKSPgn1UHi2Z7l9AveFpTL
+C44WFM7vrrbUktrtXpGxvnJBoldbqx9+PICIm1fwbS7PAWQec38Fz8R6LBCTY2WQlcN9AMXRLZhm
+HxpztP77U141JM03pOnF6eXVH74SHK2cfvn2e+f4v04FGMykmXT4//pvlEwaN550g0B+BGjdEdZ+
+dvX459+r00kzN7kDBH+09OD8cu3byeW3s9/H5/81ucy2/cc7ew/XJpcn7etH8vqtyVmZlXMk78uz
+OeqljjDXI4wt7Lwzuf+/8S//fI5/HDsZ/O8+mzExV/5//7/w65H89V3a/vekP/l48u17Z/LThDyT
+b1smMe1g0nUi+VfurevE2c+d9Ke85Opv+3pPQ/bBRdVSncmlh78vJ2dfvNo8evH1+M/py//6c9q9
+uJ0Vu9uy+dzrVqvv9hvuuxyB/F9+93+efTk72lz9/O3nr4uGJ8BP/jPY6Hw2yElc4b9PB9r6IGmH
+fuxPtgK/HQROjP1nY+i40hi1HROFk63YaUciR0tL3E5MLJvvhO044IexPlrFQXiuPE70vTCKInlR
+Ona82EhT2A4EG9omN9RBjfE8/RatJpDBAmPnhO7iSHa15SftyA+NHddEPpviMHL5LaYXBPpeEofe
+JJfgYfzAbTtxMNm7UPlu5SP2cHbv9+/jX6efJr+cH3/6JndvbrLltH0/8Vycp4lkTVEkx9yOY18O
+Wva27Th+mP6nJdPy3FBWkriTJoi8RD6WOax8waqioO3JGidbrswxkpm4bd8J/IgNbhJgmbI4Garl
+ee3IRPHkPs4g9rCxAtOTrSSRTx3X7/009rxYJpHEk4nsbhzG7uTKCQ4Q++ZJl2HbDUPpsndQTMc4
+Omrs+ZMrGBS7myQuLpfbDmNjSj6MPDlGX17xnbZxnNB+6bdlzQIyRrr1XbdsmXJKATYS04tieWel
+8UJlj4K2I408Pz8RUMBCPwO6V1YqL1a+YXLpydnl89OTs/NPcta8Rk1Pcun56fHPx8eX59/+E58J
+onzwcNMCy8vPZ+e/9Fl6OeXGfjr7eHr04GGCa/vi8r9+nh51pmJfi/ojI9zj/U8Kp+4wcJohKcCi
+7lQ4OTs3uf/aIosupH2cYg7HYg4j5yFkRWiL1zaxa4AcTJy0jRdGk3LiAtzepIkjgTy5xNIQOXKM
+Jg5129KGE3wVtH3PiXIv4Rhj/PZN4stvTwAuCjBUnEREJ2iTM2BHJvRCvhTpb9+NI/6O3cDVXt1Q
+R/IF5mO83PYibEMsl8EPoklAfOBiKEdQl4zpum1P+tGhTNsL5G1pCxzZTzTEoe+hIfLYiSeoaNL1
+BJslYbomT0DelcEjE3DdIa66K3cyjDCQLNpEk56D2xiks/OAvuTW+T53z3BJHrYDh8dLIujSE3gX
+ZIlvIsFYAv+TntA3X261CWXHXRlIGtxY3jWh23aNH6MXN5E38FXotBNP8I2MFDqCko1gQLlrySSQ
+quvJ7sm9ixPZVs+0k8Az3Adpw17JOxHwgFwCfIROeHUFPwuClWuIkSJfjwmox5O5Yg1uEIMEs82N
+bFsY80OQC/kdOoJXDvCO7IHryayBukKcor1v0hDh1hs/BGYM0BD4ga7Ll40J5aG0eYnApPGlm0hf
+kgeyUF9QvoOFBjJpnxSCbQZngTZCjOy7L6cnDT4oBiYkGC12BHSkzUQGPQliMLJVMg==
+ ]]>
+ <![CDATA[
+ 68QIQTSCEbxIlxoL9WHX0uYCbeMlH1ApOFmOkmMpHHixnrF0G8hFwSqkyfd9tnk4SjQ4xtEJei56
+kdMGZpcGYkd+FQgoC17E2gPwfDKmEzm6Y1iVnJsbenwhjgTE+ZEgCVdAWjoUdB2DUWyHSeTpvssc
+jBvJNceq5OIGvgK3i78DtrkxoMUNLPiEdlUuwD/A/AhF/EhOV0AJbWEElCANQte9bJeN3J8oDLnF
+grl0VdLmOYm2ObgTuIShw64DHINrFAilVzdRKBCayQOQtsR1ZDYGdyG085UtMgZz8T09O7kHOCpp
+ixPfdoyLY+SIPMP5JR6wDxrcxDbIVvCr3Eu+IJAdbfNdwQcetg5QaIRsgGcChLhyInwD908ALQxc
+PXUZP/DknHz5b4RTN/IQnwugCzKTboTXNTG+CsCC6a4KUY4830eb7wvJNo4sKTDsRgAfDbKDIP5y
+FbjdmLXj6gqkLcHxo8EzwnVh8ASLd4RrNnhD4NLua5IIcyT3X+YjlyOcTAREgPbwWzDsZCLXOcB8
+A7n+EQcC7x0IgPgCwJHcYsGCHm6zD1ZC4Ba/5dLyN/gfGUXQtnTOVzgjwXmCFELMLAS5iWQThA3B
+1iWhSyiOIulVIEqaHE+YxEhwbSgbhhvqxfztCBbA9hu7b8J5AUPh8nlyPeWnH7r87fmy9/JbtjzE
+CSZhQCogiNZzPY5r5CQmhaI6npwlt1CANZSucJFl9VHo8PajKTbaFMQeYCOUO4mzkBuO/wKDyl3B
+79gVwBTuVi5cwv3w5BBlpvKnCwoinQSB3H3ipnjSB5sEHCo76+l/0y8EyhND6JPbZLI7CDzpxArz
+OCZgnFhhn02AT8BpTAQeJUAvAsCJkg6fSCtuu55eTCB9VzCtTMfFDgqdcDEf2Y4Y2EfwiAkVVI2S
+RLnJwqUnWKsbCvIw7NzD7zCSTo0QN7D4wOtxxE+ESpn08J0QfKWgqch19WonYN3lK0E0Qq9ljwUI
+8BX40yAE/yD7L8hAXpI9C0CFXWFPwPjLpkFSiQQLxApDLaGECYisSwiV7REsGoKfEGTpy97IbAVr
+gf10gjC02FOYXA9cu+d5Op6QPzkiuQex/JYVh4FIIYBY0FBsQkDOJiEzINwAZgDUZ+T2ypVx5YEs
+FIxOGCsQCYY2ghPxhlxV7LNQHrl82CzjgxgHkMIEkHgp7fkDuPAEzBggNBTCDyoXCxvjC2DE4E1k
+WpHL0xRqG0LMEN5arqHApSAqTy4bUBG2OwSTFctCRJiNOYi0xHKppCkiDQ+BkyKZlu+A7wkF2IQ0
+4FBdNyT7IE0ii/vYDRIz+e25gvsCvuniAnmBnLUHiDHc4FBWKVwYVuKA74lk8Y6AgVx9ApvcwQiY
+Rn4nwsfYiy3oGGfiJAL+kxH4IoAyNzYA+ogdYCRhVQLlu6JEKVxgj1F+CxcXyG+BCNly+S2sg0xQ
+YFCwJtYiSMmNgC6F8RM2YlIYNQF6AI0TO4IcBIm5iZ9w4qDTwGvyOcQWYMREgERYZUeFqFBWayYh
+3oCU+wqiJ0SewvVgENwLbxLIFKDgg6ol+BmHQt0wbeMEFt1y0UKTCAGJHLHDHoTqSXsCDiBCD6FR
+qpN4YNSxPXKxgdPBgkW+grTsieB4uxBdOz7BDoIJwbUNE5IKFwI2MFLsKDGR/UKnMkHL2woVIhcq
+O0a8gQZBvR5WI1yIEi6RH7DtIrUYpa7SRvHBA7kKgCOAyvFbeAKwK5BJwRXKLsqlVZZYYE5uCKBC
+OD0w+6CsOAUX5yjXHvSYLJvQCXL//EquIm6LYHw5QbwkSELYEAFpE6QN5O+kfzkP5e/Y5mpbCIFC
+GgJAtyGrHpJ1RJtDUtwOeNkTmbRPUUUQcMR3XAjMwgMLZ+DJCeG3i5sov2XKCRv8SNCjzF34RMsc
+OSCjLhCPkPaYzFDgCiyAA/L4FU5cpuMCliJlj6QtgVQv/xWxy51UzgzYR3C6j9+yyZ5cWvBeoEpY
+qAteSnApRR4yioESWddV3hQNviBnDCW9ujpUAIbLhXhFYo0GYbdDNAgWTdggIl+MBhFdgnQsvRrY
+6IB0E3OMAIiyMjlL5R55sYHk4yRkg5vEbCBHtqrcY5BAHsUuRoH2hDYvZpvjK9vJLZe5AtEf6DsK
+OpAXTcR9DIE7gfINWErKhwQuWVmkcqLrKmsCXA1uYqfQ5nvKH7og4WCYgEJD5WGFTxV8Bl430OEC
+HJevnGfKCCcO0KNPQsAd4d5KAyQlcuWAEKC+7KtY2VKBi5gkSugHbp2b/YbA5+JGheR+rSRBKAJJ
+9dEzWAecsaAsQVUh5Q9LlISiqHDIJt9oG7hVCqABVw7m50DfEdEJ8ouVNjyQRs+n0B76Kg2FEIPk
+MCgWr6o4FIH6GCDgULfQs2ohtOGaQdCKYrDWVgizIpsnQjUgkuQDDYlsNoV7yBK+6v9w2nGsJN13
+FWLArVCq83EJYl6G0IcUAA4HtxYNrq9TRJswdGhziRN9YDeXd0wpFAVRHA7gJYzTryicoi2yY/lg
+yynTCL9yoBPSlQrgQ5qDcKryJkQ2CsKyvCAisPJOnajcSUptiEZ0f0Lgl8iiGfBtwtiDNATAcnbt
+ID3A1FDPGuG6XBH6QQz4LkRuD3ctZXj4kWw4xE60xZBwhYcFB+BD94heArk6wtBNBsqVrFrhHlAJ
+tZ2h+sHXTQZ1IKYMIGX7JCFyuxWvC1PCCy//4hAF3woRBrKTe8uGyFWhUyiosccp7EAI6uITScm6
+hZgLkgLXkRCfUbnjya4JVQMhThU+PhQZEVRMbsiX5FgjEoxI1UaRXGoB0kx8g/pJ2CpsKGcMBQ9l
+Hh+TohbLqr7SBn4FbY2XfwkaNDdmN8RmULOhAWPFRoU+ofMOgBTqbogpaAghN8h1MgTStAFsIvCW
+/YptBrdA37HYRo+5R6OnSlQqxYGOBR3Ia65aAQBrcUweCUhUG1wyTdxwq0rHRlPXvmo/8rFrItZC
+pYvfkKcDy5tpAwYKcBbZN/nBd3ROuA2uIAxwhKD7v2wbuEW0gQDs2DZfGUdwzVmTsMNscw1V7EJl
+9LvAi20D5EY02LmDogozj7aAcwVxAtGMLM+FhkD4aTClxPQQKkA2wGlFoF4GX0HSSlRChRFFBADp
+DlwpNVAYSZqo7RPOlR3vaFtEAgHm2es0qTgMzTd+enKI+C0XQRsi/pTLkHYc436gLYQdBg2JitRg
+KPE7SSA/g89PVJaCHAdYiGLKQ5NoEHmLvfigMmgQgsShqB21X+mWxjjhmC8p+sEDqPnREDjaEEWh
+TjAG8HD8ADqdHW3jdZK20PdCfhg7ENHRIDfmQF9KhDKxLVEgYVuiWxb5MFOJbMW7AQkArC0aBFzY
+k5xNoFMQHOPqtITbsD0BrkJOS7ZHPwwNYEFwCXjZA31JppOwDToHfOjxwvloi4EaacRJIuo0iAla
+0JdBTIKSIwxVDo3blC+lSURvOUhgapAQmtnkyrUgDPO53Fo9JB+mMsgUgElBU2gQ6hWyAbfvQF+S
+K5OwzeDKQqMSuezJiQL9KoJ6HQ3Cg3NDfCKt2HatGyJtFAYwBU/1Gi0Ila6QfSxNJEDpDFRblxa4
+UUzzWwiJlQqdiIi2FUInhcW4CnGtGMjcnhpNRgnmIrcVVAQsLpYLUSkUOA0cZUtaMPbihLgi7Gvi
+K9lNleAYKxEGXxAUgNwNLHaA9sxANAbnhUtsjFIP6BNcsC0tCAtcCIiyq7bBFlh6kWuVj4Ws0QJT
+L0sBQRGEh8NGC+0PIVganTnbyKbIwUNE0hZ0b8B0ubYjB+p1MH9OlI1HFt0YpXktqBCpD5PrGEaq
+5JAJCnGGLOBa/CPSXxt8laAXYehoIhXsEohwC3IHRlxarH4IYpNMVMdDIxRzEFlwgXfSRqFWfDOI
+9VMhj9rg+lmLoB+2eJ3OiO2kkQrNFuQ6IWbkDR0otVqQGQWdBeSTYxWytdGykC5sPS1IjY4POg4w
+S8isszdXBJZJ6rmT9Gh9BanQLrTTKPsRWurK/XB8mib9ABhYOxRwADvXApPvRdaRAFsHFVsLSB1k
+P2uForQFpROIsTbFRMoyIZEwbafUgeKayT6Dv9pJW0NQBt+yNWkrLREtsClGtwz6RQOrrR8nenBy
+hjBRtQBgjlp2eOJUhraA/3GVWhCIyWW3gEuhYiGsuMSK4Coh4Sh0umBffatVixO9D2GsE1AWiJBH
+VTPUauRpFUIFoh0MArU1OAAuBFK1mvrBasNaT8mWVnfjcob4A0o2+gPI5bOXHAKP8Dv4QsgUAJtN
+YUBKZay1GJ8C8GBLcFS1yxsUQDXbEomI6j5MTgTamCSOjCYXRhkEL5Gy6KeO2rbQqnuGbZYdR2+B
+xdpAGyY0hsP6lrqyEWqBtFEvg5co1fekNwsH0M6QQnsWwysAk7J4KtQS0Kn+RhNNKumFEHAI2UoT
+EZt8qHvRJIQx1ia9VdgVwH72rePqOqgT4CA0vGK1NCyySeiz7pQgHLstUNZEMLV7sIbDHwFNJgYL
+AwshpJgWFEFxomQulSmkEZc+waeQ6rE2KJB8x1I/H7cwob9Iwhbw8orlBSHyZsCgBUZDkLrgNX3L
+QK/aSjxVVKDvjKagUVhRbfTt5Y3BtSTq0RDQewDGVkiYWFLkY/NBe5xIeSnXCh0tKP8inhamAx8R
+cEJ0MgE0ggVrRbDzkCc0yuVgGmgEdVVY9ZRyCt+XBORiZKwQWCMC0nKUn6SSGC0B8YTrZCatVmTN
+Xy0hBCIpy55FMJ6ifxiXIJTD+SIMiJc9tYxyGh6lMV426MJ3tM2NgkQdOSDz2EYy2Gzk7kZWjYer
+D5mG4BtRt+5pIxSp/BbYHrODmt4NsjYortgGxUDWGHTaWiF4MCzWoX7FVwSMVlAfaQ1iKmvQJPeW
+LxJP6rfCz/AtkdICVcKgVa6Sxx792Oe3MRCIiyaR3iCUoilyiUDakAsV4kLSUlyMVEIJYf8hwlEF
+DRpcXgS3I461Qh8cfwxsLS9zREetI/Cx8WLsYQCuHtfFpxXECjcR7LluN/JHI9hT2Fzot4RPY20Q
+EA61ITBKSaj6sX3RpIhGyJL6Gp6ixVUHrUiVGmxx1fZDPy5l0Kift5OAAcrnoKppTRtdT4+Zsjxb
+yP7A1JyoH5fccV8boABZ1e/IL7agxg0D/U5mjusonByMwmgRlBqiJZNYWzBLuCQaoOXWYyuJ1WfJ
+lImZ/CqAoQPsQEgRAw20l0YQKxydpR8mLnmnUAVdeqD5cJuSmRFuMWsy1XI2MKjqMsCsEi+52eY5
+DtipRLg4PWc5UVh4XFpY0RBCk5EQwO26YkUY0M44OMigYwOLXbAjAW9AQuWZ49ttlD6xpTQFgXYH
+kGhiP+OZ0ED3BxJmz8JYbJ0sjGouMaHYcci0RZGFE9oAjKOU5ETFbmp6ZEjyufC7o6MAhDzibD+m
+Dg3/QldIMSRWLhpthOBYRRQYVQMrhNAljU2CysNUdIiVcfVo6aQsYfR4XJ/XI1JtAw==
+ ]]>
+ <![CDATA[
+ GhxlD6AqCyEVyQQd8Cfwx4pgR6EopOg/iBwui+puClcBtLZUUio3AiMoFK3ghxyjXzmOcpwwSvEj
+ax2VNqgV8FsZZtOmepQNMH6hIVAlO9rkIRl2Ya+s7AfbCxTGLmU/r029ngssplIzADekit9SVJiJ
+DY2bZE7BIDnW+SEMEsu1OUBFtLHT54XmT08uY8iRVJ9BP6oIO2H8VJ/RpUBJ9SqQdiLYSgxupupV
+0BYaavYpi2sL1chGiUCvlHRiP5T7pfrMMP1QGCd2T8cDtgTQClEJaqKMmczPQie3V+XKZz3ikpz3
+2vwVLKfO5AM65K7BlBwR/1J0gc2Xnmwwj8VyKRRdJ5Nwi8L/0N/N0Au247GG85ID+5V6rIVB1gbX
+rQDXwrjq2kTvMzq+weSspkm0mcBae43VIkaeCjN0gEkb8lq7tC3GodJlTXoRQQ3Ga6o5OZRMfxLY
+GVTwRF3JhHYABwpaosZSZizXfVIddXLayLTBaiMxsc47vONBrpdE8TyoQ5BOMJEz8oFd1aatasRI
+UQU1wGlDlzLSttHqzw2z3WBzXDq/AZlhfa5CKMeKVbjpbHOknkidgyic1ol1BF2zJymoe5IXJHD1
+JCO96GkbhnDgUId76cL0Iw2yGbzdoTWGxYn68xCNuJwqXRtSZ4SsoesgbRskeYiu2gtURsJjEI3H
+UJJBtQYqbS2gsfXhDUkYXK7YhW9aSJTgTmarShtOFD6tyTp9yVfLR6cbaJzhli4YBrLjqlVhQxYE
+5w+HajT4EGDgJUNtQNrQtS7bhsWTZKXdYHcgSmRjYQdTwykmBGkE20yihikTILKDKJyWnuT8nj1I
+bryjzkm/tM11VMlAYy86jNVmrNRfL60qOjL3KZlGrDfQvgMLhOoXXI9X0jZ0rdi2QZyGJYi9OGQV
+RFCxY/vQO6cN9kxiWKY6L8mM3QB0L6ShmcuCIjaGB1dozz9Q5w2BFVqYdmxPoQval5BIoyFyQkOl
+TsDjDlQzljbY8U3kJl0vkdxQL+qH+YbcWrM2odFGX1KmQ/Y+or4ryCzebEjhzym8RHcRNIAccl1g
+sxLa+azZpXCsivZ5ASHDdJ228ga5045UPdE5yQia5sJpQ/yKc+9AmWLyp20bunbAtnVOO1SPr85B
+Rio9d512pMrizkvggpL8accqJXeddgxLZOG0Iw1b6Jw29Pgmf9ogBUHhtAVNUJebe4liYue0s4bc
+WrO29LQh77hB7iDtWF2nDduD53e9lNAHOzvtWLW4XaddONZmRF5DU+iE/qnbYT225J5RLtQAJ6pk
+CWNhQcDIwKEGDHyLpnPIIVge+BhqaKhjij1VD9N0AzUsGBmop6kBMjYYATrsiHongT+Y8KEnoFMV
+eLY4UXoKVUFE5tSE2gitgEaowCsdXVJ3kFhZ3LXMI82NxldJHsgeExWmyGWLB49BLCaiQAysKmes
+OpNQ5WvjqOsvdTIqN6MD1RNDxZOodlOwiOXd0ZoYK4DJp0b1V0IzoFmQ5TNyB00BNS4wC1nXGaq+
+VKuW0IXWUx0oLUCYngc3JWomhXlVBpUuDKnGLQypDvTowzNJNWRAThtuAR51nfwrYkvqKKoqR8b9
+BGpxo7oxpprHBGoioOY8cYyqEalETlWEqnGCbw6FajY5kRryVL1N/8EwPfcwVRFm2l0PTnGJakRp
+tqZajlIf1IsRlVXQ30VuOmwavQTogvWKu0IDGAZJfB66Q9ZOx4XH5olVG6rwLdPz3MRq0YWR8KzB
+MlOjU5kFA4VJVakO5s89RvAWNTpOar1zNGYrARqKOCTVy4QmFa44W4/K4kjZXjTwdiWhlW6wFyn0
+JiFdP9GmKkzcxdCqN0O4ePXczpPKeKtJESAZyyLwDKYdxicHplxHlfFZmE7L/tfQaTeAzsWDpCs7
+igAXGCLhWNKCpE7VjAvzjBOqppOHglkFdHOM6IuPWCuhIZBqKZPH8H+lDN37rfA1nmryg9gnJx4z
+CmmYcVcGGBdMhAeogSqB9xajbtTHPs3azXL9ucmlF5fn335/mZxdWXlwcnL16/nZ5TFettFGjcOk
+avb/HwmRahYG1QB86uKgIEaq+DipAXuIi/PliOFkFKZeB74w5HSA9S3YR4FK1oneA6h+EviUy/Eo
+xqTXFZwN4VBCJToQt6HRH+5dDKBzYSqOIuW/qPNwVMELLTKtH/D8MfB4sACHBtzqyAZv8CMoIHQo
+upijgR7a0DxTlenDS9TQTT6Cry6/gsJT/kYbiQF8g2Bhp8uk/qZykZ4MJvsIWicosImWfE89KNGA
+aaKBWvgIEQRWeYo2KGfRBoccanYQkxFZWobfUL/gtxNk2h9hxjhlVRTDAg4vmQiiKmxKsIBH2otx
+rIoP7kuIM4qArl3VT2FkX/XsrcCBUl4aKNEkqTKRDyPcL1AnRkrJ9oWBmmdboQvdnw91i0xBNz20
+SD90aJLFb3pQhY7agtEgZJQvYJFUXBtF8KGvnoUYSXgGkeEjtYpRlZcILFB5bU0zAaQcuLIblZKg
+qBNWI6HLCcf2I8S88VhC31GlIFYOjg3Hm/gaMGu8WCGJdgYEy8Jjk7CmDtytMFQ7KxwhSNJhHAG7
+GAGChIUENqLnO7SFiUrfYF1ouYd+ihZ961UjIB/yI0F/CdwlGQ/kpdY0o6cNq1ZIXsBJMrdVOnmQ
+KZAOXPW7T81wDOOBNxh0rKE1VwZw4gKnRdaLpnb6f8ZpxACs6aDHINtqGDaeBlRAX2dia19XH1BE
+5aVsE3Q3ntqtqbPkPGlEhd4iUWKLGHXYG01qzneszwyNkKZjXzZhos6QXhAoNeeFJ4MDCAABhlSR
+egVnfg3w2kIYFTwWEgR+uFygAx0QGkjTEfWUQmhCDaxqsMhZJbFVRgE94FQSOgWlXgH8RkDfUNkd
+KNNLNsKJ6RfH6D6eG7gt37qOpuyH5xo481kW2aGJGF7mseVkjFpKaQdOvMxg6bgIVIZN1oNzKgf0
+4IYFLhWmIS6OMSkwldOmwZnCtVmt20EQKluvLIiciocwPpjZHHhLyjuCBlUDAjObC1dTxJkkCCSG
+mU1E0oADUgaILOp2aIGI1bjKRllh1rijjQbB/3AXoKuF3FEag+CODhUTzGEh6EkIc4DjpvYrcpU+
+BAWiigghFi4CUrg3uIYqtQr8Jta6C+oDM6VDoy34jRBg75HQ+fTSgZmKEbNgFXSbBHVRKm9hpmrw
+clRt1nLpzO0R6ejCEX7NPbHWEjLa0CgrIwlLCMLW4LGpIfV0B0CcVWwvC9qSwM30izRgiGAxqdCs
+X9HyCreHJN0QR+N3gUbI5AK5JuqGQt9WLJXe3bBx+imucjWaCIIAvubgASNb1U5Ag4/LkFAIeia1
+VPlwGoMrLTzQ1FJE/13r9ocGan59Ffy4Lqj9ErU0AFcqCVNMQekZnBB9DeFPHpmUBVD3XVBdX1m6
+ALkQhCOPY19lUiIsN1BbHE0ExgadOhr0Cj6f4bCI8mI2BHhcwM0KrACCIHkD4RkuIORHqpFjAwQr
+mNMCilAFzkaVbSNGzv9fyxL6yhLCgcIhJvBxZ4Faor4sIVXJ9KFINJob/hpgBD2jGRpAjSJlq2j0
+ACGJgcaEKDJAAQIc1IeWURB6w8AvolZwATHc/JH9guK6H9BoCn4jSA3ViOxFDAiRU2iFTEBjGGmA
+KbhSEoggUOPQiXKvdAD04QMe8h3BRgytjdW1s3tRtUJZvy1sJJQBiThUrDBzSKSuNSENz/RSMXZt
+8KiME/X52VdtbyJ4HDdUmBzHXtaSj2UPgPCxV0kEfkqlMjhOw/pF91I6i5QOjDHp3LUy0JiI1xV0
+RGbPZt0YVzKK/yev1Hyl0o+CagAm4b+BoDrKFpbrO4PUlwt+YOSHkBdBHdLUrUa4J9U0BUpXLEPp
+q5NSoO48aAliqq2gEfSVxUQgDxtiDYWnuiigk3ugHixgKT1PEQsNFuAgqSaiZ17KPCU2sgWNdANM
+bPYekkTwFGhRvSK8z+HzeGJdy9QND1kM6JktI4YI5QR1pX8oVhzQLdEDGxZmrmWKbT0b1oUW3SHE
+08KFAhsaBNg8T5W/q7rJgXZFyysdy5B8iI4DMhk4BEEG8uD3S0d+iKBgPukwgG2PU/ofuxpgjxNz
+I3pnwr8gSr0bwRczzDRRdE6FNSaB3vzEatNwGEBSnp4Fp9UDC6v9tGsIh8orRxDB5wSD6NZCl1pq
+qK0pdNHT1CNfgag9npUDMz+cFOHerro1xBVTBpQ77lmvkZ5v4Q6v9lZ5K1InS6taG3jYlebDJsY6
+VgaaN6EBGv9vp1erBpz/QVb/g6z+GWSFpB6uW9DlgsNriq7o38o50YIWlNz92FepCuoCRrUqupLJ
+JwGlW+FbEWQelaIrqN5EZp5UxT1kd+COYYZdaT5snOa2gImMKeb+B18NBDu1GAvKv8Rn4Le64v2y
+yj8mdoFBkw65jLeJGInPGEtq+mhPhnUTqo5U/UfruqfK9DQUKZHzZeSzF6pii+Ia4nwRjYiro2kD
+BPP4Fh1BKIJnJNo8G6fDttDP2tBgmGUEyl1Hw1Fim32F9k9fLcxhAi0s7LUCpv9rgl7zNJgTJUP7
+AQTi4SeXe6BYRsCOic7SCAJBa8grwwB9AjO0HnQ6SnIKXmPNIZocIVXLQllnIk0apFpZeAtCXYFV
+pqpaDSL3hTwYY/XAEdNQyeuqGS6cVgP7ogf1r0PPcJOQ72ZwTVOkAv1ibKhODPwoVBwbR469zDFV
+rA7iBRPmR/PdiEjFTaC6Y4hPFGAhDJHo/dZzYImgij5QTXrAGz7MuCsDjAv7IpwKmSPCjxtjlcCJ
+o/i/DVapBp5arIIke9AlQyUJJP5L2xL6YFovDCpSIzq4M8CaSlNoIdLsDFZHGodIStWOY2S/ga6X
+BJ4OB+AZQoQA+qrt9CNrcYKmyqawgJtDmGjQZQJHsdjqpwFyIUM5glQ/7TpM06LmZuqnYamEVwkD
+oZH7B3nCXGiw4jjVTzOrJ2w/YN1aVGeFUFjDeAF1FDIKRYHaaqPUdQHGtZhGFOuTiKV6CBIH7xl5
+TPoJFAbmx2FiGuvqzcSDsl8O3UppPoPXKhJoKBkubn4THIFtcibh3gTeh96fzfkOJFX1EUdjaORl
+qKhDzs6BNzXWjiCcJKL9wTAzFVCE3HUkQwgmY9qWYMvr/dJ3As1EI5wZ0aX1Pxhm0JWmgyLUPWb6
+OGWmGyOH/yYanT5Q0ycD642jK13mA2T5PqKrkutqAkzhs3+xEVQ2pvMwbEsezftMX4iceAENOIE6
+4SN5qqOR9vJdmGiUF9IYIPKE0WNy0fyUwYT9CFYmhiOpSCGfBTYTJWDG43Cupr1DdLoTajhd7CD0
+n8k0SXp17oy3ihzNrQUCkyCqMgDaCJShza+Ow2FnkZlb/3flq25HyU67ztwkQ91pGIYSzYF3OLJF
+IQIIZkV6icOXAkYrxzAUwKFLKlIv0AQCKyv+67VlBoangqnTjEqbtoc4Pti2eZF8eA==
+ ]]>
+ <![CDATA[
+ R2lgY8iMhDDyKHW9cfRZZ15/EXy4V3mjX4SBlvWPXInZldwqmLF45efp70+7x5dfs8Tks9uV7/Sm
+N8bm6fUqB4PSC9cUDApXr3NQ2fXDuScarc5csurso/ctRLCUa139ka/Bi0LrFeBZLxLQJfgb2DAx
+3DdX6S+SbtHNMoxU34BMPR59RHAjfJpsyL5nF84Ihwf/jojGTjq2+Ey0EHuOKgHgnIf7FqpdF9N0
+1JANtxXGVDEHmjQgj4KvecW7Vpe7b2U3LI5VenI9BJE69ACM4QiKcSL4SYAD8XTX3STM/stcM3B0
+YPSaAGSCNFVwgdWdT+CL6mvAoPFcqxlARi162iQUe42mVKBHv6s50OWsZHhBURFDuLG9YWTKvhY5
+Gs6JIVI/+Mjulqj6cLixVwYaGwmmfFb/hKdDaMf9P4kbBj6WfwY9PPjH0UMZQugPtY1QAc1TSccA
+DHrsdMor0EdQ27L6CmmW9PrSFj0EfThyPhQxH46UD0XIcUB57P1/loQPRcAbcLH/Q7wrb2eeM84f
+/DiJdo9bBm4ggQ9RP4A+ZPxO71RiqOpiWn3cKd8wgpIJkXGlBJdTR5cYP7tSdMh1rWiDK8Ucqkgq
+CHmKd8pxEtwpZkjK7hTcZj2N46ETiGZKonsNr1Tg2xvlZjcKuah5o2jF8rQoCm5U6NsYhfyialTk
+XuLrbrpU5kPfmXgMi6JfPyArpk8/IQxKCwE4hvrgD436RIvDRBBwPQFLw4z0yAzG++Qi7AAngtg9
+pOGF5M70yvBCAbFBmgdmuw9UEGXREoFhBGsx4RQyJsABuPilCUNH3bRasRBOTb7NqiWo0+CGifor
+CpnqOybrhyBRF5QVyGwFf+Her5CwURrgB2LSSidIFsNcpywLk/R+FdtUKih34thSJUhGiONz6U7m
+lnyUaMoPZk5BFpuVpruiphwUd0BSN1gWxuFSQgCw56+nH+rZl578vylINwfqflr82CYmhuu7m3Sw
+g++qHjpW7OAZ3FHkGmJKB5iqWEckdROkj2ZAGQDFMghFsHgBNzA8IwzUDwvZIGKvgxtcOVXgBt/6
+3TMtHJGDr8hB+NFYsYOf0VsmiAR2iGMNAHPgXwbs4PnuZM+iarGDx410RYKJdSNjhGkmTB4I4iqi
+RqCZk5FAHVBBjSCz/vB2gT7RdRXu+qzDhLxCSMWe0lqfAdpQPIKmhshi5jJY0jD8BXnzkdARxgho
+9hQ3sIIEk9EhI20UOl7Pl0bwQlstjbQBQNFH1IDTZ6oF5LKO+49o77gJma4fllPflHzlqSc8868H
++pHPcCzkCIQisecTJtLzGFBAxSe/QXgD0CmMJphy71e+zQqALFDGTastNdgR2GwCH2lzkTkxDseE
+FpzIHrwee2APvezM/12s0BCY+yOFEKtimRTry0mkEKpxijZ9pstF0lAK+QGRQlbpyNWSRNCns5oI
+8AJSNQCGmA8IeMFlprZAndWZJcZ0+HBQNrzMqBTZWz/lGWI1ykhvoUULGdMglFfZcDoLM29h6BIt
+aBq2wrJq0YKrO4kc8LqTSIOUsK4Pjj8yyonJ/AQMARUhAlLwhwGngid033RDm9YjZBIjFfLhTO8x
+VTa8DhSOg5glFmSGUNxHHrO7MnciHBuIEwLkyDJMrg+bCDLeFD/0kRgGexYz1zPSkhIjUDVC61+S
+KP2uH483Dr7wqFnlMy1b2Szp8u2jBAMzCuo9RRypQJsL33a3d4oI8GUODZweom7tV4GPyFoaVp2y
+rxLFBZop0TOWx+i/JVruzuIElnIaE1Jw7bnrqSs0mKTkyP9dnNAMkhugBLhf4O74YdhBCQy/h7+v
+ogSDuppRltQKcUxG5UrP5mwKY82xiphiqoYiyzoyvs9XMcIgVYegBDeIO6wC/BTwchCrHgmuyzhb
+lOOArznPooASEpvlx4sdDR5ndnZk2448dXHrWlYtSjDcSPigW5Yr8LVqhW+YhDsMEeGAAgQR9IqA
+igBaA/zhIGwBj5BjCbns4dijEQ++1j5E3k/mM3XA0cruhRB2QuJxQbx0qELAJOI8XEdjIoEVQGJj
+FBJiXnaYU0o+1OzhMfGC63ZKHwIwAhI0JMNDWZP+g+LeUdaPUHIHpZHKPsLJI90sIsJdYz8SsgAT
+LPIjQyFS/h3pN4IUfS/7DsFSml8eupry76woAaAMdJaNtgYRA6wg5iLnsz8WloEwoMa4QP9DIpEw
+1qF4+P8udmgG1E3QA3hb3CNEUVr0wHQRaaJejc01SGLmsA4X0INI74zCY40pix58JANDGgkaAVDR
+BpU3gR6oUw4DLXCAJG1JkEMPEcMuExshy3yfRA+wwHusCGAUPXiZIEEYBXqIQs234ELGS5Px9yyr
+Fj2o0kYkyMTyXj5EmBgxEDTzh05M7ypk2Veg8OgeRPCIKVIkCXkrsucoaoiQyDj1KI60yJ7DylNM
+ZUarSYCgJqNZMrkfTE3gKMtAxzsEfaFQnxpfSj4MHNskE0R6DV9D5g0ycZNuwiPSazAkzeTIqiVU
+HVHW5fMMtK6Jx+p3Sv4RkWIiVn8Cdi/5yGimwYjl0lQjaWC5SFiEMkaW1d6vEJ7CCgxI5QH/rJWm
+exJa50+UEGE08ZiwgmtPPk7P3Z564cz/ZaTQDJQbIAUm/MDtgS4iQwrM2aYCXIsFSByXWQtdoyUQ
+WBYUMb9+msE01sy6yP9qjPIMrPHpM996TFcZTBY4wfM6UoTPyyRyQUicwIIXwAn0kvE006nFCZZl
+SLSqMnECU694mg0NOIEgUlxVHU6IE26kcAOOsa6W4FxjFu0KWfgK2BYhoxHgUJUKSaTAYWA8JdCE
+XqCVjBKPJeeSRFmGQKOFGQMM6xqqNjPFDFzfmAqXyRISuh4iJpWRYi7KhmgN7thqZ3s/lG0MrXI4
+SkJUenFCixXiMNI8nCyu2XdM3jm4qcc8L8cvHQ9YAdUrke8Yvoz4CgF/qK0CH3Bh43o/gruWFxMr
+uMhtY/FPiPQ+SB6DpNIlX/mIQotYlYv5HlYa70po8yWx1FDkNvLvaYAW4shNNQv25O25F0/9X0UL
+DaG5CVpAwn5cIE0eqVghoicWVXuttLRsnNn4fIavG19zVRMpQMzwWHBAs8yj2A1L5sCWiUy4QApw
+K2cgttPhFCDLMj491shkcqhEC9Q5Gk37TLSQxiogURNEVkcrhzLplGIFL3Zs0HFuUbVIIdZtNEwY
+gW00IE1IK6HF8ByjZEGE2MQKl66mbxbCgWyIeJYwC0KEgjWasMOH3YHO/CCmIn4m8GZFvDkomKvs
+jadprCPNI04Dd+Lb+FGwSMiKEqNUPNix3g8F9q0OpRUhTojpSawnv4d4IyaJdco+LY5J/hypQAwr
+dcLYVfYVKz648GJDLUr1/oeOONF6FD70Oz1fhajW5vMEYy/yLS6JY61OARmz5Bs5EuYfhjOaRQlN
+tiQIVEiFWEU5YkwYwXXtydtz10MPe4/830UJjWC5AUZgskiPWbEzfWPIb5GpPFSUECEXfWqUCHzN
+2Q/3XQCRRQmsRsXa5ZAwkHCCBT8dLcFGl1qABLNURx2UAAMbJI2Y+YA8dRUiSqC+0TDzh2IEL8UI
+BmwKMYJVNxIVBLnwua5V1eKECPvoJEJllfgL0IPbxYxYcVUobUCiIFTHs1TCgVVYPT2VeUjiEKmc
+XWBETS2JBDFyEYgWUFbDR1FNMFpqLGFsErWhekNZHR7SOVIj0BffQ5V2ZmAVYVmuPoqA9nwp15AJ
+1WH3CX2/ExwIqZulCZF53ncbDMp7ByLrsxxvktl1ur/yNX0SyhcjKAxfpSlikR4Huoner5BhCNpa
+sBqOb/kS4yMyAwFaUEb1fhQEyp8iG5xrTSXNdsVPNEe0VqppFi7ZADOw9AKPPz18e/RBycH/u8ih
+GVA3wQ7AvV6oFYAz7OAROyRpcjDkL40zCyUMUywFyGiQFDv4SCeIdCJupNlnGJYI7IB8TMwHg7Rz
+8Iv3g44YESRaWZeRgsAOcCAEdvCt6tGFPSGy8ZopekA6cqIHq3rkDQF6MImWrehaVi16CHUntcoD
+3LeQjBRZr0IGDAn37xtiBxdV1pWHZMIkqqCQh0hTvjsQsSHasbYiXaBU++hBYSIwikS+LEAH301b
+1M0PY5umM6Hxj5kqNVIHSQ7hchn58KNKkKem+KEnkKrZ4lvYLvCPvkUOcYJsUIlS5H4DEjN4Gq4q
+sw0REdb7kacaX7h54aiVy4jciGhRCEYY9X4UOirRQROIFxWbID6LNnD6uPR8FLgahIKQXN9PI4ga
+7IdvUz8yLRf4ujGhBddyiJr50IGh1qb57z3xfxctNALmJljBpkyDMilDCiHrggrfpEghcJhPODVR
+erZQKAJr/CDFCqhFTqyALHHACsx+5dOSquIiSqiB94MDYooUWDsbmddYKQS0BapmRw0JQAqsQa1I
+IeMZWE4HSCFQtyZUWgigYohVtZBfUy1GCLiJcZietxsFaumnKzTqMDj06oSG0yQKEm7o2b9CL1Qx
+wkHOI8/Y8n0GJfYiq3FEpTiP5ROhsIGLYMzsrXDF8dQgx/ByqPjhZcHAHB+8PMpbRS4qySVe2Zde
+gMyzPlEC/PgY841rgPhF8NDYJ+xE/0GJFfiQVkgDtr/kK/CIQAsiGsEkiK8SBkNZnVLJN/BYNgGN
+0AGUAYpKRDLUyCEDIb33K9+m5EMQqDWINtsT32idE9Yhc8elb4R62x69PXjfHnvJof+7WKEZQDdA
+C8zqjzsEepbhBYhOKNUQKF5gRcY4s1Pa1MQIFE/LgYShshaQGCOmizYaTgAdFjA7EAP9e4EYTNKR
+JeAnFLk6vibzdFhBUqtaATEgfWNki7GkiAHySpRG8hlPS0QCNWAbetZVixt83UrHVoeSwweHijBB
+JB82dFEk0xi6zFxNATNJCUjkR8ZKGig3DM8ul6VOWExbvZp8VnZlik2jxNvWAUwQ0x3Q5q5FtBmn
+rImDZQibHTNMaDEISj70HeZXBKJCzHQ7QQF1xQ3CNbI2gO+By+o/JnEDi9ZRvghQWaD3K2Q9BM7x
+ffVu4ldwNGG5D0H5nin5ijlPYVr29EmqzvA1Xj0MyzYFKUWB6hLNHLvSfE9QFsHQNEzsMibk4Prp
+2duTD+y5l5z6v4scmkF0E+QAkwIukW8yV2hG/Rib7hWb7SF1apJZKWEzdphhlBWSLHJgDkUkH/SZ
+/wye9Ia6R+Z8JHIwcDWAOBh1uAYgICAH6DaYFRFseuqhAuTAwt0F5KDp2hyt1ETkgHJ4QA6uzZrR
+ta5a5EAXMUdTvDmMwNJZGmqxYAClR4sgNlYkVAHCseQjRppawIiPCjU+PapQGj5AMLKr3tA+oyfU
+RxjJkwNUBmBYFgKugAKRmAPrF/EdJg7gBt+DRy/KZoUhHHyYA7PnQ2G0Qy2l2QqD0O94/uJooCqI
+4J7shP3H5C2PYPDH7JH+uewjWDI0SSTKb6fKCc9yAAKLvZ+QbYgUMSBBrbIafkCxnA==
+ ]]>
+ <![CDATA[
+ VVmDsoXB6i3QhyR60JKuNN4S2AWQYtGxYsV4UAOSMdqjtwcf6rG7JYf+76KGRvDcBDMAseIGwXcx
+wwxUDWkdNN8mgu0UgANp95mL2CARhEUMLCbsGq0/DcTAACRavhQvsB4CS+f5HbwAqGUlSSbK9LQ0
+IvGCVUD6SAiteCGTJjyUriVe8NUmEcKAFXhpmuXCqmrxgqv76PiWD0D5FwZHUgltYIA1ZB5RJC1I
+uUlLORKUpSKjBHWfD3stAqhcFKNCDRriBdSEE1YOq4Wt1meZ54B16qTzWIMI0OJ7mqmWiCFGNACS
+HmNtWluh90s/ManPRugam71dEYMI5VosCr6Q/ce0iCGGDxGkeRSG6f0qiuxWw0zsmBQzxKwRhYp6
+puSjIFHDc2SLwVopxGVFMBcFSkuXFmny2xi8SGANo402xYs10xuTS0NDPCbckLINoYWCREkCqF/P
+wf+7uKEZTPdFDolWz8Q1QjRchhxgsUw0QX4rlQqSzGLpaVYQgIOTOjeFWrUC2IGZPVh/MKYG0gG3
+APSAGGpgB890RArk9QZ2YPJv38IPsENoFZBMIcKA56TDNSSapZ+ZmIkdkIcJ2CHUXLddq6pFDvQS
+kwOnqyU20kUiEYAmuB8UTAxVoSDCWmwVkCLxKqAYmHbBb8a4lZD9Qw/civC7LKRK5BCoOZaRiALt
+vlUUYrGhhzzqsaepevAEIMb8Yy5KWsIgF8QoGwQHgt4vA09Tg2nhEEedExQ5+AxTRt7zpMmYahWE
+G2NEBzVUAOr9CppLlJslBFinI+Ikh+ntAxirS2aJzOwhSy1EbvoViIbRpNkmKPnIZ7G/EJk0PMd6
+PTbbFM8WaU9iZSbHgxt8m64GpjU9+lhPvuTY/13U0Ayim6AGJtOEPchkbtFkUXEDWVDZ0yzLSWq4
+9NQ6jcAg1HazyYASJCFwrSkBiCFCgWJ8i0BMIAYm8kGO9jAXr5yov6DWXwJmgEc2MYPVQjJJu2KG
+jG+gYxUxAxOme1o8A5jBCzRdYdeqalGDoxvpWGFB8JugVoAZcBbqHXoMpUwEIN2UW0AZC4KHiZV4
+CCMBv0voYhG35AWs6a2YIUT2o5jyOXwDfXgVQZmLmrjwz8AtZfn4wIaHEDOEDrPje5OBH0GgFim+
+90vZE3BYIGiyXnzupfKE76FgI3A3JKr+g1rU4CGCCgkIIQH1fgW+AcZqOUXHTdWXyGwY0neCASwl
+07SVvmHdCFIeBfQmADcaB7BE9n7l22wbyNPgWpfJZtviWQeuxJZQGBNuSL2bEmMPP7FH33vw/y5u
+aATSTVAD3FS8UPMXZKiBBWE1xQhQQ4ycAUlmt3S1Chsy/2WB14Gm0UceQs/YJGTwNUISTHVzMshT
+CNSAEIgMNYRUNWgxCkwfimaghsjqIUn3iRrijGnwUc+CqEElCnq5ATM4rDZSWFQdZojoLiaIJPZ0
+H0UoSSiAB27MiEqTsGpIIhO0ngyGmJF/edbpJTQI8A5RJhnlhL3Ea9NpyHINDFn04JPpQCGBVTNF
+CYNOkaQV6UzgKyI8lGKGxLcVruWRo7S2+F3ouLgmTAGRoIKPsY498A+GSs5XdNpvvJRfgNmbFWuA
+vwrfRPaaBvAgi+IUJTihrcIJRVfxGyRqk/uJoAdIoik+gOOS3B8BoN6t8JH8TShb7Gvtn5WGW+GF
+6qCRuCi2OS6HR9bO0/O2p61HnZQc9L+KCxoCcQNkwMI3uDdR0HGFRnwiLh3zNUunzHWbZOZKVz0b
+oVB2TYYM/EjdW326kUessBOqYgt6CqAD49Je6fudSGstaObCukpsEAFAiQ2s4lH4HcsoxH6KDRhj
+D2zgWsUjLdbgYCKmIy0sqxYd0FXMEfzi2bOPAU+oPx85ygSERjXQnhtaf0d499i3fQZNCAsAU5XQ
+S/Uy8hF6DHi3GgZZlZlELTmgWQ8xpaH6ikVUacXIYB7TIzQADDJGwvWBOHGrA/DRMBD2fhl6pKkB
+ypLQ3q/KBRj6WeAHJ9B3uFS5oKHZ8Iwp+QjOzK7PyAnm20h1C2rJhh2zbCiUqUHuV7hGOVGqdxR4
+guQIG0jZorBw0DQUUCehb7wdzGUjZCRxVO89JrSQHrbJDl3PPC458X8XLzSE5iaIAY5LuEFhDi8k
+xAusggy8QAfCJDNXuipKIObfzbKJsnI20EIE34KIfn50kUscTwUIZhcWtODFnUBrEQupWtAsDcAL
+yG5AvABhhSV8bFhlaKuZYmKwFkZpsgfgBWilA091nIVF1WIF9RGDzK/CgYlg8PMYXM6cXC5K4cof
+bhRahybjphxk4KpsEQQYPjKs8S6iAhy/EUJpzREuHG9cwLCNSGRS9iBNdhM7isVQnca37tBhYCxe
+9Q2XF5V8KIMxSs0w2ai1xihiQIVFlHdz6ebQf8zUHgHPURTNckq/Qiimi4wJxDhBihp8A/802bEA
+CKXnqyDSNBiIe4psRpcEYOIjhy5cLMu+YmlIxFVrMquVppsChgEoGsk94Tk1HsyQurUZK0Nah1ck
+1e099n8XMzSD6CaIARnKcYfADqWYwVdbZYDAGGAGJjphcWtybXKRPU8zplv3JpSHTmiQCMDpATE4
+nhrCqIIMGRpHN3qWH0jxAlgI4AU6GcslihE/C7wQW5VjFNp4yjDK+AWW0wReMFblSG884AU6ZBUX
+VYsZ1E1MMKFveYEA3qIucr8HMDYI4YKQCuBwQxszZRhbwL9Y15HqahpOEFQO5BmgQCM4e+IGo84Z
+cA1E0TcXKBeqqxCiFu416pVDA0imKo5sUKWgeaRdEe7NhfrALfkwjBGr4jFReRDAt82LrR9DHP//
+7b1bb2XZdaX5LkD/gS8JWA+MXvfLoyNkNVyVhg1XCchGoZDIDmXZrqpMGZJVKqPR/73XN+Zcmwye
+kzw7QpQJuJmARPIEF8/Ze68517yMOUaS0mNLHKW339NxDJWqiRBi5eqqbITXtKZLOZKCmRqSg2OZ
+4rWPCe2GhX3qgptrCJQjgMi1fO2dSrNm5Y5u3p+9J4QRK527Q2Kjv1QqsQt4cSeObT/2Kw/9dT3D
+yR19wjWkbKNyFRzh4RqKupVi4sA1lEmTQ3FAl2vQWBNCqWVjnNC/NIUDIaQYmBWsBedQumHm7Whv
+hlA6vIPgbO9WUGjzEoNGsLyDlx3lLp56h2FVx+hVxwlKp4pDYN5dXNazzsHQYrlssutYuHomgemG
+B01eBLUk1yfdjng5QN8ry75UfCo6LzDVRthWGTnQcQz+EWdVxFrb8JxJdLLF+Cl0Cb1rLKR1S4vk
+G2bCM66rgHNcxZ7LdW1Ode1FKFkGynvVfcP6RfwRhNih335LGXk159JFAlauLUo2Ve2hoHuGjApN
+0dFZrywCA8+5oFkeL1WO9XeILnE1lPAvV5Vm0qEj2vD/+7P3hGYlBa8BXdZ8qZpj3A98h47GwlGo
+kV889Nd1Did39BnnwMGMFa2M4ME5dJtyCdWcQ9YwmbSDTSJ7ira+2XSkO4cCORjOYQLKhFMVQ8A5
+aIRBUp3CWsz8EDhY3CD2OTzDCt0sn5hedZT6pjxDO/IJFHrNNSQRMwfgRZJijRY2fHJNz3oGg4ql
+MRybEHPMwvH3IsYeziYDMsS0+Rdi646DjANmIrZIg1NxcAYjylCpliNmL8/QaK+IeVHQ4CTgsQ59
+tKaMM0UhUI9GfINrWG60G1qcFg9YknltJVwl6/Kl3wWTkDqkho3OGBHzwOXUmzo2uqGHVakOGGDt
+6apg/re79LQXDsKQcjGl4X5llaJFMsdhT9q8wzrHAAZRtytXFsk5DOUUffhbnbsrGb5P+DyKoWhf
+yDskb0O1sR++Pfp65cG/rnc4uatPeIcckkYMxHq8vYMooJhXG+YdNI8Qw04goxErx2ZzUu4dEnNd
+cu2SL5mGfFIVM1pi0SWL0piJeeQfhmbAxOEuB8Huk4PwQqRxNjnn+3YQTLPhIPgc8hD8Ix5CfMVP
+r+tZD2GIsWSez7qQxlFVh9RR2hTLIFm4FFpsawQHPa04ySbuSoa3bkqyCvwuclX0juUhkGdctxAl
+vBglPJXFKN2lyDJNYgQW9ZWUZ04leYj1zbrDGkahrDuurUulYxQKmGZzdiX5h5D1VuulfOYdfaCK
+7CgzSY9c1MUicMDOkVHGkR8kT2BgsLmyCPZgopsureA9ULUOkywJnEYic7mqOHRuJG63rzpxR4SA
+BCyHxY6XQjIcCIaxn7o983Llib+uazi5nc+4hmzsiOoBHq7B+pVDnUdhy7rmeeHrNS2AJB21RL9c
+ngFi7qKjZkgPAn0koKnZxZT4DSSO1AVv/SGpUBSbjMGFObmQmyUV00uRes7yDPUIHSRpJM+QTerP
+umniBDKY0yeX9axnMLxYHGWHixC4cbUFoQpKdZXyG9sjjeaFBrX61ScOXRSQswTyGFhTopFBp3WE
+BENHC8m5jtZ1FPZMDTcCIHNKG/jMBf2A4xjwMTdAniEZyTZtRMTJXaTq6crM6HQSS02hR1idswVy
+Rwt9O52KeuJdvQ1ZNQIDv3649lkbvw0Cpdv0koUBy0knYxuFH+JyFWQeQ/zOalb6JPZYN5JVpUG1
+crlq+YfIDV7+ITmw+txtyQ6fGNkox1/IQexK5Mz76fuzv/LkX9dDnNzWZzwEVWdMaTxwRTdR9QJk
+KOYhhFZkhMbEX9YTrXa0tI12gmRsqCa5/KzFDmoo4iHMZWQrEOIh6HsdHmImY8qaNkkr+NMwlTNj
+1PPhCWLe7SCgfqQdIjYrHIRQyA60uLiqZx2EocZW6FU3lInHj/PrKijUlXEWlXJmnz40kcLuZoLP
+tQZnT4bLZXwUitQOYqj3TdTQxF7NSxT7KSbrxBO+u1tYDLFg949uHgIMGcNrcy6jpMR8uRASu7Uz
+Ae5OyhrMvTpPw6gaCSvshRNvuTsP4FCRu+XfrqwqNhnXcdN9eiBQuzhBKVe0a5cHrh6iDzrcXv5c
+d3i0ZpI66163K6sK9cch91DKcE6IMzeFIjrV6cFk/gt1Mnn8++H7o5/+4K899td1Dyc39Qn3IM1m
+jd/NB5i0qLa2Xi/BmjgFdTPkHeSbbcwsbvcAXQDeQbg0WL4YvMY7BG9ZaMAPbg4w/9s7FJvIDkVI
+V4iEmzmH5nSbzA3KO5QjfJhUsuUdVJQU4fiUdzDIw5OLetY7GG6MUY60UbDUDVcEbUCnmkfSWP6Y
+iYER9wlzI1CnTWyv1JehtvVXUB9cNsdsA+zS8g6VMXXC/JbpDqvkqjOIBgDxr4QkZ5bEUk6OlO5M
+6yhTL1WInnJtJcC2dyaXmblPwcerIIcAeBgAmtUz77lrjFmUl4DbtJUu1yVDRoxoeDcPBbLmjUoO
+TF9eWbaeD+ctQ110hY0WqvUiootcexFV/8WyghzV0Lo6N2/MqTuze/CMi9TyYl5iR44+oW8dK4GD
+L5/+6zqJk3v7jJMoGiu2ZG87iRbFzRWSz7QNYWTibmtGg6/TBRuxbi+hjgS8WxJ6hw==
+ ]]>
+ <![CDATA[
+ QGIGlSdb33w/YhGg/TUfggiUjnATlnUWm+rCT2xN+Zh2FFHq4SfoZctPuHacqDDXPpTS68V1Pecn
+mmHKSCH2HBUiz/d4rq48s4zS1cYa+uC2NaIXK1fMK3bpFdtyPEYYAzpjhR15GKZG5CeAbNqzSi0X
+gZdgV6jWKrRJUgT2qHwO192wIsRsJkQLnDGIzOJyZU+aV5ASNRxtPnnIFFMLzjOuuY8T72pFhRTt
+bhCcCrB6uQ7hIa2q/aBvkmAXb9cEBriyrBJpZBm9oN7mLGCRsDtbu8b7LxeWYoikkR4I58/dHfXW
+g66wvRRJ5HBJh7S16wwbRchyZQu8qrM4vcHPeAuzqfKIVBqeb3zFyOYrugKIuPucwXCQtJqg9nJf
+saIa8RRH0afBMg11ML6iRks4hHTAV1DX3r6C0hM0UVUA+YLLKeYrivuK7mOZXquUEyuWcAyvVfKM
+8BTN564eXdOzfsK1+tYj92cOlRN9F2JxHXUQBXRzFDkcG6P4bV8nm/W7EoydMTansQMDTP1FfoJD
+GjHp3iQyRWdI0jsKpIrA0GB+IvU1KXiZkxB3Kv4SwG5Hm+fKUqBjEO/hOSW7ONxL5OmF7ITybz3z
+ts6/Eqbxg/RQ6PRfWVh3JzFb6mf2vu6mYY2XycbrFwp3CwwQQkO27LSRpRa7sSsm6YBLriwsHsQk
+LzCcv0NF+5iV+YWUKbQXfCPsbZBsE1zZAq/rJ05v8BOOQtO7mFV+RDXdjAwyyiLyMKY1Rvit60nf
+pKl6Kb1zuYpk/QxcBezkuIosUDHysNmyD6Hul6sQacN2FU0QxHcz2o5Yx59J0gKqwlMkZqyeeArg
+m/IUXrvMdSr5UD/04qqedRb9F5vEY49ZCemtFq/I5XMXpDMQ0QYfzQSBNDajxtCBkgodt5jEgSK1
+c5IkK15GiBA4LDm525zeiVGwNY1uGUQR921tsFk2YGqqukiLNa7tL12Wa0t7QHROE48J9NCeSyRz
+8+khWIDC1cVP3tdKDYYXhNBXCIArq6gaZi0TA7HZfCtOsrkO+jSvLiwuN7SchQI+o54eQqSuheuW
+15KuLmRoYyiOMVbIz7hBxZUKhuZDXiqw2F1wVUO0FbJvhCvb4HUdxtlNfsZfVCNfLPGhVMGWRt6S
+tqV6ziDaYtxt0MDuN9U02L/cXVSwCiIX5LhnAh4SOkEzVQPLqkMwpj/jQ2DR5CwEm5K3aMVyEIli
+4S0ouchb5LrdRaSa1E1GRdtD9THchVAdTy7qWW/RfuFw2r6n8pImLaIoR5RFp5KmuYu88fipH0FG
+p5XILlFNMyaCc2YN6zpXXGYWXjZY1+41c1yMEjdX1Xfhf7NOocrHQ8UGcxYDugLB6iNC0tOluz5d
+2AbIRUmUEPNKsuoj5PTLJdsQQYFWcN5+TwsPpsj67qlVm97jxapsD31UU7Qze18WYan7hOwxXVmH
+vjYoo0G5MfuyZWlatYJhDZldrirEB1NOonnqce7GFMfgoa/dXmque0gsSY/dv1hYSRn36ZN/XQdx
+el+f8RC0+DCm8IiTmnAfF6G/jxQoHfC426EQy4mXnVJJ3h4imYMwHgZo6wlycBDNJouYQy/yEIRk
+20MstysXoWkHNO6BRchFNOt1iL7QXMThIdqY5iHYE3iIagL3OuafXtOzHqL6nezTIRDCnJgmThdQ
+ZnmDEawmj/qa7YyRt68YZRrMasB9GHOY7zojD2OydYJNZyCYGzRn6RBx4i56Q0Ke1mHtgLruKpa3
+3tdntsAKiQr2fh2402iSrqxtDf5VuNMSRCmZioj5iZKnQb5Kz0reb7+x08i3Lij7O+aD+9V14p+J
+rMsx7dAgSdbiXjJf5doycB2oD6lNGafr4jRriGGDU9iXKwu5d1EFDrmT959xg0DAZ4dk9ZdilpO8
+mO8G/1ptJ4xr++B1PcbpfX7DY0SX256GpF82phHvw28gkyTGhSK/oTiOso01SdGxCdVoxWrajgM2
+KzyHKc80ZDyzCpwmjcUhQB5dHSt1eI4mEKA2rTwHDJpDEpDWCJFUVjU6S/ccIryX5/D6ZqXKiOso
+Vt785Kqe8RzDk7p1FtDz0qYbWZ2NFHuO5jB2GDHb8ZUNQqM4VwHBoUlUIGNobMIpRqvlKOBrvE8k
+9d2ZWlG/MTQK5f2KSoMRQazzEq5Vfi9xaorw5craViCXZth6HW4dZSk7O7/kfd9/xvuWZIjbIU9/
+alzqLxTd4DYfCdC/f/+XHz/+4Ye//+2/fMcvuxWcsdXPehR/Flv9i798dCH/6R+/++fv3//P73/8
+zd999y//+Ne/3L/zH3/yd/7zv/7z959n9bf36A1j/7W9h/3vm3/lp6B3PH7DLvyOz3enT/r7X+iX
+UW38u/UpmQ8rCcmCcPw3Qgkf9F//Zfyr8Ml/JT98v5aHa/8l/9V49V/Dr/y/tXx/e/z1dPnrI7z/
+1dP/+FT+7j+1O49H8OSG/PrGgrl/8atv/6Ctefe39sUegt3mr76VuDfUmMwZMrv1g15FSzpLnVhD
+bUTBxaQGBaDmLG8SJ87GpvZBq1qzYQNNzVAgAOJOQxGAvMKsZcTi+RLIfXRfV4tT7zFtS0AuaUNS
+OjJ1CiSZXkVRZTgHEy7ns4ORjeo3r+iBsDQZrW+FLtrC+U8uTm/HLv7q2y/1tVOUPsEUlfdXMcMn
+tQv6OmTuMkCb6UohX33L7JAKlpkWPBkp07NqdsCGntVWCSQcIKWNR+wbPYiV41ITlwzumFD3zKur
+21w+sQBZTpNqxnSt7i977/ef9d5FcGkVURhLs7f9b7bZ/o287uc9lD+P0/3wwk7XbBWb31v2ZVzv
+w2NpDy5CyQ6Q7FzMoN0NMKY2jGAn9ukVs2qRVrdmYJIWdLeiifuBaBT/KdPKM41R2X8+SLumkc1S
+BhimG2R+IDJY0xhP6La1pPza2zvrTgVLBDUQs/7wx8OFrceKHkmY3edkm9gkmUK9uLZbXsCqYnEl
+ecsFBpNHp7QYbTZbn0kNufboyxzKepbDauuoZ2p0t46/+hadCLBZGE8KHjROA+yA6JGaK1pty1WN
+/m4En37DBimPd5N7JbPttV9b3UMUm1G8K4msOY7phkj8qlIKFy/I3tX3FkEZ/BQ74PrqW8D/olgH
+eSwa9cuVPvUMSGyz4Jz/0Gg8SHvV3fefwXN88zdf//qvf7m8xl/838thfPu/66++DfHbGL/9xR12
+/dcxYNK/Piz0lBLxyWf/53Ezv3wdN3PDJk45GYUsR1wSlOCt/+f/vvnjz3/2h530KVT5NFAJd/9h
+ffff12t/vCt3f3P3X/5ruPvNz9e//b2xDT8NYb4kgPmy8OXLgpcvCl3+lBTx88OWLw1a/tSQ5UsD
+lj8hXPm3TBD/PYYqf/b8MHgxaJi2DTYBpnMbOjoW0pZw6bJOk3FA4JLzI8GBYhJTbuo5Fheqazap
+X8EqYupMwGDqqidj6tTnt6mD55Y6gXi/oinbAsjWeAymXozHQ/jubeqU9hm4mt1NHVJeRNWCa5d9
+cl3PFpKL30vxAXMvYb5SWJLKyELLg4v2zVXHrh/rO9tofOIk5tzlX4oE9ixUiaB7xWQFSpmPlhg0
+C06YaoaHK0NJpLfD4KtRfa4jkBI+M6lPFy5rh5MVIrqAkDFE75geQpIp+ow21ALp5nu6VnmxSxyp
+Vkpsl4uEBhiO7zW4SxspK/BoAz74p4sK45RzN6X6diu3ry6LA9bguvvKXoLVL+9Hd3zVA8xXHt/r
+Vn1vbsoTigFqFzML/kDoJ3FiaPdFzYdlw4AyIOUx+TGNmDCDksOhJBJBTGpQpVuzP8Pznn1wTYYd
+TJQwOJ2WDFvC18Dn6z7DbT6jD0EQXRldYpftgRI8mWCAZnWwa7KiihSfHeGPr+lZq852AzNcJnb/
+ctPQ7Ao3KC+zHWY6IKv9AKf1nHxTpHzXJnyvRCzwUSdXFxJZNle1nFKUSlZ/14TkYHKopew21tXE
+FfbS7RoRlybpnMFY07i6dpk2dwLGvtBAFBe37BTK7nAODaifeGPr0jAqbn3glW2Gn/rEATFxFYmd
+a0+dEDW/InyeV1ZBSN01924V6c+4TFTHqo9Wq932Mja+x91KP766jV8+zNe18Vtb9IxQebTZD6kK
+71ZOBJqOHpebOLpkg3wyuo1DwgtCHBVBt/Gw8lWBVo04bi43U8XZadIdTSQDNtEy9rxbEQkvAiLC
+PMrEi8J0G9PHwnVyo+d3WHjL2XDqxt+rAxt9s+4H9yeX9KyJJ79/Ygq1G9iSpkByXJZio64xOXVv
+ym1DyfSdbQq4OgWLhgItOV+5bFylFkx8nT8eNPcmwB3jX+QlCpqDLGZCZOr8OgThmvsOME0pQ79c
+22Z36AQo+ZXf9ryNfJmvK1isNFiw5JvvbEZegkoEdHDj9XfFxp3EZhSn4wdAZehhJrFzvrZuWXmD
+hxF6i61OdPZKicGKUayIEPyFyLr3yKLTW/LV5UQvn+frmvnNbXrGzpsrYaQHTgwyM8ycqWTpC2v+
+x5JczSgCzACz2T3abtUmroXUGps8wdNxSYLDhIaYuUSlczvMPFmMHgzkF43MrIPWKFZEVPGwF1PD
+25aehTKPw8i0EAHH0FtzpNXja3rWzqPdQPp70W/gYNoAtGW0+LwoBrcptbrR5frONsX6mMvmATau
+CI/3rn1DwJq4+Zi+jx4ri2BFsBcQIhiN5IrIjdM2cnSOpJ0QmCEV+PNy5frL1WALOVaNhu4YfZ1K
+zEdonERsZzff19EWWb4BDo3ux/iTVUVyxer1TgIrH4R1eRFSuHL1Kks3MAgmXo5Q/dx1oudB1t2d
+dfqFTNwZrZOT7vJ1m/jTZ/m6Fn5rg57RCo7GAVHrODAZgNoknQfWGgMfEJeRahU7yBPjQtGV1tzC
+qRULAGZTJBNnLPtuZt6AaKtwAPkwb3AvmHfI+xhHrGcaCYLMOzJmUoxlZ5s3lTfIOoez5YGBlsx8
+2fLhj6/pWQsPfgMbsJEg1VmFhjRHMBWZeE1OILJi7h236zttChxbY6gMnCQYnsK0jWycSJhoEA0H
+S22HISkEpk+Ob0FrAFOb6WDKW/c6aH8vQ1rXjl+9XAo3lMH083IgsETEbeRtuOpbXJE7t/LmG5uV
+j6YKG7kTp/SVZWU6iW018VdnwxhBIZ5Il+LVdd0eLnBy4qv3n3GhWbPHBUqtWfqLWfmu3sV6fLUH
+euVxvq6Z39ylZ+y8mYB2gYFm27mo7rDVYB3BBpHekLWZ+G8EnRXFvrjtvHKcJsm7Gap7JE/KWzRO
+U3HaMATS44Olq0A+w9zneJKhi2RWhh7Ev6RQxe1cUE0Q/iOZnWvStWaTCby4pufsvE67gzWiBWV3
+sFAVkN5xNT7MIu4J4ybIe/Rc39m2oNIw1xEEHC4H/I/rgYNNg0Zq3TfSj8RcjNgsGefqluFGWgOj
+Cd5uRo4CEZWrvFwJXJPl2soVGDtfZE40PZPHsUzGzG4UTDFDHHXifQ1uGYz1XCoJfQ==
+ ]]>
+ <![CDATA[
+ XluGjYPSbCbH5HRY60lNDSCpYnFlVSObNgunhvP+/FXSUCRk6EMj6i8mubWfZjm+6km2K8/xVQ38
+9vY8pe7dn055DQ4p/gkCCdk30NYBOD8ZjFe9mkjk5bZKf380ibgVtbwYHh8eqrdunbMU9tzGfOic
+hapTeaguZSauUD116XQSU8JRwzjROEgmEqM9cOtqmjs6ERs5RPSz/PFlPWvi3pmA8b77PWw21rX8
+xeaunHtIeP35raSh72xjgGOA7rGvhCZJActbaJFJCtJMVGSin6gFvg6hUdv0MpZxOCfY39zKuTOi
+eI7r7xWLuJ8uXVbOoMt6zjmh49ud5lWJWrOJiJX4zJJOvK9Z+bom3nVZn7oYl8uWkVsfVf2pvjkx
+hz6scV2Ma8uguO7ilJPe6vvzVyldpSEiLUUtL2Tl83igx9dt5ReP8nWt/OYOPWPl9LwBG4NPcDNX
+7itJ2+nxekH+jDkZO8WRaubZ9nBI5Sw7UNmtieoTmE6pAlCLxAgjJ3/Q5EU/qm5pGk91T3Ef41HH
+uDRSzMaZzSjGNbltnHHkZePdikTZBjikAenn+CcX9ayR+5hbC1R57RYqiw2qrxqEA84i3wsjbS4y
+fWf7YiLxtvbDcmppSCPCBr4BC8jDIdKRm+3+ZmTMK4/N040NVXiI2gkQ3ci7JtnWOcZ8Wgjz2lLY
+Bo1iI5M81hgPI1+Ho9Exrxy5lHLmjc3K16aRzPk7cfJeWVag/IBQDoLSdtBir0ibWWuFbNfXQU3a
+dJhLfu39+evMXNAK1JDvKi9VdRPbsT3H46ueZr/yMF/Xym9u0VOqus1GCsCPbSsnoebfLFlmknZl
+MNqr1WZrlNIsOxc4y+089K66GwRnsnONYcnOpz01sUUwKEHJ9zB0o45UmCA7D7JzxkvNzoeV3UoM
+R9kN/ktwNr2Yma/Y2ZRvxEn39KqeNXMfVmsVltGg6QA5C4KSxiQ4WyKnfYJrDvfhO9sY4rq0wtVd
+EjVebZvYYahvgEJkLbaJh2ruTcxqw4pZIA5HM50nt/NN/o9eDlW1em3tMvT1e8yDLjug4lZ2Xp5r
+isYBs8Jx+BBOvLMZ+trgwhuQU+Eqrq4jgCAKiM4cyfQ+5+Ay9CnK5mvLqkWJ0B7sgv7ZC00IYsAs
+Bvt4e6mwve4IbSsfdi+0jCvP83VN/eY2PWPqTDhmYrfms5TVeFJMhtrj9oSlwwdXTAmzmV7FOn7T
+IWYDIIK9jZy7aAlbEzlDHtWemoRVmUZdv3JYOnexw1L1YOpZlRbroQRKANmokcORmsfaZeu1R7d1
+aBlwQb24gvbjy3rW1n3MrM3Ws9/E0kTsX1cwnE3nrKath9jCJqTXd7Yz1qcoK6WrlPwTdSOoa2Tr
+SU1+5uCXf5u2Z4loFOEYzxXkJkw9N3Uq3dThJ4Wh+R5hUXq2+dralQAxbbo+Wy4hSoFmm3qnmyZT
+7x1swYl39snprjaF1A3GTyyTfA6m3suhkNUrxqn8RKXGy3X4ePQdis3Yvf+MC00UN4LUzsZ8KZb5
+unmZjyd6WPrl03xdS7+5Sc+oVjG/mOHqTeWwdA5fzCUnA7y1GDH1omDvXixq62muJ6O2q5u6GljL
+1C2vbyqYytLROYQfaBKSYek82W3p9LlBrmXPz+F96iLrcEOHEwblVMjSt6HDSQ+BPaySMnTeWhSx
+0yhiP7mqZw3dkUWQKU+/h51CUVCd3sWJ+iFTtbZAf/SdbYxlXwXlXvoOiVIgp4OzuuWgOCOaJAab
+WJOj3I8h4BV1LThm0K2l2uuWTp0EUFIGqzkEMr5cuyyd6iTic+ucdP5Vs/SZhm3gtV8NrHLznW1g
+euXKKrKDB2P49eq6Amc9wUCOh2xu57S9R4tcMohX1iHAmdQ2t8nuz7jShARZE8ZZAyEvZOtejPNi
++661zyuP83Ut/eYuPSVcWdRgFs+fW3p0fTrnYA2mRw+P0Qx2qHd17KoBVdzSW8zSmZFktRgShofv
+6h2LbVvgGE17HJbuxO/Isbqp60zvbVrXPNapcnuM8dC3DnOqFGcMUKBQaMfwuYqf6Z9c1rOm7gCj
+vgyi+E1c9oN3r2M206arU7knmyGP+fg72xkZ6fa+AhQU05jkBwwjUycnzWbqcxjaCzosuyEr+olm
+cLQMMbgZdvyO8LskEiCcoPaYr61tqEdMctlclgGtVGIf6iWmaZ85hRT8lL3xzs6VtkxV7FDIhPzU
+Jxb2UHH/1rYD0ET/lCFzQBbX1hWr+6xPKpKE959xpQxdQ9Wgomx5sWN9V+S2ulieh7FfPNDXNfab
++/SMqBTXl2HPznUbu4hTFQUHG1mpcMJOkhdL1fUN8dZoh2pMqaZGCZBetj5Kk0ztOvmHOeiyzLVW
+oyLYxt5Mlj5pwEvGPmTsGo6RrVtJTvX4betIdUt9ItmUnWC4fK7kx/onV/WsrTvKaFDzCXc2aCjm
+xZZCT6b4K40Fo5/ZwlJp98/pIRTi9LbekSZXL6NtRmeJLAHHlXNkC5tORjBVDVWxq0FVGj7N7Zxc
+SepIRXOKKV1Zuswcb8wVPBKLIT5K04hFUoQq6cS7OjdaJF9fNp5Ew3p1mbgMifcp1ajnTh1HNTy9
+39VlxSYykXGpB9T11DUmiNJAQ2crDr2MgbddjNsqUclAjeXKc3xd+761N09pxiG/ANrhOMrR45J1
+qxqGdVNcYU+AN5EI9bJJ1AeDkyu3YqiVxGinEqtu6FhZ9zCf3Eljq5zHgWVP1YL2SOHQrLsrapfQ
+i8wbhi+eb8zHkEqAnAeMXfUhWhXW+Vw0FZ9e1bPW7QijMRjEsVsoxhx6iQIHsB+yMxTTDjiEyruj
+przg2NenQoY7KSsxqOv6Y8Nou+AKjBa0jyzCKIili/epgg2IEdGagTOsLGAIKG8NtF4uXME6k41w
+2a6bZ9LebuErZ6v6mCkJ8XD7bZ3hKKl/zVBuHD+xKrljqMEZldEXRmjhXiM5Hq48XVeOrhpDKe9P
+XyTjV4iIdI3pvtS4ymY+obuzv+pRxisP8nUt/Ob+PKPdAjUgqMWNjKkm+IwlKTLFxCl00qdW4LRM
+qRDPMFCU8yEZq+4OQvPVTFxGmqX1Zby9AkgsE48HnRkmnjRRFlRlNRPXAV5EMISJZ3vC0h/YJk77
+CHUYAbWFGe8iSF3nqZ3gj6/qWRN3dNF8uIOqGgv21xW6tXrIhIa21YSDq72tXYE2LQSvbOGEUubY
+ei1BHG2M9Whqnql/Kgps4DacWrgRMGJn/Irbd3bfRcUcdPi1pWTjQP1oHQZoq486e3Ece2Kqp555
+W6c+t0QkIano476X62hzYN/QGsi+k6s5o/oSrr+b2BCUjku05/35i+RfktHytxBeSF5hHopoLsIS
+QzsM/MmDfF3zvrE3zxg3tfPsAPRt3V3ReYQYXsaNKjcz3qLoqxpoUH1dRZsPW7qtSrrNBOahqIAO
+FusWwAjqA8bVlnUHejXbuh3gIkVns+4m6842ihRsJrVni3A/epcfoTpAtHWfjjnoAE9CUz+9rOfM
+uzi2aHZomINKuaFIJ6GvdDvJhtvRQVtnns8o2ne2K2B5LgA0qcgGdNSrmzj24ATCs4bsmPxiRF55
+etgrBuHRDIjuJl58ynedzsqHri1dJs5QsBRuKXtv+57C9pP0iDrw9nuafScrY6Ja0D07ulwXVy6g
+yD569p4yI0hDaYhZzJV1dMmmSI/Vh3l//hqTRtKLMWSnUzxnZyzcu2fBycvCdAtPV57kq9r47Q16
+RgwBHsBcJU+zrXxlrqqtS5JdZo57XlGYql6Yec5Bcfoc28gHYzEot5LAizp2eJSOsatyQtmuUnRp
+B449UY0Tis1h7MAbEQBuwR55RCUTXa24SSOwbYSuXItQNt5MXyk2P8E/uahnbdyQRZFJhei30OSB
+inp97AeN1WgnjOLJuH1nu4J9oVMI/bsV4xWaSJJlDD6jq+HpZFZTosRnKBpWA4wuX6Ge9fLUOwuv
+KFeRlq7jmatr7dradafBmdJCW2++bKJtKwchk+WLkC1M6cw7m52XqtEkpKoErLm6LlDkxs69FcYs
+Ox1CNMiEEryyKqPlNCSgUA7w27nrJOlKReQiYpR8ITOfbuajHl+3mV88ztc18xt79IyRI56NPaTN
+TF4N+q2x32TYt0rJhmJKNjGsapK/dLXdxtU8g1QyWpmNABkL157BwkFOYuGPimw0A4CwiSnALFzz
+CFFcsdl9Ss8mS7AtnJOgoUTd3cJnld5JqH6Kf3JFz1q4s/aExplhd692u38ry5Eo2Domo2ffK4OY
+D99oQ2BhSRI9qNKOATIoHcKr1sdH6NGO8BalZT6IjpOZGYUHzGxupuGJsIDhwRoR7uhX1+JK7YTL
+6wMbcsgNPGs0DwPvdmdvv7MLmtUuxl+lquXqOhAM3fL36KhYSjcqmdHHLOnqsmzc6VAN13Jk4qcu
+dD1xCcSCpmC84WUsHCkFe5Ll+GoP9MrjfF0Lv7lHT4mVBBWmGg1Dt/EKJAgb1/AfNk6bEGmD4vU2
+EfsitZwcw4ZSIr2OFE0IUXq8weP1bNV0KXFX74luQ+cPNJ8jl50X2XmoNotoOUOnU3mYOTkjKHkR
+R2QAAeOu8r6uv/7JJT1r5IYnWq6E37QbOLLJnXFTFY0/aA6sywmPv7NdIZ5eShBQ+eF7rNSWyR/Z
+SrFTG7ZjfDCDywYuUpin21w73HHS0HAjnwYIWHtfQ9hOofFk6TJydRzqMnKo2Rn0cCNfv2DFg8T0
+z5k3NhsfTdM0jP1sG3+6bJhKLjbeHRNLLX9Kp4CIvLer67If/tl0cN5/xoUiA1m1RToUfC9k4y4i
+wAbdX4PJgT59lq9r4Tc36BkLh8GJwV02g1t44/RUhzmY9FPlfEWHuXU7xwNhN1LJZR4WThqPyGET
+Yp1Mz/tlh4VHs/BOQ3xbeLRYvRpLRTRYNXqztdoTF1kAo/yxHQn5AFLfjJ1SRs5FVIIIP8k/uapn
+jbz6PWzMFQbhKsNUSxwlYIVvve7CTKgby27f2a5Yp/wKJaFMRx/WWwiy8nVsJdfNCMVDkyk+f+jP
+xdyCsVGSB41OdczMvAVv/ANcW6bqQeyTtcvMp9laHhEShrxr6nVl1lZU4lCf8cw7m1BhaHYWA5S9
+/oGH9eDJ5beCKjni1pss00tnT9chM1Zk5goX3n/GhdK8odAk/e3+Ukm54Fr2LI+v284vnufrWvqt
+XXrC0NX90oT+yIehQx6AoUt2o1DKgduRBnk1vJtAqhI9Tv2QM01ABhKyDVGW3pNn5cVhMBndGCw9
+xIfeWcyGXZuHoWsqQXDYLCqjqcYJ/fZt56gQgJLPNo5WmY1GKSP6Yf7JRT1r5wYkiimgOmd3MDf1
+xEYb07rfy5R80HQZzQ7ZywZMFCw4GSKAJEawJMO1Mguas0/Bij9NobWOqnWF9LrUbkZNgunUsDtn
+TOIrpAQCuva4sH8XS9dtDH6TB2C/7nUpARmCzWCs8EqY9Jtv7DLlkkm4l/Isz/7KMg==
+ ]]>
+ <![CDATA[
+ MXMolx9bSR3Kh6F5grpSvH59XeK4kJ2XUTeE/dyFSv0miqdYAqUvZOe7+FYevuqB1iuP83Xt/OYu
+PWPodFIyiNh89MhF3KihkGkxe6EHGk2eUmzTk8ojusXTqdsk99Ml65HlIUVB1sTkWGq1DlpCVBje
+4TQfOmihqd1djFsumoCxxgyj92OQ+ezZSoHb1OnF8tyz00jQf1ufq04/0j+5rGdNPftNXInK8JvY
+nOIvoJoiU5/q82uMK3g3zb6znVEIgJqh8OBsgUnBTB0WCRIfI7PVLl6ZdNYurtLRxOB4m2Vxqne4
+qad3SUOcecWw76yuf7lWfNM1U2IfM5vCm5l6C9WryDlHZ2m49c5m66XR5bpXDtauvivD4BIlpG63
+G+VgkeVmKXmqoHa5jmuyM11yK+8/40qFgyCMg1NqvBSwte8KXH746rZ++Txf19ZvbtMTti6ChrUl
+M1Sc29bhVaS+GbJF7wVmo7g1+wiTqVMyjgTT0QeT8BFgRUxewlc343nLXhSTrTM7UstB42K2HtT3
+zmpsmK1j6s34gPCpVogTm7Cb+org1E5TGU+mTv5SkaEJZlifXNaztm6Qorh2/Sx+ExHhDRLK8+Gz
+GBy6vn5pHwX6ThsDbBBcGAMGrqKmsQ2g5s4cgNHcl6ooJTKy0bWJbZ4EhElRCJ1jnQ+WPoUvzYPB
+zZjqtaXERgzhQ9axEoWSxh5AXRF4zK4iWmzE79Ybm6Gv+1hMxrDbuNDlsiHuEOy8RyeTAiml+85Y
+f77+bpGhYCkOpwfet3PXiXIaI3DKCMNL2fnYdbi0v9jDvPIsX9fKb23QM0aOUgTW8IBo1TigcKHd
+A/eqMrtxiBEhMzJKdWQD0TW4MyQtrnkCMTWHZrV2pfUtmJz0MusDBwtp+rS4XQ/RTHwd48vGKxgK
+2TjjxXiQTSQxjMCCSZisE0S8wBMTF/Tt6UU9a+HRb2CBbzIIdRWBX2msJuxRFIhntRHC2Oe6vrNd
+QX2S0UpiipiR6Y2eoaOCKlBphElFlAlqgayb2LibDjKBTAtbY0rXjZzmggLuoWnu62tl5CI5hlrF
+xvrcyEsqln+uo7LmeuadzcpXCqBiGO009bAv1yHzka2CtwfZNLXYVHAM0yhgLpZFS9jQFZ9t99PO
+XeiKWpSZQxMcXmz4dOxTPMzjq55ov/I8X9fOb27TE4auSYUMoDwclj6DzZmnHI0USucyt1v60kqG
+q6TBNZHupo6jZTq32Vke6api6NriGDqyaVW0NkcpzgfGY4r7KI+YeSnVoVCQmMHhEeeRoKuZ04Z0
+dmXnndqAxGv8KP/kmp419OB3cIoAygYkuLQgJJA/+RoUIQWd4I+/YVNID1wtTL5BndxF+fI0CkUA
+msFKyYJVTe3glQpb7CxKVK44PbLyCVnWPdA1iM/rtaXLaqC9W16m8F3l77iVt2DMbzCD5XnifV0P
+vFA8lVJDateXDRscVpV++mA6IdQ0I+8esDxdJkVRTFwknu8/4ypFKLmeLpxE3OEXMnHxKgU7wcNx
+kPcrT/J1Dfzm9jxj4Aw9YwykyNvAm02XJ3H9lWB8ahH9Fyo7W7MRvz1m2QYuMhluDI08ETcnT82F
+Zw/W1JauQkkPFm7RullrkXkbrzPmzcqejIPbzbuNFYdLCNhJJNSFXR9JGNiLK3rOvLPhimLhuLDb
+J9lS5uCNj2OSbppx+zhKeJhLKZx/E/6bFdFFmvfB1bsLgJRmirwzB+MviyrkVZFbWLQsWsVlLDU8
+ZOTFSLDuQbkwLZ6urZVxw1K9gslsDHlu2320om5AhqixnHljs24I73nWy9cab/LlumXdIIQo2kW3
+U/RQ1USA/Uo0iVfWRavlDjShypGQn7pQqAMZU2lwSeUXs2/z0qq67OILSg4Xz/JVrfvW7jxh2xPJ
+quyTpbJtjDKbbQt5VoLxZDMTPcUVhhRKwrRFqOmmnaaJ6YpIX2TNwxTeFFpo2IBHa5OlR9UtwqwF
+RjV71q9Zi47aetoGLthyCkcirpIak23JeSP66OqjiTX06TU9a90OJypjxOo3UIEhJOTV5xVmUCU9
+QNJdH3/Dhqiaka1ECysvYk7KsnCEn3UOJbjhtW/hWlz3gXEZT4UF9MDGWn6wbSOkYZhZr19ZKdNW
+r6KEKVXdbdrLTrLSiLVco1s339Ysu6ggel9Ey1ivLhumr45lN1d2yxT6ojnUoM7XlXUBUkbJKwnE
++v4zLtPqKQguzJcaOhv+JMvDFwkCXDzD1zXrW9vyjF0zPZadumnb9bDs26aF6GwHHdkKp+9VyVr/
+suxa1Wy367iCQ5Qbha7Ernvx9HviHbDr7HYd4kHkGJs63SP75AvzJOLycuSzqCqWXatvsu2aajwz
+bdFpIhSy12DJxMVFPWvYjiKqmYze9OkSxzRMVU3B2hQniWqtxc9v/4YdsW52gcRyfQAoG7hCmfU6
+zJTdSajCDbtIjx2WO2mTACjhPi5TaenRoZ2GRUqFyZ1Sry21Q5u53EJ+2BGTN9Pusdg41XLrGvW/
++b5m2S2K75HJMBHLX12mJIfiu/fZcoEZ3eCmfR+7T5cF+2YQzB2E6+cus4EiAv+SDaXyMrY9oz/E
+hy+6H0+f4+ua9o2NecuypXFSBfdEL31btuwK0zbMAgjooRO7wr0r05bxd02VybKhPUA0Jdtst8jX
+gwfjwjNUg6LXYuWww7BDMzhq3YKsQwd2yK6aIt6pnkzkbJs2BMK0TGK1WdKBRCINjWmV6k8u6lnL
+dvRQHZx7dgPB+UdFnMXymhDNsoFwP/6G/dBFS4usyqick5ZqF5Wyjc3AcKxg3WxMD7HaZBAS5ZsY
+GBiCh3A8GOAInsPmW/7JWsu1AROWiFrtI8uGpFbx+DqFNeh2+53NtkeQrBtxryh7rq5TBK3GWjmM
+ewxJGgUbFri2ToQ0EeNu/aEZfupKK0Ory9wICVFMeiHjzv4cH76w7548ydc17Rs784xpk/1mqB5H
+P0ybXosEC7IF4xkds2XarQqd7jq/y7TrcIDasu3Ba4nDJMm0i8hRpw0Uy7Tp1aA4WOdB7hSrBeNN
+DsHElhvEfNOHjkzcELKyNLZpi72NMdXoLBDST63Bds7FVT1r244Xaokagt3BrosjFjIWiInSi/xF
+k37h8Q1FNpFS0WXI4hMMsFrIugtzsFOjfzl7YDw0cQdEf3ruKuniFX+U1B8KaV34zxKlipHHtaUq
+lzcAdcvnSRJ223aZxTB4peQ+04n3NdNe+12j+gwG9/kTy+jByrSnc6vaDIC1BWIt8eo6Ub0r1a7t
+mCI9d51i6lw3G+7GGF8K5zKrP8aHL5i2PchyPMfXte1bO/OGcZuQ8TVV9S/SVP8yRfUv0lP/EjX1
+nxQmfmEl9S/VUf9TVdS/VEP9CxXU/xT99H9TKeN/Z1LoN2WMP1ME/YlP+PXPXdSc/5moedD7Hb9h
+l33Hp7vT5/z9L/TL6yD55u/WZyzrVCkJnxyO/0Yo4YP+67+MfxU++a/Uh+/X8nDtv+S/Wq7+a/iV
+/7eW72/3u5R8+esjvP/V0//4fX/3n9qWxwN4ckPCT+nBw1UYgJ8pqG3mWSUeGRXux6iQvtk4L6O5
+qVv0qqAkCdFv/QNGVUF1Ui+pW0qIeU1AjYBWxA4SpOtjA10fzYsX3GwWQqLd2Qv+S0acBqJt2G+A
+Tfrg4V1GtZfhuWbZx2ByjOaw0G8MLqEwAvzBhSv1kl4RyTE/QsjDC3ofAnD7EwrNPjrxd0Q4FPm6
+pupFQb8Fn21qM9mo1YAJUsnTouTNQTBwRU4Ln4UG01TWRn9L1H5hr0DfBTL1zulkLJA6NOj8dGcN
+rNwEFICir9pX0ugFwy+ekXL0Em818K1Ra9GxBTGhVdMAjaA15GPKCsEwPg4qc86VMUH19hOduQ+2
+TQqsPc311HmhE12gRh2SCdCIDUVaZNneq1ZLnyptZrWvp+niUTspXgVTPpSHaQDrtFX3m+fQBMOq
+NEUYuIMxf5hyiobRKBETwmmR490YOauewok9LWmQvdxd7PSPP33exmRgvbIWIjS4Qgpndg6ikjBJ
+GHaaz4nQwbvLTLGoCqwj0xAngk4z8UV0Ao0U40/YEFOxmoRQhbiKiDST3H+j4Ga0bGK6vUE1C6Lg
+6cqVdhcTjrhfv5SMVYqz6x44NdMOvAjc5dp71hmkQ5SlDc1xeS/JNn6NascKai+WAf/AoIEnO1v5
+qU8KuFi1ER4zQcULBMBnHsBrhr7n9tBz55zSIDXISx1I8slt08Yb0lKqsi38Jv/dffOdWXeEJqsU
+Y6fmCa2bXikskPlkawtapkqA3H08Q0THdHqTAbTEmhNUaprKiArEtKXIjanOwzcUyfAfrfsifEjX
+czbsSanmxeFKScqTssEPCeloS2sVQKSk5xcHM9R8QBET4vUUJj65rA/aPs+EZqEMOvg3QjN/lIRZ
+md4uno8mxg/2mtgGIPNVCZlYDI5IXpjONJSH/YY0EOVdqSAUuFPfSZrwPjPtWOk4gYmreiFJGpTQ
+LtiIW/ZRl0y5SulnMaIb8O9iL2O0DOhqFt4+HquEAsg2saE/HTjRfLJSmWi231AB0T/hjJJBeSd4
+By8kyRgCHvDRsUHLiqpiiPtsr+BoAPB1h/rql3mueTgXXmguI2P3QkjTMvVYaWsIQkFinJ1IV6Ap
+c/7Dh4C2bFER5lMJSoNKq8CRaiyqnzypjzc2Qg4rcbsdoz/ETesjPw6PtP2jTmaxRf1g2WCl2lpN
+6seGne40RbvJaKKsLaVqJSJYe0FILxsylSBK+5Q0qQZWl4DB8KCD92KPxTgcHOqIWuukUnTKzPpm
+Cz5Ur5d0oEO78c1M8/Knp5c0NJlRJWNhUZhCpBZsPOSDbaXA4AWDtbnYYamkurnw98WNeC5bbb/A
+TcGjHODd42+Lo7KlMn/64Bzbb1thmZFEByqrkWn/HAE1IjGqLjejCmXwmUTSqpNznXcrOAP6es8q
+E1F5ujIOkG9MlXXohkPyYeIveNP3p99U7V4AAWuHSIXtZJ4Z6kgz/sl55pkb/5oH5s1t8+xZ+WlW
+o8ylddOtHz7oHNF8nncqAUVLEVZkFoVhHc3opHs2gGNqbhmiQ8IQmp1sJuxHXSdbrRgrzBzrcJd0
+L+9CDAkpQIXvYBpTpHilK2MQsvgkhbA7QipCtY/+qfsKnyQOS7icHN6zXIBqMLx5gpobfte60xrq
+z12zUhF1FtHOJvPf6hIrSRENaLWxD18VUMfV0LSyteKw0WoM5rwgVUEK0G1nQ2nCqbhe6bZEAib8
+DP2fXuiG8xZDomddRnfqSBdlgfTHuNuMt+L8NPe0bnWhAeu5Tab3yUPTWAFGhTekmGfI9GKuar2g
+9EVuzLXtAMJnH0vWgBTMr8bRW639Tm7q54cq7clzOCWTvAefDLrsVL1U93g7PZM6TOfM6zpH7qkK
+N4I4x9Cd937pQaAbwlvToEqa2RsqVBZF3eKsnVB+yPuVKiY8YMCd4VoTWHqylHG+dw==
+ ]]>
+ <![CDATA[
+ yjXWLYapxYfOQHUP1TO5qcKeXXlXBvNNYDZ5R00IA00Qg6Ma8cpbMm1iwy/DynDvT39anZ7ghUgR
+qUK8uc3P23DPN8+Agw0l9prJ9dA3EH2CBO1Oy6BIF2BKyNaN0ZQncyLrce5wtCcb2pdKlOThg+gX
+e5TOsDdTm6FWP1qlSfhzQKpTGMlkKruUMKjlS0uDc7o1C5uVLyRL6alYDK/9Ksuwmkb9icLHRXXk
+on5ypchyUYm5rNVclnMuCz6fFoSuFY0uKktPS0/XylNXSlhPKlyPamC+4kmd7KKS9qTcdhTpntbk
+nlbtLkt7T+t/FxXCq2XEp7XGi2rklULOZbXnoh50tWjUjd4ydRvaEfFrGUqOrNLEXg6KsIO/Ey1g
+2jUAak3mmUH75fOk6E2EAGhEZ0x42Oco/iWpAUv3RUk0sLluYBI7zZKfZjstDgZeiA7oY1eHFcIY
+elxmyMfUNSo88JtO4i0CxmTbJogHmYZbsqRBkjPrPnd0b3bgQSsKFgzDhk4b+9T9mK5A9dhNPHMC
+DhtqB+sgh1RgqVF3sg6baD93AvJBybdFMiJsPPuZOV6GVWBkVWBNWrUuFmV6nYASve41iWkIbeVe
+5+XSFTJg7AgaSSUweeuZ6L7qiqdyqnr7Xd+ff9d72jiwZtFwbucID/7C71Mq/+6Psts750Zb6Nmm
+yNy/+IcvKq3FkUzNQUIuU/MccTD+GuQH5Tfi0IQ31qZhvSh13ib32kAmfEAs7slrX/MawwEZv7OC
+I2KfYbuTGg8oENqXotjMDN5NnRkR0VfAB1SmqKtAaiF1BKoocBfHqqJEwuP2aIHrCp6NeZX4HrfM
+C9Iw1rBU5s15j+EO1o6AdZraOK8xuvKBPOinzQ1NW4TjjXKUfNrstsqb6UBjg6J3+DeCKGZwh9Br
+0XOIxWr9rIHAjHoHk5Tg06NUkZiPD8bFyjtJ8wGeSdINvRPT4xWS+NaAWnDDpJYWiY2YFAPcM7Nw
+u3mkfNzBYHg/3B0/q1QKhKDqRyF6YzS+WC0JtiQ5bVazceSNLOeWB7iYGIIlBNEt7zZaE4sN9cQK
+WR4iNZkQCYW5anUtLhodIa2CZ2PorQKJZZQ0bLaBAvYnL+iiowbO2l6lij5xPfQP/GkmfcBAMCat
+EU4KH9B9jL6vSVKyFUgj27b5AJ9whYjmroeSwfY2oadsS3TPFLk4BOTZ2HaZ+0ENMJpS2lGDgEWD
+f6uCU0+o9JYlGAgTmS24gkD5qdTJqTaCv1Wyz8NpzoFtmyQbLREsHtpJwaYgxTGmVa56v2egsSoy
+Ck4WKrhsJKmlU1kb1W5Ft6oY5ybC7HoBvVrok8peM2VSCePTomETHkQ6gCG1zSd2uWItDnCX80pY
+9fRtDlY42xoqqLzQUXiV2CN0a52e29qwgDSqob25WxoPIWxjugtiugIXsrIm4LAj2BbmN7qb1KD0
+0XhpRS4QViaoXfTeGvO+8G3PllU12FN7P1tVZQdqSJhImQzhB3ttFpp6sIKCA6rdBiWou1MTZSML
+ZvnYdWqobZp/pdr2tb328Hvrvuk1ig0qhMfJTSn+JHiBViJHixQfiEAB5XCXirOOASBnrDJSxKcI
+QQCNqsVaaWkFsV/0j0TGQueSiBr3x9sXJMGbPmaDMTSWYIxafG70GmJ25nZeyG5P9GmChWqaFY+c
+yUSNkCwUeHXJoFTgj7tgvuxqvX3wt8c30FjRyZF8hyADCx0QJRUIALRKcvS6EJLk9UvZCUCIkjHL
+nSBkMcP5qmCpx3otax9JvrDqlEoZKBY8ZdlSjpksYI7wkEZ7/w6JIy8EJsxp8JL8RZKHLM5kji1z
+mRCbSNkCRu516exvlJq4dFhCeEEF3CwuYTvaUrZIjlgMYkRGSRPhqm7YeoCM/YP03g+LRcS6GKIG
+aRrnQ7fKkvIoTgVqF9H+yjqMzbfgyqXxwRnEqccBAD9e8vHJyAmxvrsTfYNV0HhNDkDhedPvmDOp
+5gx4AVgz5iw9A3YYyMgg8iqDqLHDAgc7T5fitRtCgGqCc6JYL91fE6c3IGqIUNf/kJAVSE7gueDE
+DhCzZz8VA6YoyeMIUDpCVE9UgloHrSP+qpiWq3Irsx5Y5MhPCQvIFXWtk2kWCIDQaKWkDrwHEF3y
+7ctnJTCgM4ShEgjwVHWi8VYoG3A0cWqH4jekWk2WUxr2OC5U7MlDpb8Ag7S/1qhVQXMFs2lUXbAp
+HIm0tlDWIeNK0R9Ptw0ONzR9uHXAv1O1S/VDIg6J0jSb13NHyeCynpV4t9hASYP22glE/Wx4BC3x
+v22F/7YIQvLcLBfmyBDUa/0jZxEdCqmJlWFO00Z0ea300I0/e9oiS2oJVQmoJBOun6UNrkXjndP+
+rXjAbLR2owwSRT/BYiOM0wThB7PYoI3v3J3cS50dollZt24dV/6aoMOahicW4sypQw9LCOiovZ+N
+qiSbGO6nr+kzU5NI1SiL1m36v+yXhLzmJnDeyf6J2AdYavvLXVyi6IMarT9vH/K6MlAHHfA3HxBM
+SjW6WC5M7rfSQAtz355MWIieEsEC93SwJesOoMQ1vUyjiSbRfXUCa3qHrSciHjXQumiXBHDghUYt
+HzqcYqMZvOafYx0P2fYoDV0mDqONfvFzp1xOlynIcMHQaMdCZP/BXL7UwAnPIW752l6bSFtuH8FR
+IVwOVYlWm44g2yqP4oKCE4Dl1up9nG8T8ig2LFTdHIlTgnKYvu1BoQiYBam2rQrhH5So2cogkSYn
+FRc6kT370dosKhMmFs1lzRYNXeYMOpCLmCLFEuZuCKiAbkW04E/HL3rHbFhtM9GBk83rY/uqYuAG
+xpyVJOy3qpJHj/qAmcNP+mtWFyNAkFqz2p1sTupHZEmgSoVJZHg32qS+Bvk+WpiRZ1dcrz5NpMgk
+VqLG0096YcpPu8LrBwt9yHDh66Bq9/WVCOnrF42/8PWkQNSPxhAo5OK1r+21QZBPjb7oTEuG4kXx
+VsmNEiHDZXTr8usP0UACxKGkBBPgfjPyF3BSgZJURZ7QiLx1xDQbhNKqzjkEzCIydW8kgwyUaow6
+94fUFcWprhqp7dcQTaeJQ5hG1HLq0Nor+G3Rbvd0j6ghbF3n41fWV/V/u6VedP2W+5nVBBs5wjgj
+JiiHJFumTDir9aB0vyx4nAztRaNFD8sFTT/XMBYyggloBNVPJCJH9CVNoHIUfdfJNr3NUSke8S7N
+BJCctvWjPriiBEAhbNKpiTP8nWVOAVpQGFSN5lF3DBUKFEiX/ZJLcAtFOCGeZn9hjqwTVxPoWpVd
+nCUamIAXGpYXoYNJ+nnIfLPpE7OteWAy04qitu2ogPfBu7V9rLvmbRymt8kLdpRN/JQZSPAQNomG
+bOyAp+eocE/8819f38MvZzWjWhoG6hAbWEaDXAkBEQe7D4ITlg0L8scwfajkfJnrSgbnQ1NOI8XS
+9QE/+a2ms3U47VP2zG2AH4iK8lVQZgmMDTnZkfBRf0XVXAF8IF8lsa2KYSe5ED8rol7H0rAAjY9b
+rHkrJRQIaEzghjI5A3KMRaE5244F2DqtFNKvAQ03v0HfYznf9anFB72cRTJXMIMNRwHn0faM9uE2
+gegkKcuGhAraaBNZprW3OYfgIZ3JVLPhmaSoMpNteDhmi9WqZ7DTBZSNqC+HlVuKMYhCjyMPlW3q
+gOsoiv2LpyTM3fIplmFw4I5gxS/mP5JJgKlqMbkM5r07OLCu+4D8ID9Lh55ql9We+n4Y1Vo33ftc
+gLhAzFHhIClxG2JFteiRrKsh9d7Jnkir1mPv1T5J1oCpLqHTFErqoTfSVwRHh2UoStKgGqMomKNF
+pyzJxsyu2mAxcZRiKf/AAfEnFErSDZv7XawI0C3hpiYJPoK+fFresEtqSRlOSjH5kkljROHa8ojU
+MFS78Zk4ljDLmJKpRdgHg2WWPtGQlkPmnhFxd+4FippF/kFlzmVEkFgoJe0MmCYshkm6PlRFpK7R
+k/2yJON4RMAZVdmEK8meUbQigYdZHaAjsWc26tJO6CnuoSPLWC/pOIC1MQ9723CUFCsnCIVJ0gn1
+bNbj4a9wldaqLP6+ErPkAKEChMxYhhYff8iwHRYAOss0qe3+SDMDGDWR0doO1qoHAFeTdhMVrw57
+Y7UH140OBEc0bQOKGT+6rCV6d93cebH0tTsHuNirWDF9BZHxCnGHKDA1HKlZerOKAaMzBWCgaiOa
+J08I+K0jd2jqykp02fKVATFse6i3YXrYjiTkjUa28blpkyDVbcaavLiWNZ4avJbVaYI+9ckvWqbi
+/FWa3UxR7Ad7Cd+hdieT8M6hqM+zPPP6uaQhI/L24HTkCYUQ6vazG4hGSn3rKc5uG0/T6wbF0Uv5
+eOVr/RFoH+ilMoY6m1FCie7LAoMw7HzQ3bBYQsQAVFC4fxNvaEWhvJ7RdLoyoVPdj0avCkUgV+uD
+BRNUlr+AGpi9LV+gfrEdZsQJ4AuahagDFMlUT0CInq91aqqxAn0VTsxekiIbnTXmpxmBjp7xBHGM
+EsoxMG3D8pL3spcy5Yyv9VIWa3e0Kgbj1ZxWU6gebSylKQoVrQ4OqSHpM0GU05PjKqiFkdQNioZh
+Pq5gjGpln6piX9wHpNg/gg6ajIxXU+VsH3hyt4Pa2XIuM3h+Fyxkm9HArERNyerfM4pjAr/TUL2M
+7mQQoFyvTwfncm+KMWzNbMUxWsfRtkdBd1XJQk2+Xz7ZuS8aBymybZx3Oj9+sM3WmmC8Ail/rZdW
+lm6nYrEtqr52dk2ZOaysSPDgVaY5bTYBSs6WLXbXzG6WVFvUC5RRNimDAtNg2u0lWD1PES+42WgM
+mBOVyuJ9LIuYxeBFkTavW6aY2nG2IFuI5FHuBWBHmeGj7m7FaUKtNc2U1LAgf4bCYQLvNbqHlA2t
+xksguslz1hXNYh2n7OH6kzv44SWfDked5OaaBaE/6KWkl+gAJVNbyYY+idWQNAIhE1QNbbFPXpHN
+MtJBUwZYAsTitZuoENALnD2iT4SoYn+wihbN2tEtdsN3U0tINjuvw5iwrwl2IBWSjyJclu0R6OQN
+YAzWNiFQUjM0GbCCsPujGA8HSvcScIwKiDSW5Pzx4pe1LCw2O4N4KDQcKbPpLhRXnqI4C3i/W2bC
+Ad1tlwHlaaoqBPny6hnoLvbAAGJNwVjtSjTeEix8SFnjmllVhGJjL6LkzNFYOy2X5aVkQc1Iwllr
+A0bPGGAeIDwjT7L721BFonY5TAKGyXN1xQ1Swngrhahh4xUscCEoai50Blrw0IpwJWkoa4Jf0Icy
+11tNrkOyAEOGDX374CXaYVFgQ3PeiPBAhJC8vkF72GILBn79Jc0e9SOXlu42PK5qwybjoP8ouk6F
+PLF4+E+zsSiU0PgCdNQ06cGsTkPYSikuKLxNiIWW5o34bIUXYfNtHiH0IIdDYxQhAmaQ6KrQ5c5m
+pkqXW9G4A6g1v9+ZrQaWlWSU+58M7Cqt60YRWi0mtVNZ4XrA9A2iEMMKEjjGmekV1w==
+ ]]>
+ <![CDATA[
+ araekAfc6zoJyOg89CruF6keUd8gHXpq3C8a7sDowIwXHYgsx6HzpBWbtZhq5Es/uXiQT7qtCv86
+vGDc5skx+SIeVDN+GEzVs9a8ikQj2IRIPhZVPgQ3GpKW1eZWAHM/hFXUsYgMyD09QfIdAtjYfZxe
+fR9V6OR6EBgj66rqjVGdnWLErR6Mq7a7KypTxT2KqNRku7IpoYJNpZa0Kemp8zEFH/DAGHhsHYZf
+YK8Eg4oLvW3YLggNdspDrzFLDkdtH3UR07SMVE2uJJ9EyRnStKTP7OGslWGbHeNyUUlCTVrAJKbh
+1DTBlTwH4GfiIGhFgeHxc7O9ZXqqWiJJxeQhID8zI4dtaYiwWxNfbWIrXvI5UNEjnYJp04gNFZRQ
+QRVaj3KY6uA2HUafTV0wisJV/ZJkEF7VlgQk2fAO9Z2EOGtyTgq2KP8QmeKsSJZpTnidjG8hApAr
+NMAJ85I4Ke3KbmTosDBV7+Fbcxh3oiyxuB5KNrxgTB5kJYkHqohpjT3acSBB6XVAMR1dLTbLg2ZV
+p6ONRAW5qKykU9YgVgdSOqJhzChYw1IwBu9Pgiuimo6oIjhIxDIMFrBuNBVqijWqcRVaQcsjF49o
+qQVxJuGSH/9WVXyMuqI3a1WBoREYDGZWAPzTWckq7uTqXc9k0NPMFAv1d1Iwi+nEDsnNpm3AGW0I
+VVpKQxHeyl/73XYWghFajqfTRv0LMz/cdZfitQVt7BsjtOHApUmG05enOBb0boUQKZ4woGE9+lLZ
+d14JZYItGHKFrhTBOUbYwDkNF1OJ/HGFEqpJqiFsGXk2EK5gtO6Oq4m5i/BaVARWU4zFOmhYNHuR
+iE97F6LcbhEigIMnnvRFvfQb6uwNdfbxDXX2hjp7Q529KursDWH2hjD7+IYwe0OYvSHM3hBmbwiz
+N4TZG8LsDWH2hjB7Q5i9NsLsDU72Bid7g5O9wcne4GRvcLI3ONkbnOwNTvYGJ3uDk73Byd7gZG9w
+sjc42Ruc7A1O9gYne4OTvcHJvFDfvDOOUygmpMVrKoLSxlOlnHLGzMbQq4ZeX1udMgPOh7zwo+Fw
+KHwB5lDlund75IKEUO2l7qW+TnVyfAAhsRi0xKrrAEDIPLBaRRvR6hbc52q0nbymRJaEtqmGgIBJ
+FdXkgKIcMIry22i2/9FgLioUARuIRAsS3gwOz3AgmeQ7ab01xyMl6wjrsruBrAwbwxHfBbKiOcAl
+bYjVsP3NXoTPT9C3YOCfhPaiwFzqgJnN6H2yOWbBArgAzn619jgduqF9TJh0GFLo435KSQFbEu9x
+G+ZPifGEn5tWCI3deqYfDME0INRer42mYK0KYjbgLs+6deYMCSYsQQTsYwiCYMUbnr7QV7BRN8fP
+SVULis5ujxYiWBoXVOZU11cEimFno2e+2Hkfn5FfqckEosgixAXOEbLsrpC7og8lAkOXMeR4FV97
+EH5P0UR2CkkSfNRq4JctznIdQD9wjKmLSYWBUwivgNKCqa8UiqfwQ9+vDVHsCi7Wpha9NM35T8/T
+SeThrhZTaZdBtRNv6yzy7zjWEKlLomG+XMb2zdZzPdiXz31adjzUj9JSm6dFzsIyFwQ6/2TqyduP
+7FXVWm5uuedlCp8Sk/3gEDH8CGX2HsudtYDt50acWLorAEqzLm6ImNUDkoI4ms0VxAG1N4JKWtSZ
+KJeTxtNYuuxKigT+woOXna8Ew4UIDdYtnOxtQ7TUhFVhsKu3qS5Xn1YZTIb0kqcSuCkcwC5T9cBb
+ZsEQsgO9DBLBedotmV7R8di4LnEv02BqAlusKMxBZSudL8KIqJyQvZTy0REhwajjVxA3BclYkY6R
+FVuCvLnv46NQJLoeM/qxODmS2GCYuvUPUyAd/Ta/UccD2qoYEFDdE7BEtZq/Ugs2qnubRFasmPKj
+o61CVzisqIMXUrUOxeyCetlZEIbhirIRKBPFdf3Rag46CQscDRpGCY+Qt3ZfxYNSJTwK0mURa3Ka
+Z36W4wcf0caBGFK6SahP2izEkA6m8c66srQYyWKUJswDMrRhRFkbIjgXM0kql4fOJSkzyIKNraXE
+G+wSVq5jkCE7L4LBs4QhEkrKe19ck2HVk0XmAi5n62SCY+jCqVQhLPGxpMFaVL0COi024gVtOqJJ
+KtO8oMohh5c/I9JdauSkLEJZUzWcBolbNmtQST3iZECybVL2S0CYk0E1o8B2sFonQ6FE4kdpaPpt
+L8NEVsigkio2A1RG035o8gHdAB0QVW9YpojC47AONcis9acNrjzeCT/CC0J3co7naOf0+tMIXKoA
+o5Y5gJIqVDJYVirkyZqb5DQ8PlbVbFhJOKQb9x8pY2+Fh8yOBQCuKG3ZagiO3q92w8HNqq+zjIKk
+QXI8apU98X8nTvcCSPCxq0WSdbbPO90lrqFSiMjiiawENiXiJwpJ9rGotlJc89NdUiAsWL6n2czE
+xVpic7ufkojJQEKP051QktO9iSX85tsep7tYoS0kbFfWVe+bZVcLeX/+47JhRUsNA7ggVm8H/Oft
+uucPeHJ6ekXgrPPYACcdWcUPHBAko1qt32RIwMtSeBIgofeNS1JJa72WGjcnVCt6g2uQjYdiHPAk
+y9VTJ9RwOJ7wkqk6MAnrV9ImmEswfRUqNcmR48HOaPQGBBNdf7moiJANAMGHURjK0YEs8gcD9Apd
+Q68OhAaXJThn3gMNXDhaLIDFs9Vcea3QMwO/kaP9EjFs1kEf757ewBMOotPJ/vRRdSQKPsdBZMl6
+d9RA0Oaikj8JBZbRJDs6NQBTBV9I2z/EZP2fZXDJe7RPl6YqqYOxvMMQQHse3oHy3D3wDooON99y
++4b1TshRJ8MbXi6rVutHZhOY3/vTn3TSREtSYFGf980vfN5me9YvPGX4+kFgKvWZTOncwFPqS0X7
+VbBRwSL8Ma3oO7pgJBT/EyuaD3xUi7aQqldzAPzAXqD+DqpINBGjhTb8GNe5AVSKk6sE06r6KGyU
+wnaq7evWj2FYU36sEtsWZqwoTDlwTjTJqUMhYkbkHtUqVZF5+DQYVazosKJpIHhqeiuy6C7pqkkQ
+YDSgG7K5MBeeAJuk1qbPQXS6aVHQBIXJQIg0rxKOW9Vp53PlwfIifqaPrlL6Mhz9e9IDGcnEa3tX
+LMi5CN4BpAl1XElAdYFCQJdSyWZA74OACMEHlVYgLWybek0UVsGIPXnmN11ZtOLDp2llpDl93pXR
+9aGQQRCByoQK34Uib65A2ufkIicCYxMFJvdkoVp4sPxDAGo54uXSVAFRclD02RyUvH1ZGdXqGJGa
+wc133c6s0hW/b4Dr2rUPS5dg7VcESBERfn/+w65dpb4Z+hwCNL25s8/bcM+6M7BBZlyCFRlmKTfL
+sClSU14KyYek1m9MEG9dlQcfVpkMuk4rPXCkzXXeJ6udVySjBhLQFl40R59OG6tT72iFMoO2sWWh
+UtoBO8Q2onI4bcSDNyldXbAwlm+Z2YRrqOkPQSQSo6CpWhX2gyAl6l3wG2C/1s8q7ScfbwIrLXRi
+s5FTA19p2APAYk8CTqn8OyyrenKvbnoBnkDpnzwUGinkfZ/lBaK7AQnj0tIEPJkBUhB2MVk1kKds
+dhQ8+IE6VJKcIVsyc7E2Vdo4wl3iBwINywc/gCqo/EDrJ972wREgLiNHoBjkYh1aTjSFmQbfaprn
+Pu4ARYfUE5PK9Zyo9P/vPMFzm+55T+AaU9JmtunZ6SA8hmQGBrBiVcYLduKyTEilHAaDmmlYgVck
+EBHkQCPjzK2uoKAE68k9fZubVkQvoj65oOrzxJ+RF1Tk8sgLxlReQLWVdiPlGw1ZcdRzQjUDLG4z
+Gua81r5cf1HAk4u1y4yQbFx3vc/ucmRuRivPKzpOl5Wh33Xzbbe6YqQ1THIwUyvX1jWDuJRhkOX3
+5z8uwaWp09JfTW8H6mfvumftCPhSqGqWa6z+ByGHksYaNHUJbkj5xrTWOUAhV99Wic2RQNwPZi0E
+PmtH1VuxdyP6GpKkC9WK+7RwaRRlHxHuTtpB85zZYbBCakK3o5iNMVDvy9ZO5Y8CayjBUgLhj6IA
+eZGBDT5XsggfhA8AHEgeTNU6rUgbMBd1DXKKbsNCgLfAd+yZrFJ8zmTSKlZqMYSx8iETCrNdIAB1
+6DUJ0m30IdssieoakpYVvCGY6DVNhOnZTbNWhKmIA2wxILPm8D/oI6VI9aUYWqUMkwJUqZlJqCfP
+70SwX3J92kMK8bOCfWrjFBbbtOTmXrLvQciLQvNnMAwKCKyYgZt7ygQ5aFb3QcWjI07+dOXKiQA1
+gPyfZGZlPhzygwEVKhdiY7j5pvuMH00hCaNU/doyoy5hcwAqen/6o4I45HHfW4zw5pk+d7s9X9EM
+lrqBuAFr9YOjeAysMhlZijaAS0mvG5hKwzX0DX22iRaPkLJg4Hq0oXWD5WqiCFxEkS+T8LmBcjRz
+iL1Fi9jlRhktSxbkS1kWmy7hQOUI12g5RjJ4n82z2YiB0BPO42CYHMHpJC+a1edTfyU760cOju4E
+6GQulnKB8EYAQGkWrTdhvBOfxBUAkSs29qWxGZbw/kFOTGlJtHlgfl5+W7ObGq8XWNxWAPQtKoGq
+ZXqPYi5gPz4omtaNEYE5j34bdtmQkDS4k4pB95Dh1GTICond4pgpxzIX010UXIB/m/UPEhhd+0QN
+YO4/gTr3shvjjCadP/DxosZSVPjleHmXNFcj3oC44r4n4DFOAE3tCraqQerhSEv6coR5TzfZCe+Z
+oWF5vJ3p2tbP856RzYb3XAdplBBxbz7+L+x9M1IR5uZI7Nx7MrtHJXWIuedy2QqTnB2ljylgYTpc
+Z6cje68Z2HriHbfr7LhfXGcLoV1Zlq0Ej64xD+/9yQ9arfNt0Kv05jc/c6O9jMzo6V/8mqfyl39d
+v/2rH3/z9Xf/+v3v7u/1Qv72/ff/8E8/fvjdb//59z//2R9+//3vfrP+0t3/wb/8+Fte/pvvfvc/
+fn/3P3787R9/vPvxt/9y9//waf+S//vmj9I5Rer07u/5v//Tbox0Tu+++Vd++g/ru/8O0PTuj3fl
+7m/u/st/DXe/+fn6179XqYHHNl0QHL/DD1///Gf/SRkJarwreP3h+CFN/8dff6q0qj8E/GH/Hb5/
+9GdS7Mdf8Qmvyz9CE8f/RgLRfPwJTin/C/r2uT+wr4a/8OhiWLevxb6/eimPv/9/7/7pv/kTWo/M
+n89XX/3dd//w/X/+3Xf/9D+//93Pf/YPv//uf31/992PP2I83//z+qe1A7///b/89nff3/3+H3/7
+R15h0bHgq6/+6m9/9fOf/X/OP/pG
+ ]]>
+</i:pgf>
+</svg>
diff --git a/share/gcstar/logos/about.png b/share/gcstar/logos/about.png
new file mode 100644
index 0000000..0810e23
--- /dev/null
+++ b/share/gcstar/logos/about.png
Binary files differ
diff --git a/share/gcstar/logos/bg_no.png b/share/gcstar/logos/bg_no.png
new file mode 100644
index 0000000..dedab7b
--- /dev/null
+++ b/share/gcstar/logos/bg_no.png
Binary files differ
diff --git a/share/gcstar/logos/book_no.png b/share/gcstar/logos/book_no.png
new file mode 100644
index 0000000..1214dc4
--- /dev/null
+++ b/share/gcstar/logos/book_no.png
Binary files differ
diff --git a/share/gcstar/logos/button.png b/share/gcstar/logos/button.png
new file mode 100644
index 0000000..75b22e4
--- /dev/null
+++ b/share/gcstar/logos/button.png
Binary files differ
diff --git a/share/gcstar/logos/cd_no.png b/share/gcstar/logos/cd_no.png
new file mode 100644
index 0000000..9ec486f
--- /dev/null
+++ b/share/gcstar/logos/cd_no.png
Binary files differ
diff --git a/share/gcstar/logos/film_no.png b/share/gcstar/logos/film_no.png
new file mode 100644
index 0000000..7c99a68
--- /dev/null
+++ b/share/gcstar/logos/film_no.png
Binary files differ
diff --git a/share/gcstar/logos/find.png b/share/gcstar/logos/find.png
new file mode 100644
index 0000000..ecfabc0
--- /dev/null
+++ b/share/gcstar/logos/find.png
Binary files differ
diff --git a/share/gcstar/logos/install.png b/share/gcstar/logos/install.png
new file mode 100644
index 0000000..64d019b
--- /dev/null
+++ b/share/gcstar/logos/install.png
Binary files differ
diff --git a/share/gcstar/logos/no.png b/share/gcstar/logos/no.png
new file mode 100644
index 0000000..7d3ba0a
--- /dev/null
+++ b/share/gcstar/logos/no.png
Binary files differ
diff --git a/share/gcstar/logos/no_minicars.png b/share/gcstar/logos/no_minicars.png
new file mode 100644
index 0000000..281d7f6
--- /dev/null
+++ b/share/gcstar/logos/no_minicars.png
Binary files differ
diff --git a/share/gcstar/logos/no_smartcards.png b/share/gcstar/logos/no_smartcards.png
new file mode 100644
index 0000000..e9e0aea
--- /dev/null
+++ b/share/gcstar/logos/no_smartcards.png
Binary files differ
diff --git a/share/gcstar/logos/no_stamp.png b/share/gcstar/logos/no_stamp.png
new file mode 100644
index 0000000..3abc5e8
--- /dev/null
+++ b/share/gcstar/logos/no_stamp.png
Binary files differ
diff --git a/share/gcstar/logos/periscope_main_logo.svg b/share/gcstar/logos/periscope_main_logo.svg
new file mode 100644
index 0000000..2492e09
--- /dev/null
+++ b/share/gcstar/logos/periscope_main_logo.svg
@@ -0,0 +1,1230 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
+ <!ENTITY ns_svg "http://www.w3.org/2000/svg">
+ <!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg version="1.0" id="Calque_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="401" height="401" viewBox="0 0 401 401"
+ overflow="visible" enable-background="new 0 0 401 401" xml:space="preserve">
+<g id="Calque_6">
+ <rect x="0.5" y="0.5" fill="none" stroke="#FFFFFF" width="400" height="400"/>
+</g>
+<g id="Calque_6_-_copie">
+ <rect x="0.5" y="0.5" fill="#FFFFFF" width="400" height="400"/>
+</g>
+<g id="Calque_10">
+
+ <linearGradient id="XMLID_37_" gradientUnits="userSpaceOnUse" x1="174.3203" y1="444.0762" x2="-0.8899" y2="465.6604" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0056" style="stop-color:#FFFFFF"/>
+ <stop offset="0.3072" style="stop-color:#ECF2F9"/>
+ <stop offset="0.9175" style="stop-color:#BAD2EA"/>
+ <stop offset="1" style="stop-color:#B3CDE8"/>
+ </linearGradient>
+ <path fill="url(#XMLID_37_)" d="M132.352,262.551c-0.012,2.467-21.149,4.367-47.21,4.246c-26.062-0.12-47.18-2.217-47.168-4.684
+ c0.011-2.465,21.148-4.367,47.209-4.246C111.244,257.986,132.363,260.085,132.352,262.551z"/>
+ <g>
+
+ <linearGradient id="XMLID_38_" gradientUnits="userSpaceOnUse" x1="83.4087" y1="405.668" x2="91.9835" y2="414.5602" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_38_)" d="M97.31,231.516c3.604,1.102,7.562,0.705,10.878-1.084c1.634-0.882,3.253-2.057,4.146-3.707
+ c1.082-2,1.968-4.107,2.656-6.276c-4.837,1.114-9.997,0.686-14.668-0.941c-4.639-1.614-9.51-4.573-11.822-9.071
+ c-0.322,0.945-1.533,4.672-1.948,5.563c-0.792,1.715-2.018,3.183-3.527,4.313c-1.61,1.174-3.476,1.944-5.383,2.49
+ c-1.626,0.467-3.427,0.788-4.47,2.266c-0.958,1.358-0.908,3.221,0.186,4.492c1.237,1.44,3.214,1.707,4.987,1.347
+ c2.089-0.425,4.162-1.132,6.109-1.991c1.71-0.759,3.544-1.533,4.893-2.87c1.017,1.453,2.31,2.705,3.792,3.679
+ c0.738,0.485,1.522,0.903,2.341,1.239C95.935,231.146,97.335,231.521,97.31,231.516"/>
+
+ <linearGradient id="XMLID_39_" gradientUnits="userSpaceOnUse" x1="116.2788" y1="323.1982" x2="123.2704" y2="352.1169" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0056" style="stop-color:#FFF7FF"/>
+ <stop offset="0.1382" style="stop-color:#CEDFFB"/>
+ <stop offset="0.3023" style="stop-color:#98C4F7"/>
+ <stop offset="0.4629" style="stop-color:#6CAEF4"/>
+ <stop offset="0.6163" style="stop-color:#499CF1"/>
+ <stop offset="0.7607" style="stop-color:#3090F0"/>
+ <stop offset="0.8924" style="stop-color:#2189EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_39_)" d="M174.477,149.37c-1.717-7.284-6.05-13.56-11.993-16.68c-3.141-1.649-6.73-2.419-10.62-1.987
+ c-0.358,0.04-0.718,0.091-1.08,0.153c-0.241,0.04-0.482,0.089-0.726,0.138c-0.106,0.023-0.212,0.042-0.323,0.065
+ c-0.308,0.069-0.622,0.148-0.937,0.23c-0.029,0.009-0.06,0.016-0.092,0.025c-0.339,0.091-0.682,0.191-1.029,0.304
+ c-1.883,0.602-3.819,1.474-5.792,2.667c-5.371,3.239-9.584,7.517-12.671,12.32c-0.152,0.237-0.292,0.48-0.44,0.719
+ c1.439-3.938,3.37-6.728,4.87-8.318c2.659-2.815,6.604-6.074,11.241-7.926c-0.966-0.153-1.872-0.265-2.698-0.336
+ c-16.258-1.986-29.712,4.876-36.667,25.514c-1.066,3.163-4.573,14.902-8.382,27.367c-6.451,0.293-15.039,1.458-19.114,5.358
+ c-0.838,0.677-1.398,1.678-1.466,2.819c-0.13,2.19,1.591,4.072,3.839,4.202c1.247,0.072,2.391-0.408,3.188-1.223l0.008,0.009
+ c1.325-1.434,5.844-2.444,11.01-2.919c-0.134,0.431-0.268,0.859-0.399,1.287c-0.441,1.39-0.881,2.781-1.317,4.173
+ c-0.603,1.913-1.202,3.826-1.813,5.737c-0.302,0.951-0.612,1.906-0.922,2.861c-0.085,2.672,1.576,5.438,4.706,7.807
+ c4.809,3.637,13.489,6.392,21.196,3.856c0.851-2.68,1.986-6.255,3.244-10.2l0.005,0.002c0.697-2.205,1.44-4.095,2.213-5.721
+ c1.443,1.313,2.871,2.75,4.133,4.143c0.805,1.016,1.03,1.549,1.744,2.242c1.937,1.873,4.544,2.156,6.218,0.459
+ c1.671-1.694,1.459-4.593-0.475-6.463c-0.093-0.093-0.189-0.174-0.286-0.253c-1.415-1.66-3.807-4.292-6.637-6.756
+ c3.407-2.961,6.873-2.732,9.403-1.859c0.031,0.018,0.059,0.039,0.089,0.055c6.104,3.575,13.035,3.278,19.316,0.277
+ c5.143-2.456,9.615-6.621,13.029-11.675c3.117-4.618,5.338-9.956,6.482-15.472C175.716,160.68,175.755,154.791,174.477,149.37z
+ M166.884,179.725c-6.431,9.186-17.595,14.081-26.032,7.7c-12.514-9.462-10.605-33.852,5.365-45.267
+ c11.919-8.522,22.916-1.749,26.048,9.716C174.663,160.647,172.356,171.909,166.884,179.725z"/>
+
+ <linearGradient id="XMLID_40_" gradientUnits="userSpaceOnUse" x1="83.479" y1="405.4453" x2="92.0916" y2="414.3767" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_40_)" d="M97.31,231.516c-0.782,0.461-1.606,0.91-2.524,1.332c-0.142,0.049-0.276,0.108-0.408,0.172
+ c-0.531,0.315-1.015,0.679-1.409,1.125c-0.443,0.567-0.74,1.264-0.818,2.035c-0.216,2.152,1.328,4.069,3.446,4.277
+ c0.693,0.07,1.36-0.053,1.954-0.321l0.012,0.024c4.804-2.143,8.223-4.848,10.657-7.501c1.381-1.556,2.579-3.251,3.618-5.048
+ C108.263,231.455,102.67,233.15,97.31,231.516z"/>
+
+ <linearGradient id="XMLID_41_" gradientUnits="userSpaceOnUse" x1="98.8281" y1="421.3633" x2="101.5017" y2="424.1357" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_41_)" d="M97.31,231.516c-0.782,0.461-1.606,0.91-2.524,1.332c-0.142,0.049-0.276,0.108-0.408,0.172
+ c-0.531,0.315-1.015,0.679-1.409,1.125c-0.443,0.567-0.74,1.264-0.818,2.035c-0.216,2.152,1.328,4.069,3.446,4.277
+ c0.693,0.07,1.36-0.053,1.954-0.321l0.012,0.024c4.804-2.143,8.223-4.848,10.657-7.501c1.381-1.556,2.579-3.251,3.618-5.048
+ C108.263,231.455,102.67,233.15,97.31,231.516z"/>
+
+ <linearGradient id="XMLID_42_" gradientUnits="userSpaceOnUse" x1="87.1963" y1="372.2148" x2="91.0126" y2="381.7556" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_42_)" d="M80.141,195.28c1.184,0.06,2.269-0.404,3.019-1.182l0.008,0.008
+ c1.96-2.155,11.404-3.377,18.993-3.167l0.376,0.009c0.003,0,0.374-0.063,0.374-0.063s2.003-1.696,1.504-4.474
+ c-0.498-2.778-2.039-3.085-2.039-3.085c-4.412-0.126-18.979-0.093-24.539,5.303c-0.792,0.65-1.317,1.603-1.372,2.689
+ C76.358,193.399,78.005,195.174,80.141,195.28z"/>
+
+ <linearGradient id="XMLID_43_" gradientUnits="userSpaceOnUse" x1="128.3442" y1="407.792" x2="128.9795" y2="390.3197" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.1178" style="stop-color:#ECF5FE"/>
+ <stop offset="0.3575" style="stop-color:#BADAFA"/>
+ <stop offset="0.6939" style="stop-color:#6AB0F4"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_43_)" d="M133.314,202.32c-0.088-0.092-0.181-0.176-0.277-0.258c-1.758-2.146-5.083-5.917-8.93-8.921
+ c-0.853,2.684-1.741,5.481-2.617,8.238c1.43,1.348,2.844,2.824,4.087,4.251c0.774,1.021,0.981,1.546,1.683,2.251
+ c1.89,1.902,4.528,2.299,6.29,0.729C135.31,207.039,135.207,204.223,133.314,202.32z"/>
+ </g>
+</g>
+<g id="Calque_7">
+ <path fill="#1C86EE" d="M361.816,214.289c-0.555-1.294-2.082-1.932-3.096-2.354l0,0c-5.414-2.272-11.367-2.057-16.336,0.598
+ c-2.316,1.24-3.932,2.813-4.8,4.672c-1.2,2.574-0.581,4.955,1.743,6.704c1.91,1.438,4.195,2.097,6.374,2.647
+ c2.919,0.735,4.481,1.904,4.78,3.57c0.361,2.002-2.281,4.146-4.189,4.688c-2.339,0.664-4.615,0.223-6.09-1.183
+ c-0.199-0.188-0.395-0.396-0.602-0.61c-0.67-0.705-1.428-1.504-2.463-1.832c-1.443-0.455-3.016,0.175-3.934,0.996
+ c-0.787,0.709-1.146,1.584-1.038,2.529c0.172,1.501,1.493,2.859,2.728,3.541c3.717,2.053,8.928,2.201,15.481,0.445
+ c4.157-1.109,8.888-4.43,9.446-9.092c0.617-5.114-4.359-6.334-7.994-7.226c-0.51-0.125-0.989-0.241-1.441-0.364
+ c-1.289-0.351-3.558-1.146-4.242-2.533c-0.27-0.545-0.267-1.135,0.008-1.801c0.908-2.207,4.115-3.142,6.271-2.468
+ c0.797,0.246,1.54,0.813,2.328,1.411c1.514,1.146,3.229,2.45,5.416,1.154C361.386,217.07,362.376,215.602,361.816,214.289z"/>
+ <path fill="#1C86EE" d="M332.934,221.484c0.896-2.74,2.396-7.33-0.688-9.549l-0.293,0.404l0.292-0.406
+ c-2.327-1.668-5.641-1.58-7.93-1.369c-1.478,0.137-2.885,0.425-4.181,0.855c-0.001,0-0.288,0.098-0.288,0.098
+ c-1.332,0.447-2.592,0.873-3.971,0.851c-0.729-0.013-1.404-0.339-2.121-0.685c-0.337-0.164-0.686-0.332-1.045-0.468
+ c-1.458-0.559-2.98-0.896-4.527-1.004c-1.535-0.104-2.969,0.009-4.255,0.34c-0.55,0.144-1.086,0.328-1.604,0.509
+ c-0.881,0.306-1.713,0.594-2.598,0.678c-0.951,0.092-1.959-0.059-3.021-0.219c-1.872-0.28-3.811-0.57-5.551,0.502
+ c-2.228,1.371-2.986,3.892-3.661,6.112c-0.134,0.443-0.261,0.863-0.397,1.275l-0.767,2.305l-2.312,6.94
+ c0.002-0.002-0.604,1.755-0.604,1.755c-0.521,1.479-1.061,3.012-1.432,4.563c-0.23,0.979-0.847,3.579,1.035,4.479
+ c2.139,1.021,4.373-0.661,5.642-2.783c0.559-0.936,0.891-1.959,1.213-2.949l0.146-0.441l1.545-4.631
+ c0.188-0.561,0.371-1.139,0.547-1.695c0.613-1.94,1.248-3.946,2.234-5.696c1.688-2.985,5.711-5.351,9.276-3.959
+ c1.584,0.617,2.38,2.265,2.024,4.192c-0.176,0.955-0.521,1.916-0.856,2.847c-0.136,0.373-0.272,0.76-0.401,1.144
+ c0.001-0.002-1.502,4.526-1.502,4.526c0,0.001-0.23,0.711-0.23,0.711c-0.359,1.11-0.731,2.261-1.067,3.401
+ c0,0.002-0.034,0.117-0.034,0.117c-0.371,1.269-0.88,3.004-0.1,4.386c0.343,0.604,0.896,0.998,1.598,1.144
+ c1.268,0.262,2.779-0.328,3.646-0.988c1.888-1.434,2.66-3.998,3.283-6.062l0.129-0.43c0.496-1.632,1.033-3.28,1.556-4.876
+ l1.135-3.526c0.685-2.166,1.706-4.584,4.11-6.094c1.539-0.97,4.096-1.724,6.229-0.66c2.33,1.158,1.846,3.854,1.063,6.341
+ c-0.785,2.495-1.678,5.323-2.629,8.047c-0.785,2.239-1.48,5.246-0.34,6.85c0.506,0.71,1.293,1.066,2.344,1.063
+ c3.262-0.006,4.781-4.176,5.512-6.18c0.945-2.602,1.793-5.282,2.611-7.877l1.217-3.813L332.934,221.484z"/>
+ <path fill="#1C86EE" d="M286.293,206.096L286.293,206.096c0.343-1.027,0.813-2.433,0.409-3.736
+ c-0.392-1.264-1.681-1.856-3.45-1.587c-2.132,0.322-3.745,1.887-4.794,4.649c-1.485,3.897-2.763,7.963-3.996,11.894l-1.819,5.703
+ l-3.004,9.133c-0.09,0.276-0.209,0.598-0.337,0.937c-0.638,1.703-1.513,4.034-0.442,5.642c0.371,0.563,0.947,0.918,1.664,1.028
+ c1.274,0.199,2.832-0.405,3.709-1.106c1.474-1.172,2.271-2.934,2.855-4.504c0.374-1.004,0.678-2.039,0.971-3.039l0.409-1.371
+ c0.527-1.696,1.107-3.418,1.669-5.077l0.793-2.359l3.387-10.229L286.293,206.096z"/>
+ <path fill="#1C86EE" d="M258.689,216.548c0.924-0.672,1.881-1.366,2.649-2.274l-0.382-0.322l0.382,0.32
+ c0.978-1.148,0.361-2.498-0.087-3.479c-0.063-0.142-0.125-0.272-0.182-0.399c-0.522-1.228-0.661-2.303-0.409-3.195
+ c0.325-1.149,1.299-1.73,2.325-2.346c1.063-0.636,2.158-1.289,2.646-2.604c0.362-0.98,0.055-1.628-0.268-1.999
+ c-1.17-1.345-4.295-1.155-5.301-0.934c-2.381,0.527-4.61,1.93-6.631,4.171c-0.748,0.832-1.404,1.769-2.043,2.675
+ c-0.918,1.31-1.869,2.659-3.078,3.655c-0.201,0.166-0.416,0.326-0.646,0.496c-0.773,0.576-1.65,1.229-2.086,2.213
+ c-0.551,1.244-0.035,2.42,0.421,3.457c0.104,0.24,0.203,0.466,0.287,0.687c0.716,1.88,0.542,3.286-0.027,5.222
+ c-0.452,1.531-0.969,3.077-1.466,4.572l-0.216,0.651c-0.284,0.86-0.604,1.731-0.911,2.573c-0.354,0.968-0.719,1.963-1.039,2.963
+ l-0.057,0.179c-0.538,1.664-1.537,4.758,0.082,6.278c0.506,0.478,1.168,0.713,1.912,0.684c1.404-0.057,2.912-1.035,3.721-1.923
+ c1.145-1.263,1.843-2.817,2.427-4.312c0.863-2.209,1.562-4.514,2.233-6.742c0.445-1.474,0.906-3,1.41-4.479
+ c0.498-1.459,0.994-2.76,2.037-3.891C257.064,217.729,257.854,217.154,258.689,216.548z"/>
+ <path fill="#1C86EE" d="M269.717,217.718c0.094-0.268,0.219-0.565,0.35-0.881c0.44-1.063,0.938-2.271,0.746-3.364l0,0
+ c-0.133-0.777-0.52-1.373-1.119-1.722c-1.143-0.663-2.629-0.241-3.217-0.026c-1.979,0.719-3.215,2.045-4.009,4.301l-1.608,4.451
+ l-1.578,4.369l-0.934,2.745c-0.517,1.538-1.05,3.132-1.638,4.666c0-0.001-0.12,0.308-0.12,0.308
+ c-0.57,1.472-1.279,3.301-0.947,4.998c0.183,0.931,0.75,1.604,1.604,1.892c1.36,0.464,3.166-0.138,4.124-0.981
+ c1.904-1.688,2.666-4.072,3.4-6.381c0.149-0.469,0.306-0.949,0.465-1.415l1.729-4.997l1.375-3.975L269.717,217.718z"/>
+ <path fill="#1C86EE" d="M268.672,205.604l-0.064-0.035c0.856,0.574,2.059,0.556,3.295-0.057c1.154-0.568,2.354-1.705,2.438-2.964
+ c0.032-0.51-0.109-1.237-0.979-1.815c-1.198-0.799-2.836-0.41-3.969,0.221c-1.322,0.735-2.154,1.851-2.121,2.844
+ C267.285,204.327,267.543,205.07,268.672,205.604z"/>
+ <path fill="#1C86EE" d="M243.664,206.609c-0.536-2.534-2.408-4.866-5.137-6.403v0.001c-4.123-2.324-9.782-2.643-15.936-0.9
+ c-4.531,1.287-8.775,3.886-12.271,7.52c-3.365,3.501-5.928,7.81-7.405,12.461c-1.983,6.237-1.365,11.944,1.692,15.657
+ c3.623,4.396,9.799,4.787,13.156,4.63c5.514-0.263,10.828-2.232,15.373-5.698c1.641-1.25,4.695-3.578,4.504-6.227
+ c-0.041-0.551-0.298-1.025-0.742-1.371c-0.721-0.559-1.801-0.672-2.556-0.537c-1.313,0.24-2.401,1.132-3.362,1.917l-0.479,0.389
+ c-2.046,1.613-4.272,3.252-7.017,4c-2.678,0.726-5.363,0.789-7.562,0.183c-6.377-1.769-4.817-9.795-4.188-12.211
+ c1.424-5.474,4.892-10.271,9.272-12.834c4.22-2.465,11.136-2.82,14.313,0.611c0.431,0.465,0.779,1.077,1.117,1.67
+ c0.867,1.523,1.852,3.25,4.373,2.498C243.193,211.252,244.232,209.3,243.664,206.609z"/>
+ <path fill="#1C86EE" d="M195.014,200.358c-4.125-2.321-9.783-2.64-15.929-0.898c-9.037,2.563-16.578,10.218-19.681,19.979
+ c-1.984,6.237-1.367,11.947,1.693,15.658c3.623,4.396,9.797,4.789,13.156,4.629c5.557-0.263,10.905-2.259,15.466-5.771
+ c3.394-2.608,8.061-6.667,9.378-11.749c0.597-2.301,0.181-4.008-1.17-4.807c-0.845-0.495-1.885-0.568-2.803-0.637
+ c-0.206-0.014-0.4-0.027-0.587-0.047c-1.673-0.16-3.056-0.195-4.354-0.107c-3.946,0.262-6.429,1.339-7.382,3.201
+ c-1.097,2.149,0.78,3.272,2.152,4.092c0.641,0.385,1.305,0.781,1.638,1.217c0.889,1.164-0.19,3.023-1.131,3.988
+ c-1.286,1.313-2.922,2.291-4.861,2.904c-1.461,0.463-6.507,1.797-10.067-0.443c-3.353-2.11-3.175-6.659-2.772-9.184
+ c0.628-3.934,2.165-7.484,4.44-10.269l-0.387-0.317l0.387,0.316c2.055-2.516,4.07-4.229,6.162-5.24
+ c2.318-1.122,5.071-1.568,7.962-1.29c1.945,0.188,4.565,0.861,5.996,2.998c0.229,0.341,0.421,0.705,0.626,1.092
+ c0.359,0.679,0.731,1.382,1.315,1.966c1.229,1.229,3.069,0.5,3.854,0.188c2.255-0.897,2.553-3.56,1.848-5.798
+ C199.248,203.77,197.491,201.755,195.014,200.358z"/>
+ <path fill="#1C86EE" d="M361.816,214.289c-0.555-1.294-2.082-1.932-3.096-2.354l0,0c-5.414-2.272-11.367-2.057-16.336,0.598
+ c-2.316,1.24-3.932,2.813-4.8,4.672c-1.2,2.574-0.581,4.955,1.743,6.704c1.91,1.438,4.195,2.097,6.374,2.647
+ c2.919,0.735,4.481,1.904,4.78,3.57c0.361,2.002-2.281,4.146-4.189,4.688c-2.339,0.664-4.615,0.223-6.09-1.183
+ c-0.199-0.188-0.395-0.396-0.602-0.61c-0.67-0.705-1.428-1.504-2.463-1.832c-1.443-0.455-3.016,0.175-3.934,0.996
+ c-0.787,0.709-1.146,1.584-1.038,2.529c0.172,1.501,1.493,2.859,2.728,3.541c3.717,2.053,8.928,2.201,15.481,0.445
+ c4.157-1.109,8.888-4.43,9.446-9.092c0.617-5.114-4.359-6.334-7.994-7.226c-0.51-0.125-0.989-0.241-1.441-0.364
+ c-1.289-0.351-3.558-1.146-4.242-2.533c-0.27-0.545-0.267-1.135,0.008-1.801c0.908-2.207,4.115-3.142,6.271-2.468
+ c0.797,0.246,1.54,0.813,2.328,1.411c1.514,1.146,3.229,2.45,5.416,1.154C361.386,217.07,362.376,215.602,361.816,214.289z"/>
+ <path fill="#1C86EE" d="M332.934,221.484c0.896-2.74,2.396-7.33-0.688-9.549l-0.001-0.002c-2.327-1.668-5.641-1.58-7.93-1.369
+ c-1.478,0.137-2.885,0.425-4.181,0.855c-0.001,0-0.288,0.098-0.288,0.098c-1.332,0.447-2.592,0.873-3.971,0.851
+ c-0.729-0.013-1.404-0.339-2.121-0.685c-0.337-0.164-0.686-0.332-1.045-0.468c-1.458-0.559-2.98-0.896-4.527-1.004
+ c-1.535-0.104-2.969,0.007-4.255,0.34c-0.55,0.144-1.086,0.328-1.604,0.509c-0.881,0.306-1.713,0.594-2.598,0.678
+ c-0.951,0.092-1.959-0.061-3.021-0.219c-1.872-0.281-3.811-0.57-5.551,0.502c-2.228,1.371-2.986,3.892-3.661,6.112
+ c-0.134,0.443-0.261,0.863-0.397,1.275l-0.767,2.305l-2.312,6.94c0.002-0.002-0.604,1.755-0.604,1.755
+ c-0.521,1.479-1.061,3.012-1.432,4.563c-0.23,0.979-0.847,3.579,1.035,4.479c2.139,1.021,4.373-0.661,5.642-2.783
+ c0.559-0.936,0.891-1.959,1.213-2.949l0.146-0.441l1.545-4.631c0.188-0.561,0.371-1.139,0.547-1.695
+ c0.613-1.94,1.248-3.946,2.234-5.696c1.688-2.985,5.711-5.351,9.276-3.959c1.584,0.617,2.38,2.265,2.024,4.192
+ c-0.176,0.955-0.521,1.916-0.856,2.847c-0.136,0.373-0.272,0.76-0.401,1.144c0.001-0.002-1.502,4.526-1.502,4.526
+ c0,0.001-0.23,0.711-0.23,0.711c-0.359,1.11-0.731,2.261-1.067,3.401c0,0.002-0.034,0.117-0.034,0.117
+ c-0.371,1.269-0.88,3.004-0.1,4.386c0.343,0.604,0.896,0.998,1.598,1.144c1.268,0.262,2.779-0.328,3.646-0.988
+ c1.888-1.434,2.66-3.998,3.283-6.062l0.129-0.43c0.496-1.632,1.033-3.28,1.556-4.877l1.135-3.525
+ c0.685-2.166,1.706-4.584,4.11-6.094c1.539-0.97,4.096-1.724,6.229-0.66c2.33,1.158,1.846,3.854,1.063,6.341
+ c-0.785,2.495-1.678,5.323-2.629,8.047c-0.785,2.239-1.48,5.246-0.34,6.85c0.506,0.709,1.293,1.066,2.344,1.063
+ c3.262-0.006,4.781-4.176,5.512-6.18c0.945-2.602,1.793-5.282,2.611-7.877l1.217-3.813L332.934,221.484z"/>
+ <path fill="#1C86EE" d="M286.293,206.096L286.293,206.096c0.343-1.027,0.813-2.433,0.409-3.736
+ c-0.392-1.264-1.681-1.856-3.45-1.587c-2.132,0.322-3.745,1.887-4.794,4.649c-1.485,3.897-2.763,7.963-3.996,11.894l-1.819,5.703
+ l-3.004,9.133c-0.09,0.276-0.209,0.598-0.337,0.937c-0.638,1.703-1.513,4.034-0.442,5.642c0.371,0.563,0.947,0.918,1.664,1.028
+ c1.274,0.199,2.832-0.405,3.709-1.106c1.474-1.172,2.271-2.934,2.855-4.504c0.374-1.004,0.678-2.039,0.971-3.039l0.409-1.371
+ c0.527-1.696,1.107-3.418,1.669-5.077l0.793-2.359l3.387-10.229L286.293,206.096z"/>
+ <path fill="#1C86EE" d="M258.689,216.548c0.924-0.672,1.881-1.366,2.649-2.274v-0.002c0.978-1.148,0.361-2.498-0.087-3.479
+ c-0.063-0.142-0.125-0.272-0.182-0.399c-0.522-1.228-0.661-2.303-0.409-3.195c0.325-1.149,1.299-1.73,2.325-2.346
+ c1.063-0.636,2.158-1.289,2.646-2.604c0.362-0.98,0.055-1.628-0.268-1.999c-1.17-1.345-4.295-1.155-5.301-0.934
+ c-2.381,0.527-4.61,1.93-6.631,4.171c-0.748,0.832-1.404,1.769-2.043,2.675c-0.918,1.31-1.869,2.659-3.078,3.655
+ c-0.201,0.166-0.416,0.326-0.646,0.496c-0.773,0.576-1.65,1.229-2.086,2.213c-0.551,1.244-0.035,2.42,0.421,3.457
+ c0.104,0.24,0.203,0.466,0.287,0.687c0.716,1.88,0.542,3.286-0.027,5.222c-0.452,1.531-0.969,3.077-1.466,4.572l-0.216,0.651
+ c-0.284,0.86-0.604,1.731-0.911,2.573c-0.354,0.968-0.719,1.963-1.039,2.963l-0.057,0.179c-0.538,1.664-1.537,4.758,0.082,6.278
+ c0.506,0.478,1.168,0.713,1.912,0.684c1.404-0.057,2.912-1.035,3.721-1.923c1.145-1.263,1.843-2.817,2.427-4.312
+ c0.863-2.209,1.562-4.514,2.233-6.742c0.445-1.474,0.906-3,1.41-4.479c0.498-1.459,0.994-2.76,2.037-3.891
+ C257.064,217.729,257.854,217.154,258.689,216.548z"/>
+ <path fill="#1C86EE" d="M269.717,217.718c0.094-0.268,0.219-0.565,0.35-0.881c0.44-1.063,0.938-2.271,0.746-3.364l0,0
+ c-0.133-0.777-0.52-1.373-1.119-1.722c-1.143-0.663-2.629-0.241-3.217-0.026c-1.979,0.719-3.215,2.045-4.009,4.301l-1.608,4.451
+ l-1.578,4.369l-0.934,2.745c-0.517,1.538-1.05,3.132-1.638,4.666c0-0.001-0.12,0.308-0.12,0.308
+ c-0.57,1.472-1.279,3.301-0.947,4.998c0.183,0.931,0.75,1.604,1.604,1.892c1.36,0.464,3.166-0.138,4.124-0.981
+ c1.904-1.688,2.666-4.072,3.4-6.381c0.149-0.469,0.306-0.949,0.465-1.415l1.729-4.997l1.375-3.975L269.717,217.718z"/>
+ <path fill="#1C86EE" d="M268.672,205.604l-0.064-0.035c0.856,0.574,2.059,0.556,3.295-0.057c1.154-0.568,2.354-1.705,2.438-2.964
+ c0.032-0.51-0.109-1.237-0.979-1.815c-1.198-0.799-2.836-0.41-3.969,0.221c-1.322,0.735-2.154,1.851-2.121,2.844
+ C267.285,204.327,267.543,205.07,268.672,205.604z"/>
+ <path fill="#1C86EE" d="M243.664,206.609c-0.536-2.534-2.408-4.866-5.137-6.403v0.001c-4.123-2.324-9.782-2.643-15.936-0.9
+ c-4.531,1.287-8.775,3.886-12.271,7.52c-3.365,3.501-5.928,7.81-7.405,12.461c-1.983,6.237-1.365,11.944,1.692,15.657
+ c3.623,4.396,9.799,4.787,13.156,4.63c5.514-0.263,10.828-2.232,15.373-5.698c1.641-1.25,4.695-3.578,4.504-6.227
+ c-0.041-0.551-0.298-1.025-0.742-1.371c-0.721-0.559-1.801-0.672-2.556-0.537c-1.313,0.24-2.401,1.132-3.362,1.917l-0.479,0.389
+ c-2.046,1.613-4.272,3.252-7.017,4c-2.678,0.726-5.363,0.789-7.562,0.183c-6.377-1.769-4.817-9.795-4.188-12.211
+ c1.424-5.474,4.892-10.271,9.272-12.834c4.22-2.465,11.136-2.82,14.313,0.611c0.431,0.465,0.779,1.077,1.117,1.67
+ c0.867,1.523,1.852,3.25,4.373,2.498C243.193,211.252,244.232,209.3,243.664,206.609z"/>
+ <path fill="#1C86EE" d="M195.014,200.358c-4.125-2.321-9.783-2.64-15.929-0.898c-9.037,2.563-16.578,10.218-19.681,19.979
+ c-1.984,6.237-1.367,11.947,1.693,15.658c3.623,4.396,9.797,4.789,13.156,4.629c5.557-0.263,10.905-2.259,15.466-5.771
+ c3.394-2.608,8.061-6.667,9.378-11.749c0.597-2.301,0.181-4.008-1.17-4.807c-0.845-0.495-1.885-0.568-2.803-0.637
+ c-0.206-0.014-0.4-0.027-0.587-0.047c-1.673-0.16-3.056-0.195-4.354-0.107c-3.946,0.262-6.429,1.339-7.382,3.201
+ c-1.097,2.149,0.78,3.272,2.152,4.092c0.641,0.385,1.305,0.781,1.638,1.217c0.889,1.164-0.19,3.023-1.131,3.988
+ c-1.286,1.313-2.922,2.291-4.861,2.904c-1.461,0.463-6.507,1.797-10.067-0.443c-3.353-2.11-3.175-6.659-2.772-9.184
+ c0.628-3.934,2.165-7.484,4.44-10.269l-0.387-0.317l0.387,0.316c2.055-2.516,4.07-4.229,6.162-5.24
+ c2.318-1.122,5.071-1.568,7.962-1.29c1.945,0.188,4.565,0.861,5.996,2.998c0.229,0.341,0.421,0.705,0.626,1.092
+ c0.359,0.679,0.731,1.382,1.315,1.966c1.229,1.229,3.069,0.5,3.854,0.188c2.255-0.897,2.553-3.56,1.848-5.798
+ C199.248,203.77,197.491,201.755,195.014,200.358z"/>
+
+ <linearGradient id="XMLID_44_" gradientUnits="userSpaceOnUse" x1="352.1504" y1="401.8721" x2="329.5183" y2="475.8033" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_44_)" d="M345.693,217.498c1.02-2.479,4.474-3.505,6.881-2.754c2.521,0.785,4.423,4.341,7.341,2.613
+ c0.914-0.539,1.921-1.75,1.442-2.873c-0.463-1.078-1.825-1.67-2.83-2.088c-5.125-2.152-10.988-2.049-15.905,0.578
+ c-1.897,1.017-3.654,2.452-4.582,4.439c-1.126,2.415-0.497,4.521,1.59,6.094c1.83,1.379,4.009,2.012,6.197,2.563
+ c0.88,0.224,1.848,0.539,2.717,1.006c3.412-0.387,6.507-0.962,9.283-1.738c-1.899-1.652-5.162-2.181-7.567-2.834
+ C348.048,221.906,344.48,220.445,345.693,217.498z"/>
+
+ <linearGradient id="XMLID_45_" gradientUnits="userSpaceOnUse" x1="317.1084" y1="390.5186" x2="294.4502" y2="464.5356" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_45_)" d="M331.95,212.342c-2.112-1.515-5.112-1.507-7.591-1.279c-1.381,0.127-2.752,0.396-4.067,0.834
+ c-1.46,0.488-2.856,0.998-4.426,0.974c-1.211-0.021-2.237-0.769-3.334-1.185c-1.402-0.537-2.886-0.867-4.386-0.972
+ c-1.364-0.096-2.768-0.021-4.097,0.325c-1.438,0.371-2.782,1.055-4.278,1.197c-2.729,0.26-5.84-1.34-8.355,0.211
+ c-2.471,1.521-2.998,4.566-3.85,7.121c-0.273,0.824-0.545,1.646-0.818,2.469c2.085,0.355,4.143,0.695,6.182,1.02
+ c0.291-0.701,0.605-1.39,0.979-2.049c1.844-3.267,6.142-5.641,9.893-4.179c1.959,0.764,2.7,2.762,2.336,4.75
+ c-0.201,1.108-0.611,2.187-0.994,3.255c2.227,0.292,4.414,0.559,6.563,0.801c0.206-0.635,0.414-1.268,0.613-1.902
+ c0.813-2.572,1.968-4.89,4.32-6.366c1.93-1.214,4.604-1.738,6.721-0.687c2.771,1.377,2.068,4.551,1.314,6.938
+ c-0.328,1.039-0.658,2.075-0.99,3.106c2.381,0.162,4.696,0.285,6.94,0.362c0.606-1.896,1.194-3.797,1.813-5.688
+ C333.292,218.775,334.764,214.365,331.95,212.342z"/>
+
+ <linearGradient id="XMLID_46_" gradientUnits="userSpaceOnUse" x1="287.7227" y1="381.0137" x2="264.7614" y2="456.0205" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_46_)" d="M286.225,202.506c-0.387-1.25-1.774-1.41-2.896-1.242c-2.331,0.354-3.622,2.277-4.401,4.334
+ c-1.768,4.635-3.216,9.426-4.717,14.17c2.229,0.424,4.438,0.838,6.622,1.232c1.66-5.021,3.325-10.04,4.985-15.063
+ C286.175,204.871,286.572,203.63,286.225,202.506z"/>
+
+ <linearGradient id="XMLID_47_" gradientUnits="userSpaceOnUse" x1="263.6563" y1="374.3867" x2="241.1457" y2="447.9211" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_47_)" d="M260.959,213.949c0.884-1.045,0.1-2.323-0.345-3.365c-0.47-1.098-0.765-2.352-0.433-3.525
+ c0.732-2.59,4.102-2.604,4.983-4.985c0.964-2.6-3.578-2.58-4.992-2.271c-2.548,0.563-4.646,2.106-6.362,4.019
+ c-1.815,2.017-3.067,4.646-5.179,6.383c-0.907,0.747-2.093,1.4-2.591,2.525c-0.17,0.387-0.206,0.769-0.175,1.147
+ c4.053,0.901,8.073,1.778,12.05,2.617C258.989,215.703,260.102,214.961,260.959,213.949z"/>
+
+ <linearGradient id="XMLID_48_" gradientUnits="userSpaceOnUse" x1="275.9443" y1="378.1533" x2="253.4364" y2="451.6787" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_48_)" d="M270.32,213.559c-0.321-1.877-2.209-1.896-3.674-1.365c-1.979,0.721-3.017,2.029-3.707,3.998
+ c-0.146,0.418-0.304,0.836-0.451,1.254c2.135,0.439,4.25,0.863,6.354,1.279c0.134-0.39,0.271-0.779,0.402-1.17
+ C269.648,216.396,270.543,214.813,270.32,213.559z"/>
+
+ <linearGradient id="XMLID_49_" gradientUnits="userSpaceOnUse" x1="276.5596" y1="377.6504" x2="253.3182" y2="453.5727" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_49_)" d="M273.081,201.148c-2.376-1.583-7.599,2.393-4.195,4.004
+ C271.061,206.611,275.652,202.857,273.081,201.148z"/>
+
+ <linearGradient id="XMLID_50_" gradientUnits="userSpaceOnUse" x1="236.9277" y1="365.3828" x2="214.0403" y2="440.1483" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_50_)" d="M220.757,206.754c4.118-2.408,11.373-3.141,14.933,0.704c1.596,1.719,1.947,4.933,4.979,4.026
+ c2.279-0.68,2.979-2.535,2.508-4.772c-0.563-2.663-2.581-4.769-4.894-6.07c-4.682-2.636-10.549-2.271-15.553-0.853
+ c-4.6,1.304-8.742,3.947-12.051,7.384c-1.205,1.257-2.307,2.62-3.287,4.063c2.852-0.219,5.713-0.366,8.573-0.424
+ C217.34,209.206,218.945,207.814,220.757,206.754z"/>
+
+ <linearGradient id="XMLID_51_" gradientUnits="userSpaceOnUse" x1="196.4858" y1="353.0273" x2="173.7346" y2="427.3483" gradientTransform="matrix(1 -0.0016 0.0016 1 -0.2427 -194.2114)">
+ <stop offset="0" style="stop-color:#F7FFFF"/>
+ <stop offset="0.1124" style="stop-color:#D9E8ED"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_51_)" d="M178.143,206.43c2.533-1.227,5.443-1.605,8.228-1.338c2.413,0.232,4.957,1.115,6.364,3.217
+ c0.653,0.978,1.035,2.141,1.878,2.98c0.905,0.906,2.284,0.488,3.316,0.078c2.088-0.832,2.137-3.338,1.555-5.184
+ c-0.742-2.354-2.603-4.199-4.715-5.391c-4.68-2.634-10.543-2.271-15.548-0.853c-9.294,2.636-16.456,10.582-19.34,19.649
+ c-0.134,0.429-0.255,0.864-0.373,1.306c2.804-0.869,5.726-1.728,8.744-2.556c0.805-2.366,1.985-4.608,3.56-6.538
+ C173.564,209.657,175.625,207.645,178.143,206.43z"/>
+</g>
+<g id="Calque_8">
+ <g>
+ <g>
+
+ <radialGradient id="XMLID_52_" cx="147.7085" cy="348.5166" r="52.7762" gradientTransform="matrix(1.0169 0.0102 0.0047 1.0111 4.6242 -193.2883)" gradientUnits="userSpaceOnUse">
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#80D1FF"/>
+ <stop offset="0.6036" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7215" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ </radialGradient>
+ <path fill="url(#XMLID_52_)" d="M173.665,170.965c-6.073,18.438-23.024,29.468-37.183,23.018
+ c-14.01-6.38-18.025-26.629-9.83-43.751c7.479-15.64,22.729-23.224,34.717-18.086
+ C173.459,137.33,179.202,154.149,173.665,170.965z"/>
+
+ <linearGradient id="XMLID_53_" gradientUnits="userSpaceOnUse" x1="147.7441" y1="374.1729" x2="124.3015" y2="262.8594" gradientTransform="matrix(1.0119 0.009 0.0036 1.008 3.178 -192.6773)">
+ <stop offset="0" style="stop-color:#1C86EE"/>
+ <stop offset="0.118" style="stop-color:#1C86EE"/>
+ <stop offset="0.5169" style="stop-color:#7DCFFE"/>
+ <stop offset="0.5989" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7199" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_53_)" d="M173.629,170.978c-6.04,18.362-22.887,29.312-36.972,22.898
+ c-13.939-6.345-18.009-26.494-9.925-43.582c7.394-15.659,22.594-23.29,34.586-18.148
+ C173.411,137.334,179.153,154.18,173.629,170.978z"/>
+
+ <linearGradient id="XMLID_54_" gradientUnits="userSpaceOnUse" x1="147.9409" y1="375.7422" x2="132.843" y2="264.589" gradientTransform="matrix(1.007 0.0077 0.0025 1.005 2.5764 -192.1149)">
+ <stop offset="0" style="stop-color:#1D86EE"/>
+ <stop offset="0.118" style="stop-color:#1D86EE"/>
+ <stop offset="0.5169" style="stop-color:#7ACCFE"/>
+ <stop offset="0.594" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7182" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_54_)" d="M173.593,170.991c-6.007,18.286-22.75,29.155-36.761,22.778
+ c-13.868-6.31-17.993-26.359-10.02-43.412c7.308-15.678,22.458-23.357,34.455-18.211
+ C173.363,137.338,179.104,154.211,173.593,170.991z"/>
+
+ <linearGradient id="XMLID_55_" gradientUnits="userSpaceOnUse" x1="148.894" y1="377.998" x2="142.0136" y2="267.9479" gradientTransform="matrix(1.002 0.0064 0.0014 1.0019 1.1296 -192.3518)">
+ <stop offset="0" style="stop-color:#1D87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#77CAFD"/>
+ <stop offset="0.5887" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7165" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_55_)" d="M173.558,171.004c-5.975,18.209-22.613,28.999-36.55,22.658
+ c-13.797-6.276-17.977-26.225-10.115-43.243c7.222-15.697,22.323-23.424,34.323-18.273
+ C173.314,137.342,179.055,154.242,173.558,171.004z"/>
+
+ <linearGradient id="XMLID_56_" gradientUnits="userSpaceOnUse" x1="149.7539" y1="380.1016" x2="150.8477" y2="272.0876" gradientTransform="matrix(0.9971 0.0051 2.000000e-004 0.9988 -0.2735 -192.5862)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1D87EE"/>
+ <stop offset="0.5169" style="stop-color:#74C8FD"/>
+ <stop offset="0.5831" style="stop-color:#5BB5F9"/>
+ <stop offset="0.7146" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_56_)" d="M173.522,171.018c-5.942,18.133-22.476,28.843-36.339,22.538
+ c-13.726-6.241-17.96-26.09-10.209-43.073c7.135-15.717,22.187-23.491,34.191-18.336
+ C173.267,137.346,179.006,154.272,173.522,171.018z"/>
+
+ <linearGradient id="XMLID_57_" gradientUnits="userSpaceOnUse" x1="150.5835" y1="382.0322" x2="159.292" y2="276.9577" gradientTransform="matrix(0.9921 0.0038 -9.000000e-004 0.9957 -1.7202 -192.8226)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#71C5FC"/>
+ <stop offset="0.5772" style="stop-color:#5BB5F8"/>
+ <stop offset="0.7126" style="stop-color:#2D93F1"/>
+ <stop offset="0.7809" style="stop-color:#1C86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_57_)" d="M173.487,171.031c-5.909,18.057-22.339,28.687-36.128,22.418
+ c-13.655-6.206-17.944-25.955-10.304-42.903c7.049-15.736,22.052-23.557,34.06-18.398
+ C173.218,137.35,178.957,154.303,173.487,171.031z"/>
+
+ <linearGradient id="XMLID_58_" gradientUnits="userSpaceOnUse" x1="150.5122" y1="382.9463" x2="166.3651" y2="281.6582" gradientTransform="matrix(0.9872 0.0025 -0.002 0.9927 -2.3233 -192.2593)">
+ <stop offset="0" style="stop-color:#1E87EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6EC3FC"/>
+ <stop offset="0.5686" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7098" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_58_)" d="M173.451,171.044c-5.876,17.98-22.202,28.53-35.917,22.298
+ c-13.584-6.171-17.928-25.82-10.399-42.733c6.963-15.755,21.917-23.624,33.929-18.46
+ C173.17,137.354,178.908,154.334,173.451,171.044z"/>
+
+ <linearGradient id="XMLID_59_" gradientUnits="userSpaceOnUse" x1="151.2979" y1="383.6377" x2="173.7307" y2="286.88" gradientTransform="matrix(0.9822 0.0013 -0.0031 0.9896 -3.77 -191.6517)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1E87EE"/>
+ <stop offset="0.5169" style="stop-color:#6BC1FB"/>
+ <stop offset="0.5616" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7074" style="stop-color:#2E93F1"/>
+ <stop offset="0.7809" style="stop-color:#1D86EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_59_)" d="M173.416,171.057c-5.844,17.904-22.065,28.374-35.707,22.178
+ c-13.513-6.136-17.912-25.685-10.494-42.564c6.877-15.774,21.781-23.69,33.797-18.522
+ C173.122,137.358,178.859,154.365,173.416,171.057z"/>
+
+ <linearGradient id="XMLID_60_" gradientUnits="userSpaceOnUse" x1="152.1089" y1="385" x2="180.4698" y2="293.4412" gradientTransform="matrix(0.9772 0 -0.0042 0.9865 -5.2167 -191.8881)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#68BEFB"/>
+ <stop offset="0.5541" style="stop-color:#5CB5F9"/>
+ <stop offset="0.7049" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_60_)" d="M173.38,171.07c-5.811,17.828-21.928,28.218-35.495,22.058
+ c-13.442-6.102-17.896-25.55-10.589-42.395c6.792-15.794,21.646-23.758,33.666-18.585
+ C173.074,137.362,178.81,154.396,173.38,171.07z"/>
+
+ <linearGradient id="XMLID_61_" gradientUnits="userSpaceOnUse" x1="152.0825" y1="386.168" x2="185.6536" y2="300.3651" gradientTransform="matrix(0.9723 -0.0013 -0.0053 0.9834 -5.8197 -192.123)">
+ <stop offset="0" style="stop-color:#1F88EE"/>
+ <stop offset="0.118" style="stop-color:#1F88EE"/>
+ <stop offset="0.5169" style="stop-color:#65BCFA"/>
+ <stop offset="0.546" style="stop-color:#5CB5F8"/>
+ <stop offset="0.7022" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_61_)" d="M173.345,171.083c-5.778,17.751-21.791,28.062-35.284,21.938
+ c-13.371-6.067-17.879-25.416-10.684-42.225c6.706-15.813,21.51-23.824,33.535-18.647
+ C173.026,137.367,178.761,154.426,173.345,171.083z"/>
+
+ <linearGradient id="XMLID_62_" gradientUnits="userSpaceOnUse" x1="153.0029" y1="387.1455" x2="191.0197" y2="307.5345" gradientTransform="matrix(0.9673 -0.0026 -0.0064 0.9803 -7.2665 -192.3584)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#62BAFA"/>
+ <stop offset="0.5373" style="stop-color:#5CB5F9"/>
+ <stop offset="0.6993" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_62_)" d="M173.309,171.097c-5.746,17.675-21.654,27.905-35.073,21.818
+ c-13.3-6.032-17.864-25.281-10.778-42.055c6.619-15.833,21.375-23.891,33.403-18.71
+ C172.978,137.371,178.712,154.457,173.309,171.097z"/>
+
+ <linearGradient id="XMLID_63_" gradientUnits="userSpaceOnUse" x1="153.1177" y1="387.0771" x2="194.7797" y2="313.9872" gradientTransform="matrix(0.9624 -0.0039 -0.0075 0.9773 -7.87 -191.796)">
+ <stop offset="0" style="stop-color:#2088EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5FB7F9"/>
+ <stop offset="0.5279" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6962" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_63_)" d="M173.273,171.11c-5.713,17.599-21.517,27.749-34.862,21.698
+ c-13.229-5.998-17.847-25.146-10.873-41.886c6.533-15.852,21.239-23.958,33.271-18.772
+ C172.93,137.375,178.663,154.488,173.273,171.11z"/>
+
+ <linearGradient id="XMLID_64_" gradientUnits="userSpaceOnUse" x1="154.2466" y1="387.6943" x2="198.7525" y2="321.3156" gradientTransform="matrix(0.9574 -0.0052 -0.0086 0.9742 -9.3167 -192.0324)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2088EE"/>
+ <stop offset="0.5169" style="stop-color:#5CB5F8"/>
+ <stop offset="0.5176" style="stop-color:#5CB5F8"/>
+ <stop offset="0.6927" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_64_)" d="M173.238,171.123c-5.681,17.523-21.38,27.593-34.651,21.578
+ c-13.158-5.962-17.831-25.011-10.968-41.716c6.447-15.871,21.104-24.024,33.14-18.834
+ C172.881,137.378,178.614,154.519,173.238,171.123z"/>
+
+ <linearGradient id="XMLID_65_" gradientUnits="userSpaceOnUse" x1="155.5146" y1="388.1504" x2="202.0645" y2="328.5667" gradientTransform="matrix(0.9524 -0.0065 -0.0097 0.9711 -10.763 -192.2664)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#59B3F8"/>
+ <stop offset="0.689" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_65_)" d="M173.203,171.136c-5.647,17.446-21.243,27.438-34.44,21.458
+ c-13.087-5.928-17.815-24.876-11.063-41.547c6.361-15.89,20.968-24.091,33.009-18.897
+ C172.833,137.383,178.565,154.549,173.203,171.136z"/>
+
+ <linearGradient id="XMLID_66_" gradientUnits="userSpaceOnUse" x1="156.0215" y1="387.5674" x2="203.8433" y2="334.7467" gradientTransform="matrix(0.9475 -0.0077 -0.0108 0.968 -11.3655 -191.6588)">
+ <stop offset="0" style="stop-color:#2189EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#56B0F7"/>
+ <stop offset="0.6849" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_66_)" d="M173.167,171.149c-5.615,17.37-21.105,27.28-34.229,21.338
+ c-13.016-5.894-17.799-24.741-11.158-41.377c6.275-15.91,20.833-24.158,32.877-18.959
+ C172.785,137.387,178.516,154.58,173.167,171.149z"/>
+
+ <linearGradient id="XMLID_67_" gradientUnits="userSpaceOnUse" x1="157.605" y1="386.8857" x2="205.9639" y2="340.6957" gradientTransform="matrix(0.9425 -0.009 -0.0119 0.965 -12.8123 -191.0964)">
+ <stop offset="0" style="stop-color:#2289EE"/>
+ <stop offset="0.118" style="stop-color:#2189EE"/>
+ <stop offset="0.5169" style="stop-color:#53AEF7"/>
+ <stop offset="0.6803" style="stop-color:#2E94F1"/>
+ <stop offset="0.7809" style="stop-color:#1D87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_67_)" d="M173.131,171.163c-5.582,17.294-20.968,27.124-34.018,21.218
+ c-12.944-5.858-17.783-24.606-11.252-41.208c6.189-15.929,20.698-24.225,32.746-19.021
+ C172.737,137.391,178.467,154.611,173.131,171.163z"/>
+
+ <linearGradient id="XMLID_68_" gradientUnits="userSpaceOnUse" x1="158.4619" y1="386.958" x2="206.6836" y2="347.1672" gradientTransform="matrix(0.9376 -0.0103 -0.013 0.9619 -13.4163 -191.3318)">
+ <stop offset="0" style="stop-color:#228AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4FACF6"/>
+ <stop offset="0.6716" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_68_)" d="M173.096,171.176c-5.55,17.217-20.832,26.968-33.807,21.097
+ c-12.874-5.824-17.767-24.472-11.347-41.038c6.103-15.949,20.562-24.292,32.614-19.084
+ C172.689,137.395,178.418,154.642,173.096,171.176z"/>
+
+ <linearGradient id="XMLID_69_" gradientUnits="userSpaceOnUse" x1="160.4146" y1="386.959" x2="207.8983" y2="353.2505" gradientTransform="matrix(0.9326 -0.0116 -0.0141 0.9588 -14.8625 -191.5682)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#4CAAF6"/>
+ <stop offset="0.6656" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_69_)" d="M173.061,171.189c-5.517,17.141-20.695,26.812-33.596,20.977
+ c-12.803-5.789-17.75-24.337-11.442-40.868c6.017-15.968,20.427-24.358,32.483-19.146
+ C172.641,137.399,178.37,154.672,173.061,171.189z"/>
+
+ <linearGradient id="XMLID_70_" gradientUnits="userSpaceOnUse" x1="162.5522" y1="386.9033" x2="208.7663" y2="358.9007" gradientTransform="matrix(0.9276 -0.0129 -0.0152 0.9557 -16.3092 -191.8031)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#2289EF"/>
+ <stop offset="0.5169" style="stop-color:#49A7F5"/>
+ <stop offset="0.6587" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_70_)" d="M173.025,171.203c-5.484,17.065-20.558,26.655-33.385,20.857
+ c-12.731-5.754-17.734-24.202-11.537-40.698c5.931-15.987,20.292-24.425,32.352-19.208
+ C172.593,137.403,178.32,154.703,173.025,171.203z"/>
+
+ <linearGradient id="XMLID_71_" gradientUnits="userSpaceOnUse" x1="163.9199" y1="385.918" x2="208.4154" y2="363.1921" gradientTransform="matrix(0.9227 -0.0142 -0.0163 0.9527 -16.9128 -191.2403)">
+ <stop offset="0" style="stop-color:#238AEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#46A5F5"/>
+ <stop offset="0.6509" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_71_)" d="M172.989,171.216c-5.451,16.988-20.42,26.499-33.174,20.737
+ c-12.661-5.72-17.718-24.067-11.632-40.529c5.845-16.006,20.156-24.492,32.22-19.271
+ C172.545,137.407,178.271,154.734,172.989,171.216z"/>
+
+ <linearGradient id="XMLID_72_" gradientUnits="userSpaceOnUse" x1="166.3784" y1="384.8955" x2="208.7956" y2="366.9797" gradientTransform="matrix(0.9177 -0.0154 -0.0174 0.9496 -18.359 -190.6317)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#43A3F4"/>
+ <stop offset="0.6422" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_72_)" d="M172.954,171.229c-5.419,16.912-20.284,26.343-32.963,20.617
+ c-12.589-5.685-17.702-23.933-11.727-40.359c5.759-16.026,20.021-24.559,32.089-19.333
+ C172.497,137.411,178.223,154.765,172.954,171.229z"/>
+
+ <linearGradient id="XMLID_73_" gradientUnits="userSpaceOnUse" x1="168.0645" y1="384.7578" x2="208.1143" y2="371.1703" gradientTransform="matrix(0.9128 -0.0167 -0.0185 0.9465 -18.9621 -190.8685)">
+ <stop offset="0" style="stop-color:#248BEF"/>
+ <stop offset="0.118" style="stop-color:#238AEF"/>
+ <stop offset="0.5169" style="stop-color:#40A0F3"/>
+ <stop offset="0.6318" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_73_)" d="M172.918,171.242c-5.386,16.836-20.146,26.187-32.752,20.497
+ c-12.518-5.65-17.686-23.797-11.821-40.19c5.673-16.045,19.885-24.625,31.958-19.396
+ C172.448,137.415,178.174,154.795,172.918,171.242z"/>
+
+ <linearGradient id="XMLID_74_" gradientUnits="userSpaceOnUse" x1="170.8232" y1="384.6436" x2="208.2939" y2="374.8952" gradientTransform="matrix(0.9078 -0.018 -0.0196 0.9434 -20.4088 -191.1045)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3D9EF3"/>
+ <stop offset="0.6196" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_74_)" d="M172.883,171.255c-5.354,16.76-20.009,26.03-32.541,20.377
+ c-12.448-5.615-17.67-23.663-11.916-40.02c5.587-16.064,19.75-24.692,31.826-19.458
+ C172.4,137.419,178.125,154.826,172.883,171.255z"/>
+
+ <linearGradient id="XMLID_75_" gradientUnits="userSpaceOnUse" x1="172.7466" y1="384.5195" x2="207.4841" y2="378.1284" gradientTransform="matrix(0.9029 -0.0193 -0.0207 0.9403 -21.0128 -191.3399)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#248AEF"/>
+ <stop offset="0.5169" style="stop-color:#3A9CF2"/>
+ <stop offset="0.6049" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E87EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_75_)" d="M172.847,171.269c-5.321,16.684-19.872,25.874-32.33,20.257
+ c-12.376-5.58-17.653-23.528-12.011-39.851c5.501-16.083,19.614-24.758,31.694-19.52
+ C172.352,137.423,178.076,154.857,172.847,171.269z"/>
+
+ <linearGradient id="XMLID_76_" gradientUnits="userSpaceOnUse" x1="175.7002" y1="383.5332" x2="207.607" y2="380.029" gradientTransform="matrix(0.8979 -0.0206 -0.0218 0.9373 -22.4586 -190.7766)">
+ <stop offset="0" style="stop-color:#258BEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3799F2"/>
+ <stop offset="0.5869" style="stop-color:#2F94F1"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_76_)" d="M172.812,171.282c-5.288,16.607-19.735,25.718-32.119,20.137
+ c-12.306-5.546-17.638-23.393-12.106-39.681c5.415-16.103,19.479-24.826,31.563-19.583
+ C172.304,137.427,178.027,154.888,172.812,171.282z"/>
+
+ <linearGradient id="XMLID_77_" gradientUnits="userSpaceOnUse" x1="178.7642" y1="383.4414" x2="207.7752" y2="382.3727" gradientTransform="matrix(0.8929 -0.0219 -0.0229 0.9342 -23.9053 -191.0129)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3497F1"/>
+ <stop offset="0.5645" style="stop-color:#2F94F0"/>
+ <stop offset="0.7809" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_77_)" d="M172.776,171.295c-5.255,16.531-19.598,25.562-31.908,20.017
+ c-12.234-5.511-17.622-23.258-12.201-39.512c5.329-16.122,19.343-24.892,31.432-19.645
+ C172.256,137.431,177.978,154.918,172.776,171.295z"/>
+
+ <linearGradient id="XMLID_78_" gradientUnits="userSpaceOnUse" x1="180.9126" y1="382.3936" x2="206.9879" y2="383.326" gradientTransform="matrix(0.888 -0.0231 -0.024 0.9311 -24.5078 -190.4053)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#258BEF"/>
+ <stop offset="0.5169" style="stop-color:#3195F1"/>
+ <stop offset="0.5239" style="stop-color:#3095F1"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_78_)" d="M172.741,171.308c-5.223,16.455-19.461,25.405-31.697,19.897
+ c-12.163-5.476-17.605-23.124-12.295-39.342c5.243-16.142,19.208-24.959,31.3-19.708
+ C172.208,137.436,177.929,154.949,172.741,171.308z"/>
+
+ <linearGradient id="XMLID_79_" gradientUnits="userSpaceOnUse" x1="184.1323" y1="382.2773" x2="207.253" y2="384.7914" gradientTransform="matrix(0.883 -0.0244 -0.0251 0.928 -25.9546 -190.6402)">
+ <stop offset="0" style="stop-color:#268CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2E92F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_79_)" d="M172.705,171.321c-5.19,16.378-19.324,25.249-31.486,19.777
+ c-12.092-5.441-17.589-22.988-12.391-39.172c5.157-16.161,19.073-25.025,31.169-19.77
+ C172.16,137.439,177.88,154.98,172.705,171.321z"/>
+
+ <linearGradient id="XMLID_80_" gradientUnits="userSpaceOnUse" x1="186.4248" y1="381.1992" x2="206.5794" y2="384.8848" gradientTransform="matrix(0.8781 -0.0257 -0.0262 0.925 -26.5581 -190.0764)">
+ <stop offset="0" style="stop-color:#278CEF"/>
+ <stop offset="0.118" style="stop-color:#268BEF"/>
+ <stop offset="0.5169" style="stop-color:#2B90F0"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_80_)" d="M172.669,171.334c-5.157,16.302-19.187,25.093-31.275,19.657
+ c-12.021-5.406-17.573-22.854-12.485-39.002c5.071-16.18,18.937-25.092,31.037-19.832
+ C172.112,137.443,177.831,155.011,172.669,171.334z"/>
+
+ <linearGradient id="XMLID_81_" gradientUnits="userSpaceOnUse" x1="189.8101" y1="381.0098" x2="206.9989" y2="385.4618" gradientTransform="matrix(0.8731 -0.027 -0.0273 0.9219 -28.0053 -190.3133)">
+ <stop offset="0" style="stop-color:#278DEF"/>
+ <stop offset="0.118" style="stop-color:#268CEF"/>
+ <stop offset="0.5169" style="stop-color:#288EEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_81_)" d="M172.634,171.348c-5.125,16.226-19.05,24.937-31.064,19.537
+ c-11.95-5.372-17.557-22.719-12.58-38.833c4.985-16.199,18.801-25.159,30.906-19.895
+ C172.063,137.447,177.782,155.042,172.634,171.348z"/>
+
+ <linearGradient id="XMLID_82_" gradientUnits="userSpaceOnUse" x1="193.3022" y1="380.7695" x2="207.5314" y2="385.5799" gradientTransform="matrix(0.8681 -0.0283 -0.0284 0.9188 -29.452 -190.5492)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="0.118" style="stop-color:#278CEF"/>
+ <stop offset="0.5169" style="stop-color:#258BEF"/>
+ <stop offset="0.7809" style="stop-color:#1F88EE"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_82_)" d="M172.599,171.361c-5.092,16.149-18.913,24.78-30.853,19.417
+ c-11.879-5.337-17.541-22.584-12.675-38.664c4.899-16.219,18.666-25.226,30.774-19.957
+ C172.016,137.452,177.733,155.072,172.599,171.361z"/>
+
+ <linearGradient id="XMLID_83_" gradientUnits="userSpaceOnUse" x1="196.894" y1="380.4717" x2="208.1796" y2="385.2241" gradientTransform="matrix(0.8632 -0.0296 -0.0296 0.9157 -30.8542 -190.7841)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_83_)" d="M172.563,171.374c-5.059,16.073-18.776,24.624-30.642,19.297
+ c-11.808-5.302-17.524-22.449-12.77-38.494c4.813-16.238,18.531-25.292,30.643-20.019
+ C171.967,137.456,177.684,155.103,172.563,171.374z"/>
+ </g>
+ </g>
+ <g>
+
+ <linearGradient id="bord_x5F_01_1_" gradientUnits="userSpaceOnUse" x1="128.1006" y1="345.5605" x2="167.9155" y2="362.3145" gradientTransform="matrix(1.014 -0.0058 -0.0058 1.0243 3.555 -199.5085)">
+ <stop offset="0" style="stop-color:#F5FFFD"/>
+ <stop offset="0.103" style="stop-color:#EFFCFD"/>
+ <stop offset="0.2416" style="stop-color:#DEF2FB"/>
+ <stop offset="0.4004" style="stop-color:#C2E2F9"/>
+ <stop offset="0.5743" style="stop-color:#9ACCF7"/>
+ <stop offset="0.7604" style="stop-color:#68B0F3"/>
+ <stop offset="0.954" style="stop-color:#2C8FEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path id="bord_x5F_01_2_" display="none" fill="url(#bord_x5F_01_1_)" d="M171.564,170.625
+ c-5.232,16.208-19.158,24.638-30.424,18.449c-10.767-5.915-14.442-22.777-8.834-37.359c5.389-14.025,17.75-21.583,28.169-17.198
+ C171.339,139.092,176.58,155.083,171.564,170.625z"/>
+ <g>
+
+ <linearGradient id="XMLID_1_" gradientUnits="userSpaceOnUse" x1="160.2134" y1="363.3564" x2="170.5038" y2="367.6898" gradientTransform="matrix(0.9353 -0.0269 -0.0269 0.9832 -11.8253 -198.981)">
+ <stop offset="0" style="stop-color:#288DEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_1_)" d="M173.615,170.884c-5.874,18.025-22.195,28.817-35.105,23.022c-12.847-5.768-16.046-25.47-8-42.362
+ c7.285-15.292,20.634-23.82,31.407-19.127C172.733,137.126,179.279,153.621,173.615,170.884z"/>
+
+ <linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="159.6836" y1="363.0547" x2="171.365" y2="368.0372" gradientTransform="matrix(0.9373 -0.0259 -0.0259 0.9833 -12.0883 -199.0828)">
+ <stop offset="0" style="stop-color:#2F91EF"/>
+ <stop offset="0.0169" style="stop-color:#2F91EF"/>
+ <stop offset="0.1966" style="stop-color:#2B8FEF"/>
+ <stop offset="0.6471" style="stop-color:#258BEF"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_2_)" d="M173.565,170.948c-5.882,17.946-22.134,28.634-34.979,22.834
+ c-12.769-5.766-15.983-25.353-8.017-42.167c7.23-15.269,20.574-23.789,31.354-19.099
+ C172.762,137.229,179.247,153.736,173.565,170.948z"/>
+
+ <linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="158.2686" y1="362.709" x2="171.3202" y2="368.3468" gradientTransform="matrix(0.9393 -0.0248 -0.0248 0.9833 -11.5513 -199.1414)">
+ <stop offset="0" style="stop-color:#3694F0"/>
+ <stop offset="0.0169" style="stop-color:#3694F0"/>
+ <stop offset="0.1966" style="stop-color:#3092F0"/>
+ <stop offset="0.5721" style="stop-color:#2A8FEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_3_)" d="M173.516,171.013c-5.892,17.867-22.073,28.451-34.853,22.646
+ c-12.691-5.764-15.919-25.235-8.033-41.973c7.177-15.246,20.515-23.758,31.302-19.071
+ C172.792,137.332,179.214,153.851,173.516,171.013z"/>
+
+ <linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="156.8408" y1="361.5127" x2="171.2442" y2="367.813" gradientTransform="matrix(0.9413 -0.0237 -0.0237 0.9834 -11.0152 -198.4007)">
+ <stop offset="0" style="stop-color:#3D98F0"/>
+ <stop offset="0.0169" style="stop-color:#3D98F0"/>
+ <stop offset="0.1966" style="stop-color:#3595F0"/>
+ <stop offset="0.5225" style="stop-color:#2F92F0"/>
+ <stop offset="0.9596" style="stop-color:#1E88EE"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_4_)" d="M173.466,171.077c-5.901,17.789-22.011,28.268-34.726,22.458
+ c-12.613-5.761-15.856-25.118-8.049-41.777c7.123-15.223,20.455-23.729,31.25-19.043
+ C172.821,137.435,179.182,153.966,173.466,171.077z"/>
+
+ <linearGradient id="XMLID_5_" gradientUnits="userSpaceOnUse" x1="155.4414" y1="361.1729" x2="171.1777" y2="368.1425" gradientTransform="matrix(0.9433 -0.0226 -0.0226 0.9834 -10.4797 -198.4592)">
+ <stop offset="0" style="stop-color:#449CF1"/>
+ <stop offset="0.0169" style="stop-color:#449CF1"/>
+ <stop offset="0.1966" style="stop-color:#3998F1"/>
+ <stop offset="0.4933" style="stop-color:#3394F0"/>
+ <stop offset="0.8911" style="stop-color:#228AEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_5_)" d="M173.417,171.142c-5.911,17.71-21.95,28.084-34.6,22.271c-12.535-5.759-15.793-25-8.065-41.583
+ c7.069-15.201,20.395-23.698,31.197-19.015C172.851,137.538,179.149,154.081,173.417,171.142z"/>
+
+ <linearGradient id="XMLID_6_" gradientUnits="userSpaceOnUse" x1="154.0322" y1="359.9834" x2="171.0822" y2="367.6288" gradientTransform="matrix(0.9453 -0.0215 -0.0215 0.9835 -9.9436 -197.7205)">
+ <stop offset="0" style="stop-color:#4B9FF1"/>
+ <stop offset="0.0169" style="stop-color:#4B9FF1"/>
+ <stop offset="0.1966" style="stop-color:#3E9BF1"/>
+ <stop offset="0.4648" style="stop-color:#3897F0"/>
+ <stop offset="0.8243" style="stop-color:#278DEF"/>
+ <stop offset="1" style="stop-color:#1C87EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_6_)" d="M173.367,171.206c-5.919,17.631-21.888,27.901-34.473,22.083
+ c-12.458-5.757-15.73-24.883-8.082-41.388c7.015-15.178,20.334-23.667,31.144-18.987
+ C172.88,137.641,179.117,154.196,173.367,171.206z"/>
+
+ <linearGradient id="XMLID_7_" gradientUnits="userSpaceOnUse" x1="152.6333" y1="358.7979" x2="170.9788" y2="367.1256" gradientTransform="matrix(0.9473 -0.0204 -0.0204 0.9836 -9.4076 -196.9788)">
+ <stop offset="0" style="stop-color:#52A3F2"/>
+ <stop offset="0.0169" style="stop-color:#52A3F2"/>
+ <stop offset="0.1966" style="stop-color:#439DF2"/>
+ <stop offset="0.4425" style="stop-color:#3D9AF1"/>
+ <stop offset="0.772" style="stop-color:#2C91F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_7_)" d="M173.318,171.271c-5.929,17.552-21.827,27.718-34.346,21.895
+ c-12.38-5.754-15.667-24.765-8.099-41.193c6.961-15.155,20.275-23.636,31.092-18.958
+ C172.909,137.744,179.084,154.312,173.318,171.271z"/>
+
+ <linearGradient id="XMLID_8_" gradientUnits="userSpaceOnUse" x1="152.1626" y1="358.4795" x2="171.7877" y2="367.497" gradientTransform="matrix(0.9492 -0.0193 -0.0193 0.9836 -9.7137 -197.0374)">
+ <stop offset="0" style="stop-color:#59A7F2"/>
+ <stop offset="0.0169" style="stop-color:#59A7F2"/>
+ <stop offset="0.1966" style="stop-color:#48A0F2"/>
+ <stop offset="0.4243" style="stop-color:#429DF1"/>
+ <stop offset="0.7295" style="stop-color:#3193F0"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_8_)" d="M173.268,171.335c-5.938,17.474-21.766,27.535-34.22,21.707
+ c-12.302-5.751-15.604-24.647-8.115-40.998c6.907-15.132,20.215-23.606,31.039-18.931
+ C172.939,137.847,179.052,154.426,173.268,171.335z"/>
+
+ <linearGradient id="XMLID_9_" gradientUnits="userSpaceOnUse" x1="151.6733" y1="358.1885" x2="172.5605" y2="367.9024" gradientTransform="matrix(0.9512 -0.0183 -0.0183 0.9837 -9.9778 -197.1411)">
+ <stop offset="0" style="stop-color:#5FAAF3"/>
+ <stop offset="0.0169" style="stop-color:#5FAAF3"/>
+ <stop offset="0.1966" style="stop-color:#4DA3F3"/>
+ <stop offset="0.4093" style="stop-color:#47A0F2"/>
+ <stop offset="0.695" style="stop-color:#3696F1"/>
+ <stop offset="1" style="stop-color:#1C88EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_9_)" d="M173.219,171.399c-5.947,17.395-21.705,27.352-34.093,21.52
+ c-12.224-5.75-15.541-24.53-8.131-40.804c6.853-15.109,20.155-23.576,30.986-18.903
+ C172.968,137.95,179.02,154.542,173.219,171.399z"/>
+
+ <linearGradient id="XMLID_10_" gradientUnits="userSpaceOnUse" x1="150.3096" y1="357.8555" x2="172.4399" y2="368.2715" gradientTransform="matrix(0.9532 -0.0172 -0.0172 0.9837 -9.4408 -197.1987)">
+ <stop offset="0" style="stop-color:#66AEF3"/>
+ <stop offset="0.0169" style="stop-color:#66AEF3"/>
+ <stop offset="0.1966" style="stop-color:#52A6F3"/>
+ <stop offset="0.3966" style="stop-color:#4CA3F2"/>
+ <stop offset="0.6652" style="stop-color:#3B9AF1"/>
+ <stop offset="0.9717" style="stop-color:#1F8BEE"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_10_)" d="M173.169,171.464c-5.957,17.316-21.643,27.169-33.966,21.332
+ c-12.146-5.747-15.478-24.413-8.148-40.609c6.799-15.086,20.095-23.545,30.934-18.875
+ C172.998,138.053,178.987,154.657,173.169,171.464z"/>
+
+ <linearGradient id="XMLID_11_" gradientUnits="userSpaceOnUse" x1="148.9375" y1="356.6768" x2="172.294" y2="367.8012" gradientTransform="matrix(0.9552 -0.0161 -0.0161 0.9838 -8.9037 -196.458)">
+ <stop offset="0" style="stop-color:#6DB2F4"/>
+ <stop offset="0.0169" style="stop-color:#6DB2F4"/>
+ <stop offset="0.1966" style="stop-color:#57A9F4"/>
+ <stop offset="0.3857" style="stop-color:#51A6F3"/>
+ <stop offset="0.6397" style="stop-color:#409CF2"/>
+ <stop offset="0.9294" style="stop-color:#248DEF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_11_)" d="M173.12,171.528c-5.966,17.237-21.582,26.985-33.84,21.144
+ c-12.068-5.745-15.415-24.295-8.164-40.415c6.745-15.063,20.035-23.514,30.881-18.846
+ C173.027,138.156,178.955,154.771,173.12,171.528z"/>
+
+ <linearGradient id="XMLID_12_" gradientUnits="userSpaceOnUse" x1="147.5771" y1="355.5" x2="172.142" y2="367.3387" gradientTransform="matrix(0.9572 -0.015 -0.015 0.9839 -8.3681 -195.7183)">
+ <stop offset="0" style="stop-color:#74B5F4"/>
+ <stop offset="0.0169" style="stop-color:#74B5F4"/>
+ <stop offset="0.1966" style="stop-color:#5CACF4"/>
+ <stop offset="0.3761" style="stop-color:#56A9F3"/>
+ <stop offset="0.6173" style="stop-color:#459FF2"/>
+ <stop offset="0.8925" style="stop-color:#2990EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_12_)" d="M173.07,171.593c-5.975,17.159-21.52,26.802-33.713,20.956
+ c-11.991-5.743-15.352-24.178-8.181-40.22c6.691-15.041,19.975-23.483,30.829-18.818
+ C173.056,138.259,178.922,154.887,173.07,171.593z"/>
+
+ <linearGradient id="XMLID_13_" gradientUnits="userSpaceOnUse" x1="146.2378" y1="355.1748" x2="171.9944" y2="367.7339" gradientTransform="matrix(0.9592 -0.0139 -0.0139 0.9839 -7.8316 -195.7758)">
+ <stop offset="0" style="stop-color:#7BB9F4"/>
+ <stop offset="0.0169" style="stop-color:#7BB9F4"/>
+ <stop offset="0.1966" style="stop-color:#60AFF4"/>
+ <stop offset="0.3694" style="stop-color:#5AACF3"/>
+ <stop offset="0.6015" style="stop-color:#49A2F2"/>
+ <stop offset="0.8663" style="stop-color:#2D92EF"/>
+ <stop offset="1" style="stop-color:#1C89EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_13_)" d="M173.02,171.657c-5.984,17.08-21.458,26.619-33.587,20.768
+ c-11.913-5.74-15.288-24.06-8.197-40.024c6.637-15.019,19.915-23.453,30.776-18.791
+ C173.086,138.362,178.89,155.001,173.02,171.657z"/>
+
+ <linearGradient id="XMLID_14_" gradientUnits="userSpaceOnUse" x1="144.8911" y1="354.0039" x2="171.8237" y2="367.2899" gradientTransform="matrix(0.9612 -0.0128 -0.0128 0.984 -7.2951 -195.0351)">
+ <stop offset="0" style="stop-color:#82BDF5"/>
+ <stop offset="0.0169" style="stop-color:#82BDF5"/>
+ <stop offset="0.1966" style="stop-color:#65B2F5"/>
+ <stop offset="0.3618" style="stop-color:#5FAFF4"/>
+ <stop offset="0.5837" style="stop-color:#4EA5F3"/>
+ <stop offset="0.8368" style="stop-color:#3296F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_14_)" d="M172.971,171.722c-5.993,17.001-21.397,26.436-33.46,20.581
+ c-11.835-5.738-15.225-23.943-8.213-39.83c6.583-14.996,19.855-23.423,30.724-18.762
+ C173.115,138.465,178.857,155.117,172.971,171.722z"/>
+
+ <linearGradient id="XMLID_15_" gradientUnits="userSpaceOnUse" x1="143.5674" y1="353.6846" x2="171.6586" y2="367.7029" gradientTransform="matrix(0.9632 -0.0117 -0.0117 0.984 -6.7595 -195.0946)">
+ <stop offset="0" style="stop-color:#89C0F5"/>
+ <stop offset="0.0169" style="stop-color:#89C0F5"/>
+ <stop offset="0.1966" style="stop-color:#6AB5F5"/>
+ <stop offset="0.355" style="stop-color:#64B2F4"/>
+ <stop offset="0.5677" style="stop-color:#53A8F3"/>
+ <stop offset="0.8103" style="stop-color:#3799F0"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_15_)" d="M172.921,171.786c-6.002,16.922-21.336,26.253-33.333,20.393
+ c-11.757-5.736-15.162-23.825-8.23-39.635c6.529-14.973,19.795-23.392,30.671-18.734
+ C173.145,138.568,178.825,155.232,172.921,171.786z"/>
+
+ <linearGradient id="XMLID_16_" gradientUnits="userSpaceOnUse" x1="143.1123" y1="353.3994" x2="172.3497" y2="368.1578" gradientTransform="matrix(0.9652 -0.0107 -0.0107 0.9841 -7.0226 -195.1965)">
+ <stop offset="0" style="stop-color:#90C4F6"/>
+ <stop offset="0.0169" style="stop-color:#90C4F6"/>
+ <stop offset="0.1966" style="stop-color:#6FB8F6"/>
+ <stop offset="0.3489" style="stop-color:#69B5F5"/>
+ <stop offset="0.5534" style="stop-color:#58ABF4"/>
+ <stop offset="0.7867" style="stop-color:#3C9CF1"/>
+ <stop offset="1" style="stop-color:#1C8AEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_16_)" d="M172.872,171.851c-6.012,16.844-21.275,26.07-33.208,20.205
+ c-11.679-5.733-15.099-23.708-8.246-39.44c6.475-14.95,19.735-23.361,30.618-18.706
+ C173.174,138.671,178.792,155.347,172.872,171.851z"/>
+
+ <linearGradient id="XMLID_17_" gradientUnits="userSpaceOnUse" x1="142.6772" y1="352.2402" x2="173.0432" y2="367.7437" gradientTransform="matrix(0.9671 -0.0096 -0.0096 0.9842 -7.3292 -194.4557)">
+ <stop offset="0" style="stop-color:#97C8F6"/>
+ <stop offset="0.0169" style="stop-color:#97C8F6"/>
+ <stop offset="0.1966" style="stop-color:#74BAF6"/>
+ <stop offset="0.3433" style="stop-color:#6EB7F5"/>
+ <stop offset="0.5404" style="stop-color:#5DAEF4"/>
+ <stop offset="0.7662" style="stop-color:#419FF1"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_17_)" d="M172.822,171.916c-6.021,16.765-21.213,25.886-33.081,20.017
+ c-11.602-5.731-15.036-23.591-8.263-39.246c6.422-14.927,19.676-23.331,30.566-18.678
+ C173.204,138.775,178.76,155.462,172.822,171.916z"/>
+
+ <linearGradient id="XMLID_18_" gradientUnits="userSpaceOnUse" x1="141.3701" y1="351.9248" x2="172.8483" y2="368.1788" gradientTransform="matrix(0.9691 -0.0085 -0.0085 0.9842 -6.7932 -194.5143)">
+ <stop offset="0" style="stop-color:#9ECCF7"/>
+ <stop offset="0.0169" style="stop-color:#9ECCF7"/>
+ <stop offset="0.1966" style="stop-color:#79BDF7"/>
+ <stop offset="0.3383" style="stop-color:#73BAF6"/>
+ <stop offset="0.5286" style="stop-color:#62B1F5"/>
+ <stop offset="0.7466" style="stop-color:#46A1F2"/>
+ <stop offset="0.9837" style="stop-color:#1F8DEE"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_18_)" d="M172.772,171.98c-6.03,16.686-21.152,25.703-32.955,19.829
+ c-11.524-5.729-14.973-23.473-8.279-39.051c6.368-14.904,19.616-23.3,30.514-18.65
+ C173.233,138.878,178.728,155.577,172.772,171.98z"/>
+
+ <linearGradient id="XMLID_19_" gradientUnits="userSpaceOnUse" x1="140.0654" y1="350.7637" x2="172.6386" y2="367.7731" gradientTransform="matrix(0.9711 -0.0074 -0.0074 0.9843 -6.2571 -193.7746)">
+ <stop offset="0" style="stop-color:#A5CFF7"/>
+ <stop offset="0.0169" style="stop-color:#A5CFF7"/>
+ <stop offset="0.1966" style="stop-color:#7EC0F7"/>
+ <stop offset="0.3337" style="stop-color:#78BDF6"/>
+ <stop offset="0.5178" style="stop-color:#67B3F5"/>
+ <stop offset="0.7287" style="stop-color:#4BA4F2"/>
+ <stop offset="0.958" style="stop-color:#248FEF"/>
+ <stop offset="1" style="stop-color:#1C8BEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_19_)" d="M172.723,172.044c-6.04,16.607-21.09,25.52-32.828,19.641
+ c-11.446-5.726-14.91-23.355-8.296-38.856c6.314-14.881,19.556-23.27,30.461-18.622
+ C173.262,138.981,178.695,155.692,172.723,172.044z"/>
+
+ <linearGradient id="XMLID_20_" gradientUnits="userSpaceOnUse" x1="138.7705" y1="350.4512" x2="172.4257" y2="368.2228" gradientTransform="matrix(0.9731 -0.0063 -0.0063 0.9843 -5.7211 -193.8331)">
+ <stop offset="0" style="stop-color:#ACD3F8"/>
+ <stop offset="0.0169" style="stop-color:#ACD3F8"/>
+ <stop offset="0.1966" style="stop-color:#83C3F8"/>
+ <stop offset="0.3294" style="stop-color:#7DC0F7"/>
+ <stop offset="0.5078" style="stop-color:#6CB7F6"/>
+ <stop offset="0.7122" style="stop-color:#50A8F3"/>
+ <stop offset="0.9344" style="stop-color:#2993EF"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_20_)" d="M172.673,172.109c-6.049,16.528-21.029,25.336-32.701,19.453
+ c-11.369-5.724-14.847-23.238-8.313-38.662c6.26-14.858,19.496-23.239,30.409-18.593
+ C173.292,139.084,178.663,155.807,172.673,172.109z"/>
+
+ <linearGradient id="XMLID_21_" gradientUnits="userSpaceOnUse" x1="137.479" y1="349.2939" x2="172.1988" y2="367.8322" gradientTransform="matrix(0.9751 -0.0052 -0.0052 0.9844 -5.184 -193.0929)">
+ <stop offset="0" style="stop-color:#B3D7F8"/>
+ <stop offset="0.0169" style="stop-color:#B3D7F8"/>
+ <stop offset="0.1966" style="stop-color:#87C6F8"/>
+ <stop offset="0.3262" style="stop-color:#81C3F7"/>
+ <stop offset="0.5004" style="stop-color:#70B9F6"/>
+ <stop offset="0.6998" style="stop-color:#54AAF3"/>
+ <stop offset="0.9166" style="stop-color:#2D95F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_21_)" d="M172.624,172.173c-6.058,16.45-20.968,25.153-32.575,19.265
+ c-11.291-5.722-14.783-23.121-8.329-38.466c6.206-14.836,19.436-23.209,30.356-18.566
+ C173.321,139.187,178.63,155.922,172.624,172.173z"/>
+
+ <linearGradient id="XMLID_22_" gradientUnits="userSpaceOnUse" x1="136.1987" y1="348.1387" x2="171.9682" y2="367.449" gradientTransform="matrix(0.9771 -0.0041 -0.0041 0.9845 -4.648 -192.3512)">
+ <stop offset="0" style="stop-color:#BADAF8"/>
+ <stop offset="0.0169" style="stop-color:#BADAF8"/>
+ <stop offset="0.1966" style="stop-color:#8CC9F8"/>
+ <stop offset="0.3225" style="stop-color:#86C6F7"/>
+ <stop offset="0.4917" style="stop-color:#75BCF6"/>
+ <stop offset="0.6855" style="stop-color:#59ADF3"/>
+ <stop offset="0.896" style="stop-color:#3298F0"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_22_)" d="M172.574,172.238c-6.067,16.371-20.906,24.97-32.448,19.077
+ c-11.213-5.719-14.72-23.003-8.345-38.271c6.152-14.813,19.376-23.178,30.303-18.538
+ C173.351,139.29,178.598,156.037,172.574,172.238z"/>
+
+ <linearGradient id="XMLID_23_" gradientUnits="userSpaceOnUse" x1="135.7803" y1="348.709" x2="172.5899" y2="368.7997" gradientTransform="matrix(0.9791 -0.0031 -0.0031 0.9845 -4.9106 -193.2528)">
+ <stop offset="0" style="stop-color:#C1DEF9"/>
+ <stop offset="0.0169" style="stop-color:#C1DEF9"/>
+ <stop offset="0.1966" style="stop-color:#91CCF9"/>
+ <stop offset="0.3191" style="stop-color:#8BC9F8"/>
+ <stop offset="0.4836" style="stop-color:#7ABFF7"/>
+ <stop offset="0.6721" style="stop-color:#5EB0F4"/>
+ <stop offset="0.877" style="stop-color:#379BF1"/>
+ <stop offset="1" style="stop-color:#1C8CEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_23_)" d="M172.524,172.302c-6.076,16.292-20.845,24.787-32.322,18.89
+ c-11.135-5.717-14.657-22.886-8.361-38.077c6.098-14.791,19.316-23.147,30.25-18.509
+ C173.38,139.393,178.565,156.152,172.524,172.302z"/>
+
+ <linearGradient id="XMLID_24_" gradientUnits="userSpaceOnUse" x1="134.5112" y1="347.5576" x2="172.3416" y2="368.4317" gradientTransform="matrix(0.9811 -0.002 -0.002 0.9846 -4.3745 -192.5131)">
+ <stop offset="0" style="stop-color:#C8E2F9"/>
+ <stop offset="0.0169" style="stop-color:#C8E2F9"/>
+ <stop offset="0.1966" style="stop-color:#96CFF9"/>
+ <stop offset="0.3158" style="stop-color:#90CCF8"/>
+ <stop offset="0.4761" style="stop-color:#7FC2F7"/>
+ <stop offset="0.6597" style="stop-color:#63B3F4"/>
+ <stop offset="0.8591" style="stop-color:#3C9EF1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_24_)" d="M172.475,172.367c-6.085,16.213-20.783,24.604-32.195,18.702
+ c-11.057-5.715-14.594-22.768-8.378-37.882c6.044-14.768,19.256-23.117,30.198-18.481
+ C173.409,139.496,178.533,156.267,172.475,172.367z"/>
+
+ <linearGradient id="XMLID_25_" gradientUnits="userSpaceOnUse" x1="133.2515" y1="347.2549" x2="172.0898" y2="368.9183" gradientTransform="matrix(0.9831 -9.000000e-004 -9.000000e-004 0.9846 -3.8385 -192.5726)">
+ <stop offset="0" style="stop-color:#CEE5FA"/>
+ <stop offset="0.0169" style="stop-color:#CEE5FA"/>
+ <stop offset="0.1966" style="stop-color:#9BD2FA"/>
+ <stop offset="0.3129" style="stop-color:#95CFF9"/>
+ <stop offset="0.4691" style="stop-color:#84C5F8"/>
+ <stop offset="0.6481" style="stop-color:#68B6F5"/>
+ <stop offset="0.8425" style="stop-color:#41A1F1"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_25_)" d="M172.425,172.431c-6.095,16.135-20.722,24.42-32.068,18.514
+ c-10.979-5.713-14.531-22.651-8.395-37.688c5.99-14.745,19.196-23.086,30.146-18.453
+ C173.438,139.599,178.501,156.382,172.425,172.431z"/>
+
+ <linearGradient id="XMLID_26_" gradientUnits="userSpaceOnUse" x1="132.0005" y1="346.1094" x2="171.8303" y2="368.5664" gradientTransform="matrix(0.9851 2.000000e-004 2.000000e-004 0.9847 -3.3019 -191.8309)">
+ <stop offset="0" style="stop-color:#D5E9FA"/>
+ <stop offset="0.0169" style="stop-color:#D5E9FA"/>
+ <stop offset="0.1966" style="stop-color:#A0D5FA"/>
+ <stop offset="0.31" style="stop-color:#9AD2F9"/>
+ <stop offset="0.4625" style="stop-color:#89C8F8"/>
+ <stop offset="0.6372" style="stop-color:#6DB9F5"/>
+ <stop offset="0.8269" style="stop-color:#46A4F2"/>
+ <stop offset="1" style="stop-color:#1C8DEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_26_)" d="M172.375,172.496c-6.104,16.056-20.661,24.237-31.942,18.326
+ c-10.901-5.71-14.467-22.533-8.411-37.493c5.936-14.722,19.136-23.056,30.093-18.425
+ C173.468,139.702,178.468,156.497,172.375,172.496z"/>
+
+ <linearGradient id="XMLID_27_" gradientUnits="userSpaceOnUse" x1="131.6245" y1="344.9619" x2="172.4343" y2="368.2191" gradientTransform="matrix(0.987 0.0013 0.0013 0.9848 -3.6086 -191.0907)">
+ <stop offset="0" style="stop-color:#DCEDFB"/>
+ <stop offset="0.0169" style="stop-color:#DCEDFB"/>
+ <stop offset="0.1966" style="stop-color:#A5D7FB"/>
+ <stop offset="0.3074" style="stop-color:#9FD4FA"/>
+ <stop offset="0.4564" style="stop-color:#8ECBF9"/>
+ <stop offset="0.627" style="stop-color:#72BCF6"/>
+ <stop offset="0.8135" style="stop-color:#4BA7F2"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_27_)" d="M172.326,172.56c-6.113,15.977-20.6,24.054-31.815,18.138
+ c-10.824-5.708-14.405-22.416-8.427-37.298c5.882-14.699,19.077-23.025,30.041-18.397
+ C173.498,139.805,178.436,156.612,172.326,172.56z"/>
+
+ <linearGradient id="XMLID_28_" gradientUnits="userSpaceOnUse" x1="130.3853" y1="344.666" x2="172.161" y2="368.7285" gradientTransform="matrix(0.989 0.0024 0.0024 0.9848 -3.072 -191.1483)">
+ <stop offset="0" style="stop-color:#E3F0FB"/>
+ <stop offset="0.0169" style="stop-color:#E3F0FB"/>
+ <stop offset="0.1966" style="stop-color:#AADAFB"/>
+ <stop offset="0.3049" style="stop-color:#A4D7FA"/>
+ <stop offset="0.4505" style="stop-color:#93CEF9"/>
+ <stop offset="0.6173" style="stop-color:#77BFF6"/>
+ <stop offset="0.7999" style="stop-color:#50AAF3"/>
+ <stop offset="0.9933" style="stop-color:#1E8FEE"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_28_)" d="M172.276,172.625c-6.122,15.898-20.538,23.871-31.688,17.951
+ c-10.746-5.706-14.342-22.298-8.444-37.104c5.828-14.676,19.017-22.995,29.988-18.369
+ C173.527,139.908,178.404,156.728,172.276,172.625z"/>
+
+ <linearGradient id="XMLID_29_" gradientUnits="userSpaceOnUse" x1="129.1538" y1="343.5244" x2="171.8799" y2="368.3965" gradientTransform="matrix(0.991 0.0035 0.0035 0.9849 -2.536 -190.4085)">
+ <stop offset="0" style="stop-color:#EAF4FC"/>
+ <stop offset="0.0169" style="stop-color:#EAF4FC"/>
+ <stop offset="0.1966" style="stop-color:#AEDDFC"/>
+ <stop offset="0.303" style="stop-color:#A8DAFB"/>
+ <stop offset="0.446" style="stop-color:#97D0FA"/>
+ <stop offset="0.6099" style="stop-color:#7BC1F7"/>
+ <stop offset="0.7893" style="stop-color:#54ACF3"/>
+ <stop offset="0.9793" style="stop-color:#2291EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_29_)" d="M172.227,172.689c-6.132,15.82-20.477,23.688-31.563,17.763
+ c-10.668-5.703-14.278-22.181-8.46-36.909c5.774-14.654,18.957-22.964,29.935-18.34
+ C173.556,140.011,178.371,156.842,172.227,172.689z"/>
+
+ <linearGradient id="XMLID_30_" gradientUnits="userSpaceOnUse" x1="128.7627" y1="344.0977" x2="172.4304" y2="369.787" gradientTransform="matrix(0.993 0.0045 0.0045 0.9849 -2.799 -191.3091)">
+ <stop offset="0" style="stop-color:#F1F8FC"/>
+ <stop offset="0.0169" style="stop-color:#F1F8FC"/>
+ <stop offset="0.1966" style="stop-color:#B3E0FC"/>
+ <stop offset="0.3008" style="stop-color:#ADDDFB"/>
+ <stop offset="0.4408" style="stop-color:#9CD3FA"/>
+ <stop offset="0.6013" style="stop-color:#80C4F7"/>
+ <stop offset="0.7769" style="stop-color:#59AFF4"/>
+ <stop offset="0.9628" style="stop-color:#2794EF"/>
+ <stop offset="1" style="stop-color:#1C8EEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_30_)" d="M172.177,172.753c-6.141,15.741-20.415,23.504-31.436,17.575
+ c-10.59-5.701-14.215-22.063-8.477-36.713c5.72-14.631,18.896-22.934,29.882-18.313
+ C173.586,140.114,178.339,156.958,172.177,172.753z"/>
+
+ <linearGradient id="XMLID_31_" gradientUnits="userSpaceOnUse" x1="127.5474" y1="342.9619" x2="172.1376" y2="369.4703" gradientTransform="matrix(0.995 0.0056 0.0056 0.985 -2.2625 -190.5684)">
+ <stop offset="0" style="stop-color:#F8FBFD"/>
+ <stop offset="0.0169" style="stop-color:#F8FBFD"/>
+ <stop offset="0.1966" style="stop-color:#B8E3FD"/>
+ <stop offset="0.2987" style="stop-color:#B2E0FC"/>
+ <stop offset="0.4358" style="stop-color:#A1D7FB"/>
+ <stop offset="0.593" style="stop-color:#85C7F8"/>
+ <stop offset="0.765" style="stop-color:#5EB2F4"/>
+ <stop offset="0.9471" style="stop-color:#2C98F0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_31_)" d="M172.128,172.818c-6.15,15.662-20.354,23.321-31.31,17.387
+ c-10.512-5.699-14.152-21.946-8.493-36.519c5.667-14.608,18.837-22.903,29.83-18.285
+ C173.615,140.217,178.306,157.072,172.128,172.818z"/>
+
+ <linearGradient id="XMLID_32_" gradientUnits="userSpaceOnUse" x1="126.3384" y1="341.8262" x2="171.8396" y2="369.1599" gradientTransform="matrix(0.997 0.0067 0.0067 0.9851 -1.7269 -189.8292)">
+ <stop offset="0.0169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.1966" style="stop-color:#BDE6FD"/>
+ <stop offset="0.2966" style="stop-color:#B7E3FC"/>
+ <stop offset="0.4311" style="stop-color:#A6D9FB"/>
+ <stop offset="0.5851" style="stop-color:#8ACAF8"/>
+ <stop offset="0.7538" style="stop-color:#63B5F5"/>
+ <stop offset="0.9323" style="stop-color:#319AF0"/>
+ <stop offset="1" style="stop-color:#1C8FEE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_32_)" d="M172.078,172.882c-6.159,15.583-20.292,23.138-31.183,17.199
+ c-10.435-5.696-14.089-21.828-8.509-36.324c5.612-14.585,18.777-22.873,29.777-18.256
+ C173.645,140.32,178.274,157.188,172.078,172.882z"/>
+ </g>
+ </g>
+ <g>
+
+ <linearGradient id="XMLID_33_" gradientUnits="userSpaceOnUse" x1="166.0122" y1="393.9854" x2="150.6476" y2="353.6534" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0169" style="stop-color:#FFFFFF"/>
+ <stop offset="0.0405" style="stop-color:#FFF8D8"/>
+ <stop offset="0.0716" style="stop-color:#FFF0AB"/>
+ <stop offset="0.1058" style="stop-color:#FFE982"/>
+ <stop offset="0.1424" style="stop-color:#FFE35F"/>
+ <stop offset="0.182" style="stop-color:#FFDD41"/>
+ <stop offset="0.2257" style="stop-color:#FFD929"/>
+ <stop offset="0.2749" style="stop-color:#FFD617"/>
+ <stop offset="0.3331" style="stop-color:#FFD40A"/>
+ <stop offset="0.4089" style="stop-color:#FFD202"/>
+ <stop offset="0.5674" style="stop-color:#FFD200"/>
+ <stop offset="1" style="stop-color:#FF8B00"/>
+ </linearGradient>
+ <path fill="url(#XMLID_33_)" d="M147.12,187.316c4.339,0.356,8.61-1.264,12.102-3.756c2.569-1.834,4.758-4.103,6.455-6.705
+ c0.011-0.016,0.021-0.03,0.032-0.046c0.334-0.516,0.649-1.044,0.945-1.585c0.004-0.009,0.01-0.019,0.015-0.027
+ c0.595-1.095,1.106-2.24,1.528-3.428c1.909-5.384,2.465-11.116,1.254-16.729c-1.074-4.977-3.683-9.785-7.848-12.825
+ c-1.986-1.449-4.133-2.337-6.601-2.493c-2.777-0.178-5.538,0.517-8.03,1.724c-0.291,0.19-0.582,0.382-0.874,0.591
+ c-9.208,6.582-13.731,17.473-13.522,27.333c0.333,5.743,2.453,11.035,6.424,14.609C141.326,185.83,144.108,187.069,147.12,187.316
+ z"/>
+ <path fill="#1C86EE" d="M153.033,163.481c0.601-3.869-0.521-7.014-2.667-6.856c-2.315,0.169-4.756,4.057-5.247,8.465
+ c-0.463,4.199,1.087,6.847,3.287,6.146C150.457,170.583,152.462,167.19,153.033,163.481z"/>
+ <path fill="#1C86EE" d="M162.81,162.585c-0.231-0.074-0.597-0.121-1.02,0.095c-1.454,0.725-2.667,4.391-2.894,5.121
+ c-0.32,1.026-1.309,4.483-0.474,5.76c0.221,0.333,0.542,0.538,0.911,0.59c0.918,0.125,1.581-0.733,1.999-1.386
+ c0.242-0.379,0.49-0.839,0.735-1.366c0.351-0.752,0.686-1.622,0.961-2.51C163.691,166.778,164.545,163.153,162.81,162.585z"/>
+
+ <linearGradient id="XMLID_34_" gradientUnits="userSpaceOnUse" x1="158.292" y1="338.2295" x2="155.0771" y2="352.0526" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#FFFFFF"/>
+ <stop offset="0.4169" style="stop-color:#FFFFFD"/>
+ <stop offset="0.6466" style="stop-color:#FFFFF5"/>
+ <stop offset="0.8302" style="stop-color:#FFFFE7"/>
+ <stop offset="0.9894" style="stop-color:#FFFFD4"/>
+ <stop offset="1" style="stop-color:#FFFFD2"/>
+ </linearGradient>
+ <path opacity="0.75" fill="url(#XMLID_34_)" enable-background="new " d="M141.197,150.582
+ c-3.564,6.521-3.26,7.717,7.148,8.945c7.671,1.237,11.408,3.664,15.206,5.783c2.495,1.123,4.069,3.789,5.625,1.771
+ c2.162-3.917,1.603-13.092-3.004-19.532C159.075,137.994,146.837,141.746,141.197,150.582z"/>
+
+ <linearGradient id="XMLID_35_" gradientUnits="userSpaceOnUse" x1="175.8477" y1="335.4941" x2="143.9827" y2="383.2913" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0.0056" style="stop-color:#1C86EE"/>
+ <stop offset="0.3764" style="stop-color:#FCFFFC"/>
+ <stop offset="0.437" style="stop-color:#F0F9FB"/>
+ <stop offset="0.5465" style="stop-color:#D0E7F9"/>
+ <stop offset="0.6924" style="stop-color:#9DCCF6"/>
+ <stop offset="0.8669" style="stop-color:#56A6F2"/>
+ <stop offset="1" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_35_)" d="M172.066,151.754c-1.554-5.689-5.05-10.209-9.63-12.295c2.69,1.774,4.897,4.443,6.389,7.706
+ c0.526,1.134,0.968,2.34,1.312,3.602c1.87,6.842,0.871,15.19-2.252,22.244c0.137-0.384,0.267-0.768,0.39-1.158
+ c-0.13,0.322-0.262,0.64-0.4,0.955c0.008-0.019,0.019-0.035,0.027-0.052c-0.986,2.718-2.313,5.294-3.936,7.556
+ c-4.164,5.813-10.433,9.758-16.543,9.778c6.986,0.858,14.452-3.611,19.266-10.485
+ C172.159,171.788,174.464,160.527,172.066,151.754z"/>
+
+ <linearGradient id="XMLID_36_" gradientUnits="userSpaceOnUse" x1="188.5327" y1="333.8271" x2="165.3142" y2="348.4286" gradientTransform="matrix(1 0.0046 -0.0046 1 1.1965 -193.0119)">
+ <stop offset="0" style="stop-color:#CDF0FC"/>
+ <stop offset="0.0783" style="stop-color:#C1E9FB"/>
+ <stop offset="0.2197" style="stop-color:#A1D6F9"/>
+ <stop offset="0.408" style="stop-color:#6EB7F4"/>
+ <stop offset="0.6339" style="stop-color:#278DEF"/>
+ <stop offset="0.6685" style="stop-color:#1C86EE"/>
+ </linearGradient>
+ <path fill="url(#XMLID_36_)" d="M164.347,140.85c-1.252-1.095-2.557-1.923-4.18-2.329c-1.721-0.431-3.5-0.504-5.256-0.272
+ c-2.871,0.381-5.577,1.606-7.965,3.21c2.499-1.215,5.27-1.914,8.056-1.736c2.468,0.156,4.615,1.044,6.601,2.493
+ c4.165,3.041,6.774,7.849,7.848,12.825c1.21,5.612,0.655,11.344-1.254,16.729c-0.421,1.188-0.933,2.333-1.528,3.428
+ c-0.004,0.008-0.01,0.018-0.015,0.027c-0.296,0.541-0.611,1.069-0.945,1.585c-0.011,0.016-0.021,0.03-0.032,0.046
+ c-1.697,2.602-3.886,4.871-6.455,6.705c-3.491,2.493-7.763,4.112-12.102,3.756c-3.012-0.248-5.794-1.487-8.12-3.336
+ c-4.355-3.92-6.509-9.9-6.491-16.282c-0.254,7.874,2.441,15.292,8.147,19.606c2.122,1.605,4.418,2.496,6.768,2.785
+ c3.806-0.012,7.673-1.548,11.056-4.109c4.964-3.635,8.633-9.352,10.469-14.971C172.079,161.433,172.626,148.089,164.347,140.85z"
+ />
+ </g>
+</g>
+</svg>
diff --git a/share/gcstar/logos/splash.png b/share/gcstar/logos/splash.png
new file mode 100644
index 0000000..2707231
--- /dev/null
+++ b/share/gcstar/logos/splash.png
Binary files differ
diff --git a/share/gcstar/overlays/canevas-timbre.png b/share/gcstar/overlays/canevas-timbre.png
new file mode 100644
index 0000000..97ad22a
--- /dev/null
+++ b/share/gcstar/overlays/canevas-timbre.png
Binary files differ
diff --git a/share/gcstar/overlays/cd.png b/share/gcstar/overlays/cd.png
new file mode 100644
index 0000000..c2a2ae2
--- /dev/null
+++ b/share/gcstar/overlays/cd.png
Binary files differ
diff --git a/share/gcstar/overlays/dvd.png b/share/gcstar/overlays/dvd.png
new file mode 100644
index 0000000..7793a62
--- /dev/null
+++ b/share/gcstar/overlays/dvd.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_large.png b/share/gcstar/overlays/favourite_large.png
new file mode 100644
index 0000000..c03cb06
--- /dev/null
+++ b/share/gcstar/overlays/favourite_large.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_med.png b/share/gcstar/overlays/favourite_med.png
new file mode 100644
index 0000000..73260a7
--- /dev/null
+++ b/share/gcstar/overlays/favourite_med.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_small.png b/share/gcstar/overlays/favourite_small.png
new file mode 100644
index 0000000..fdbf576
--- /dev/null
+++ b/share/gcstar/overlays/favourite_small.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_verysmall.png b/share/gcstar/overlays/favourite_verysmall.png
new file mode 100644
index 0000000..5d44db9
--- /dev/null
+++ b/share/gcstar/overlays/favourite_verysmall.png
Binary files differ
diff --git a/share/gcstar/overlays/favourite_xlarge.png b/share/gcstar/overlays/favourite_xlarge.png
new file mode 100644
index 0000000..e5910c1
--- /dev/null
+++ b/share/gcstar/overlays/favourite_xlarge.png
Binary files differ
diff --git a/share/gcstar/overlays/film.png b/share/gcstar/overlays/film.png
new file mode 100644
index 0000000..7b5baae
--- /dev/null
+++ b/share/gcstar/overlays/film.png
Binary files differ
diff --git a/share/gcstar/overlays/flip.png b/share/gcstar/overlays/flip.png
new file mode 100644
index 0000000..e81734c
--- /dev/null
+++ b/share/gcstar/overlays/flip.png
Binary files differ
diff --git a/share/gcstar/overlays/flip2.png b/share/gcstar/overlays/flip2.png
new file mode 100644
index 0000000..7c5678e
--- /dev/null
+++ b/share/gcstar/overlays/flip2.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_large.png b/share/gcstar/overlays/lend_large.png
new file mode 100644
index 0000000..47778ac
--- /dev/null
+++ b/share/gcstar/overlays/lend_large.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_med.png b/share/gcstar/overlays/lend_med.png
new file mode 100644
index 0000000..3a16b33
--- /dev/null
+++ b/share/gcstar/overlays/lend_med.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_small.png b/share/gcstar/overlays/lend_small.png
new file mode 100644
index 0000000..b5465b7
--- /dev/null
+++ b/share/gcstar/overlays/lend_small.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_verysmall.png b/share/gcstar/overlays/lend_verysmall.png
new file mode 100644
index 0000000..5b46e7e
--- /dev/null
+++ b/share/gcstar/overlays/lend_verysmall.png
Binary files differ
diff --git a/share/gcstar/overlays/lend_xlarge.png b/share/gcstar/overlays/lend_xlarge.png
new file mode 100644
index 0000000..0f76325
--- /dev/null
+++ b/share/gcstar/overlays/lend_xlarge.png
Binary files differ
diff --git a/share/gcstar/overlays/minicars.png b/share/gcstar/overlays/minicars.png
new file mode 100644
index 0000000..98cf484
--- /dev/null
+++ b/share/gcstar/overlays/minicars.png
Binary files differ
diff --git a/share/gcstar/overlays/subtle.png b/share/gcstar/overlays/subtle.png
new file mode 100644
index 0000000..3cffa1d
--- /dev/null
+++ b/share/gcstar/overlays/subtle.png
Binary files differ
diff --git a/share/gcstar/panels/Classic b/share/gcstar/panels/Classic
new file mode 100644
index 0000000..8d7e6e7
--- /dev/null
+++ b/share/gcstar/panels/Classic
@@ -0,0 +1,29 @@
+pageBg = "#ffffff"
+
+boxBg = "#e9e9e9"
+boxColor = "#000000"
+boxStyle = "weight='bold'"
+boxJustify = "center"
+
+headerBg = "#ffffff"
+headerColor = "#000000"
+headerStyle = "size='xx-large' weight='bold'"
+headerJustify = "center"
+
+subheaderBg = "#ffffff"
+subheaderColor = "#000000"
+subheaderStyle = "size='x-large' weight='bold'"
+subheaderJustify = "center"
+
+labelBg = "#e9e9e9"
+labelColor = "#000000"
+labelStyle = "weight='bold'"
+
+fieldBg = "#afafaf"
+fieldColor = "#ffffff"
+fieldStyle = ""
+
+expanderBg = "#ffffff"
+expanderColor = "#000000"
+expanderArrow = "#afafaf"
+expanderPrelight = "#e9e9e9"
diff --git a/share/gcstar/panels/Dark b/share/gcstar/panels/Dark
new file mode 100644
index 0000000..1ca4693
--- /dev/null
+++ b/share/gcstar/panels/Dark
@@ -0,0 +1,29 @@
+pageBg = "#000000"
+
+boxBg = "#333333"
+boxColor = "#eeeeee"
+boxStyle = "weight='bold'"
+boxJustify = "center"
+
+headerBg = "#000000"
+headerColor = "#ffffff"
+headerStyle = "size='xx-large' weight='bold'"
+headerJustify = "center"
+
+subheaderBg = "#000000"
+subheaderColor = "#ffffff"
+subheaderStyle = "size='x-large' weight='bold'"
+subheaderJustify = "center"
+
+labelBg = "#333333"
+labelColor = "#eeeeee"
+labelStyle = ""
+
+fieldBg = "#333333"
+fieldColor = "#eeeeee"
+fieldStyle = ""
+
+expanderBg = "#000000"
+expanderColor = "#ffffff"
+expanderArrow = "#ffffff"
+expanderPrelight = "#333333"
diff --git a/share/gcstar/panels/WebSite b/share/gcstar/panels/WebSite
new file mode 100644
index 0000000..8096d23
--- /dev/null
+++ b/share/gcstar/panels/WebSite
@@ -0,0 +1,29 @@
+pageBg = "#ffffff"
+
+boxBg = "#eeeeee"
+boxColor = "#000000"
+boxStyle = "weight='bold'"
+boxJustify = "center"
+
+headerBg = "#ffd700"
+headerColor = "#ffffff"
+headerStyle = "size='xx-large' weight='bold'"
+headerJustify = "left"
+
+subheaderBg = "#ffffff"
+subheaderColor = "#1c86ee"
+subheaderStyle = "size='x-large' weight='bold'"
+subheaderJustify = "center"
+
+labelBg = "#eeeeee"
+labelColor = "#1c86ee"
+labelStyle = "weight='bold'"
+
+fieldBg = "#778899"
+fieldColor = "#ffffff"
+fieldStyle = ""
+
+expanderBg = "#ffffff"
+expanderColor = "#000000"
+expanderArrow = "#1c86ee"
+expanderPrelight = "#eeeeee"
diff --git a/share/gcstar/schemas/gcm.xsd b/share/gcstar/schemas/gcm.xsd
new file mode 100644
index 0000000..4f6d8a7
--- /dev/null
+++ b/share/gcstar/schemas/gcm.xsd
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Document : gcm.xsd
+ Created on : April 26, 2007, 9:32 PM
+ Author : toroman
+ Description:
+ Validates GCM files!
+-->
+
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:complexType name="panelsItem">
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element name="item" type="panelsItem" maxOccurs="unbounded" minOccurs="0" />
+ </xs:sequence>
+
+ <xs:attribute name="type" type="xs:string" use="required"/>
+ <xs:attribute name="style" type="xs:string" />
+ <xs:attribute name="for" type="xs:string"/>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="label" type="xs:string"/>
+ <xs:attribute name="editable" type="xs:string" />
+ <xs:attribute name="title" type="xs:string" />
+ <xs:attribute name="collapsed" type="xs:string" />
+ <xs:attribute name="value" type="xs:string" />
+ <xs:attribute name="values" type="xs:string" />
+ <xs:attribute name="place" type="xs:string" />
+ <xs:attribute name="tip" type="xs:string" />
+ <xs:attribute name="width" type="xs:string" />
+ <xs:attribute name="height">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[1-9]+\d*(em)?" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="row" type="xs:integer"/>
+ <xs:attribute name="col" type="xs:integer"/>
+ <xs:attribute name="rows" type="xs:integer"/>
+ <xs:attribute name="cols" type="xs:integer"/>
+ <xs:attribute name="colspan" type="xs:integer" />
+ <xs:attribute name="expand">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="true" />
+ <xs:enumeration value="false" />
+ <xs:enumeration value="default" />
+ <xs:enumeration value="horizontal" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="header" type="xs:boolean" />
+ <xs:attribute name="nomargin" type="xs:boolean" />
+ <xs:attribute name="flat" type="xs:boolean" />
+
+ <xs:attribute name="align">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="left" />
+ <xs:enumeration value="right" />
+ <xs:enumeration value="top" />
+ <xs:enumeration value="bottom" />
+ <xs:enumeration value="center" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ </xs:complexType>
+
+ <xs:element name="collection">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="lang" type="xs:string" />
+ <xs:element name="options">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="defaults">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="image" type="xs:string" minOccurs="0" />
+ <xs:element name="groupby" type="xs:string" minOccurs="0" />
+ <xs:element name="listImageWidth" type="xs:integer" minOccurs="0" />
+ <xs:element name="listImageHeight" type="xs:integer" minOccurs="0" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="overlay">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="image" type="xs:string" minOccurs="0" />
+ <xs:element name="paddingLeft" type="xs:integer" minOccurs="0" />
+ <xs:element name="paddingRight" type="xs:integer" minOccurs="0" />
+ <xs:element name="paddingTop" type="xs:integer" minOccurs="0" />
+ <xs:element name="paddingBottom" type="xs:integer" minOccurs="0" />
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="fields">
+ <xs:complexType>
+ <xs:all>
+ <xs:element name="id" type="xs:string" />
+ <xs:element name="title" type="xs:string" />
+ <xs:element name="cover" type="xs:string" />
+ <xs:element name="url" type="xs:string" minOccurs="0" />
+ <xs:element name="play" type="xs:string" minOccurs="0" />
+ <xs:element name="search" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="field" type="xs:string" maxOccurs="unbounded" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="results" minOccurs="0">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="field" type="xs:string" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:all>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="values" minOccurs="0" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="value" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="displayed" type="xs:string" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="id" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="groups">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="group" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ <xs:attribute name="id" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="random">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="filter" minOccurs="0">
+ <xs:complexType>
+ <xs:attribute name="value" use="required" type="xs:integer" />
+ <xs:attribute name="numeric" use="required" type="xs:boolean" />
+ <xs:attribute name="field" use="required" type="xs:string" />
+ <xs:attribute name="comparison" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="eq"/>
+ <xs:enumeration value="contain"/>
+ <xs:enumeration value="lt"/>
+ <xs:enumeration value="le"/>
+ <xs:enumeration value="gt"/>
+ <xs:enumeration value="ge"/>
+ <xs:enumeration value="range"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="after" type="xs:integer" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="fields">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="field" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="values" type="xs:string" />
+ <xs:attribute name="value" type="xs:string" use="required"/>
+ <xs:attribute name="type" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="number" />
+ <xs:enumeration value="short text" />
+ <xs:enumeration value="single list" />
+ <xs:enumeration value="long text" />
+ <xs:enumeration value="button" />
+ <xs:enumeration value="yesno" />
+ <xs:enumeration value="date" />
+ <xs:enumeration value="history text" />
+ <xs:enumeration value="double list" />
+ <xs:enumeration value="options" />
+ <xs:enumeration value="file" />
+ <xs:enumeration value="image" />
+ <xs:enumeration value="checked text" />
+ <xs:enumeration value="triple list" />
+ <xs:enumeration value="formatted" />
+ <xs:enumeration value="url" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="separator" type="xs:integer" />
+ <xs:attribute name="notnull" type="xs:boolean" />
+ <xs:attribute name="min" type="xs:integer" />
+ <xs:attribute name="max" type="xs:integer"/>
+ <xs:attribute name="label3" type="xs:string" />
+ <xs:attribute name="label2" type="xs:string" />
+ <xs:attribute name="label1" type="xs:string" />
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ <xs:attribute name="init" type="xs:string" use="required"/>
+ <xs:attribute name="imported" type="xs:boolean" />
+ <xs:attribute name="group" type="xs:string" use="required"/>
+ <xs:attribute name="format" type="xs:string"/>
+ <xs:attribute name="tip" type="xs:string" />
+ <xs:attribute name="step" type="xs:decimal" />
+ <xs:attribute name="history" type="xs:boolean" />
+ <xs:attribute name="default" type="xs:string" />
+ <xs:attribute name="displayed" type="xs:string" />
+ <xs:attribute name="flat" type="xs:boolean" />
+ <xs:attribute name="sorttype">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="number" />
+ <xs:enumeration value="date" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="lending" use="required" type="xs:boolean" />
+ <xs:attribute name="tags" type="xs:boolean" />
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="filters">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="group" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="filter" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:attribute name="values" type="xs:string" />
+ <xs:attribute name="quick" type="xs:boolean" />
+ <xs:attribute name="preprocess" type="xs:string" />
+ <xs:attribute name="numeric" type="xs:boolean" />
+ <xs:attribute name="labelselect" type="xs:string" />
+ <xs:attribute name="labelon" type="xs:string" />
+ <xs:attribute name="labeloff" type="xs:string" />
+ <xs:attribute name="label" type="xs:string" />
+ <xs:attribute name="field" type="xs:string" use="required"/>
+ <xs:attribute name="comparison" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="panels">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="panel" maxOccurs="unbounded">
+ <xs:complexType >
+ <xs:sequence>
+ <xs:element name="item" maxOccurs="unbounded" type="panelsItem" />
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ <xs:attribute name="label" type="xs:string" use="required"/>
+ <xs:attribute name="editable" type="xs:boolean" use="required" />
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:all>
+ <xs:attribute name="name" use="required" type="xs:string" />
+ </xs:complexType>
+ </xs:element>
+</xs:schema>
diff --git a/share/gcstar/style/GCstar/gtkrc b/share/gcstar/style/GCstar/gtkrc
new file mode 100644
index 0000000..b4ef09d
--- /dev/null
+++ b/share/gcstar/style/GCstar/gtkrc
@@ -0,0 +1,277 @@
+# style <name> [= <name>]
+# {
+# <option>
+# }
+#
+# widget <widget_set> style <style_name>
+# widget_class <widget_class_set> style <style_name>
+
+# Here is a list of all the possible states. Note that some do not apply to
+# certain widgets.
+#
+# NORMAL - The normal state of a widget, without the mouse over top of
+# it, and not being pressed, etc.
+#
+# PRELIGHT - When the mouse is over top of the widget, colors defined
+# using this state will be in effect.
+#
+# ACTIVE - When the widget is pressed or clicked it will be active, and
+# the attributes assigned by this tag will be in effect.
+#
+# INSENSITIVE - When a widget is set insensitive, and cannot be
+# activated, it will take these attributes.
+#
+# SELECTED - When an object is selected, it takes these attributes.
+#
+# Given these states, we can set the attributes of the widgets in each of
+# these states using the following directives.
+#
+# fg - Sets the foreground color of a widget.
+# bg - Sets the background color of a widget.
+# bg_pixmap - Sets the background of a widget to a tiled pixmap.
+# font - Sets the font to be used with the given widget.
+#
+
+style "gcStocks"
+{
+ # Redefine used stock items. Each entry contains the stock item
+ # name and the file name (it should be in the same directory as
+ # this file.
+ stock["gtk-dialog-question"] =
+ {
+ {"icons/help/64x64.png", *, *, "gtk-dialog"}
+ }
+ stock["gtk-dialog-info"] =
+ {
+ {"icons/about/64x64.png", *, *, "gtk-dialog"}
+ }
+ stock["gtk-dialog-error"] =
+ {
+ {"icons/error/64x64.png", *, *, "gtk-dialog"}
+ }
+ stock["gtk-about"] =
+ {
+ {"icons/about/16x16.png", *, *, "gtk-menu"},
+ {"icons/about/16x16.png"}
+ }
+ stock["gtk-add"] =
+ {
+ {"icons/add/16x16.png", *, *, "gtk-menu"},
+ {"icons/add/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/add/24x24.png", *, *, "gtk-button"},
+ {"icons/add/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/add/32x32.png"}
+ }
+ stock["gtk-cancel"] =
+ {
+ {"icons/cancel/24x24.png", *, *, "gtk-button"},
+ {"icons/cancel/32x32.png"}
+ }
+ stock["gtk-no"] =
+ {
+ {"icons/cancel/24x24.png", *, *, "gtk-button"},
+ {"icons/cancel/32x32.png"}
+ }
+ stock["gtk-clear"] =
+ {
+ {"icons/clear/24x24.png", *, *, "gtk-button"},
+ {"icons/clear/32x32.png"}
+ }
+ stock["gtk-convert"] =
+ {
+ {"icons/convert/16x16.png", *, *, "gtk-menu"},
+ {"icons/convert/24x24.png", *, *, "gtk-button"},
+ {"icons/convert/32x32.png"}
+ }
+ stock["gtk-delete"] =
+ {
+ {"icons/delete/16x16.png", *, *, "gtk-menu"},
+ {"icons/delete/24x24.png", *, *, "gtk-button"},
+ {"icons/delete/32x32.png"}
+ }
+ stock["gtk-directory"] =
+ {
+ {"icons/directory/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/directory/32x32.png"}
+ }
+ stock["gtk-dnd"] =
+ {
+ {"icons/dnd/16x16.png", *, *, "gtk-menu"}
+ }
+ stock["gtk-execute"] =
+ {
+ {"icons/execute/16x16.png", *, *, "gtk-menu"},
+ {"icons/execute/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/execute/24x24.png", *, *, "gtk-button"},
+ {"icons/execute/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/execute/32x32.png"}
+ }
+ stock["gtk-find"] =
+ {
+ {"icons/find/16x16.png", *, *, "gtk-menu"},
+ {"icons/find/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/find/24x24.png", *, *, "gtk-button"},
+ {"icons/find/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/find/32x32.png"}
+ }
+ stock["gtk-go-back"] =
+ {
+ {"icons/go-back/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-back/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-go-down"] =
+ {
+ {"icons/go-down/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-down/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-go-forward"] =
+ {
+ {"icons/go-forward/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-forward/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-go-up"] =
+ {
+ {"icons/go-up/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-up/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-sort-descending"] =
+ {
+ {"icons/go-down/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-down/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-sort-ascending"] =
+ {
+ {"icons/go-up/16x16.png", *, *, "gtk-menu"},
+ {"icons/go-up/16x16.png", *, *, "gtk-button"}
+ }
+ stock["gtk-help"] =
+ {
+ {"icons/help/16x16.png", *, *, "gtk-menu"}
+ }
+ stock["gtk-home"] =
+ {
+ {"icons/home/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/home/32x32.png"}
+ }
+ stock["gtk-jump-to"] =
+ {
+ {"icons/jump-to/24x24.png", *, *, "gtk-button"},
+ {"icons/jump-to/32x32.png"}
+ }
+ stock["gtk-media-play"] =
+ {
+ {"icons/media-play/16x16.png", *, *, "gtk-menu"},
+ {"icons/media-play/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/media-play/24x24.png", *, *, "gtk-button"},
+ {"icons/media-play/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/media-play/32x32.png"}
+ }
+ stock["gtk-media-next"] =
+ {
+ {"icons/media-next/24x24.png", *, *, "gtk-button"},
+ {"icons/media-next/32x32.png"}
+ }
+ stock["gtk-network"] =
+ {
+ {"icons/network/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/network/32x32.png"}
+ }
+ stock["gtk-new"] =
+ {
+ {"icons/new/16x16.png", *, *, "gtk-menu"},
+ {"icons/new/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/new/24x24.png", *, *, "gtk-button"},
+ {"icons/new/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/new/32x32.png"}
+ }
+ stock["gtk-ok"] =
+ {
+ {"icons/ok/24x24.png", *, *, "gtk-button"},
+ {"icons/ok/32x32.png"}
+ }
+ stock["gtk-yes"] =
+ {
+ {"icons/ok/24x24.png", *, *, "gtk-button"},
+ {"icons/ok/32x32.png"}
+ }
+ stock["gtk-open"] =
+ {
+ {"icons/open/16x16.png", *, *, "gtk-menu"},
+ {"icons/open/24x24.png", *, *, "gtk-button"},
+ {"icons/open/32x32.png"}
+ }
+ stock["gtk-preferences"] =
+ {
+ {"icons/preferences/16x16.png", *, *, "gtk-menu"},
+ {"icons/preferences/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/preferences/24x24.png", *, *, "gtk-button"},
+ {"icons/preferences/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/preferences/32x32.png"}
+ }
+ stock["gtk-properties"] =
+ {
+ {"icons/properties/24x24.png", *, *, "gtk-button"},
+ {"icons/properties/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/properties/32x32.png"}
+ }
+ stock["gtk-quit"] =
+ {
+ {"icons/quit/16x16.png", *, *, "gtk-menu"}
+ }
+ stock["gtk-refresh"] =
+ {
+ {"icons/refresh/16x16.png", *, *, "gtk-menu"},
+ {"icons/refresh/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/refresh/24x24.png", *, *, "gtk-button"},
+ {"icons/refresh/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/refresh/32x32.png"}
+ }
+ stock["gtk-remove"] =
+ {
+ {"icons/remove/24x24.png", *, *, "gtk-button"},
+ {"icons/remove/32x32.png"}
+ }
+ stock["gtk-revert-to-saved"] =
+ {
+ {"icons/revert-to-saved/16x16.png", *, *, "gtk-menu"},
+ {"icons/revert-to-saved/24x24.png", *, *, "gtk-button"},
+ {"icons/revert-to-saved/32x32.png"}
+ }
+ stock["gtk-save"] =
+ {
+ {"icons/save/16x16.png", *, *, "gtk-menu"},
+ {"icons/save/16x16.png", *, *, "gtk-small-toolbar"},
+ {"icons/save/24x24.png", *, *, "gtk-button"},
+ {"icons/save/24x24.png", *, *, "gtk-large-toolbar"},
+ {"icons/save/32x32.png"}
+ }
+ stock["gtk-save-as"] =
+ {
+ {"icons/save-as/16x16.png", *, *, "gtk-menu"},
+ {"icons/save-as/24x24.png", *, *, "gtk-button"},
+ {"icons/save-as/32x32.png"}
+ }
+ stock["gtk-select-color"] =
+ {
+ {"icons/select-color/32x32.png", *, *, "gtk-large-toolbar"},
+ {"icons/select-color/32x32.png"}
+ }
+}
+
+style "gcDefault" = "gcStocks"
+{
+}
+
+style "gcAbout" = "gcDefault"
+{
+ fg[NORMAL] = "#777777"
+ bg[NORMAL] = "#ffffff"
+ bg[PRELIGHT] = "#ffffff"
+ bg[ACTIVE] = "#ffffff"
+ GtkAboutDialog::link-color = "#777777"
+}
+
+# Default rule
+widget "*" style "gcDefault"
+#class "GtkAboutDialog" style : highest "gcAbout"
+#widget "*GtkAboutDialog.GtkVBox.GtkVBox.*" style : highest "gcAbout"
diff --git a/share/gcstar/style/GCstar/icons/about/16x16.png b/share/gcstar/style/GCstar/icons/about/16x16.png
new file mode 100644
index 0000000..59626a8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/about/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/about/64x64.png b/share/gcstar/style/GCstar/icons/about/64x64.png
new file mode 100644
index 0000000..1a94dfc
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/about/64x64.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/add/16x16.png b/share/gcstar/style/GCstar/icons/add/16x16.png
new file mode 100644
index 0000000..ef064df
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/add/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/add/24x24.png b/share/gcstar/style/GCstar/icons/add/24x24.png
new file mode 100644
index 0000000..91f0ee5
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/add/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/add/32x32.png b/share/gcstar/style/GCstar/icons/add/32x32.png
new file mode 100644
index 0000000..d561c5f
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/add/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/cancel/24x24.png b/share/gcstar/style/GCstar/icons/cancel/24x24.png
new file mode 100644
index 0000000..a5495d8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/cancel/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/cancel/32x32.png b/share/gcstar/style/GCstar/icons/cancel/32x32.png
new file mode 100644
index 0000000..21c1a71
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/cancel/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/clear/24x24.png b/share/gcstar/style/GCstar/icons/clear/24x24.png
new file mode 100644
index 0000000..6a0773e
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/clear/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/clear/32x32.png b/share/gcstar/style/GCstar/icons/clear/32x32.png
new file mode 100644
index 0000000..f7aae4e
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/clear/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/convert/16x16.png b/share/gcstar/style/GCstar/icons/convert/16x16.png
new file mode 100644
index 0000000..d67e770
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/convert/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/convert/24x24.png b/share/gcstar/style/GCstar/icons/convert/24x24.png
new file mode 100644
index 0000000..f234980
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/convert/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/convert/32x32.png b/share/gcstar/style/GCstar/icons/convert/32x32.png
new file mode 100644
index 0000000..3e99678
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/convert/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/delete/16x16.png b/share/gcstar/style/GCstar/icons/delete/16x16.png
new file mode 100644
index 0000000..c9bc1f0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/delete/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/delete/24x24.png b/share/gcstar/style/GCstar/icons/delete/24x24.png
new file mode 100644
index 0000000..388b929
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/delete/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/delete/32x32.png b/share/gcstar/style/GCstar/icons/delete/32x32.png
new file mode 100644
index 0000000..fb84487
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/delete/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/directory/32x32.png b/share/gcstar/style/GCstar/icons/directory/32x32.png
new file mode 100644
index 0000000..f8b7432
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/directory/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/dnd/16x16.png b/share/gcstar/style/GCstar/icons/dnd/16x16.png
new file mode 100644
index 0000000..640b95d
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/dnd/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/error/64x64.png b/share/gcstar/style/GCstar/icons/error/64x64.png
new file mode 100644
index 0000000..e79c343
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/error/64x64.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/execute/16x16.png b/share/gcstar/style/GCstar/icons/execute/16x16.png
new file mode 100644
index 0000000..eba2657
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/execute/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/execute/24x24.png b/share/gcstar/style/GCstar/icons/execute/24x24.png
new file mode 100644
index 0000000..c90875b
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/execute/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/execute/32x32.png b/share/gcstar/style/GCstar/icons/execute/32x32.png
new file mode 100644
index 0000000..2fdb1b9
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/execute/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/find/16x16.png b/share/gcstar/style/GCstar/icons/find/16x16.png
new file mode 100644
index 0000000..54732b1
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/find/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/find/24x24.png b/share/gcstar/style/GCstar/icons/find/24x24.png
new file mode 100644
index 0000000..9306f78
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/find/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/find/32x32.png b/share/gcstar/style/GCstar/icons/find/32x32.png
new file mode 100644
index 0000000..8e5f666
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/find/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-back/16x16.png b/share/gcstar/style/GCstar/icons/go-back/16x16.png
new file mode 100644
index 0000000..26106c8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-back/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-back/24x24.png b/share/gcstar/style/GCstar/icons/go-back/24x24.png
new file mode 100644
index 0000000..92aa6b0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-back/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-down/16x16.png b/share/gcstar/style/GCstar/icons/go-down/16x16.png
new file mode 100644
index 0000000..60c5582
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-down/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-down/24x24.png b/share/gcstar/style/GCstar/icons/go-down/24x24.png
new file mode 100644
index 0000000..89c2663
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-down/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-forward/16x16.png b/share/gcstar/style/GCstar/icons/go-forward/16x16.png
new file mode 100644
index 0000000..5c08037
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-forward/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-forward/24x24.png b/share/gcstar/style/GCstar/icons/go-forward/24x24.png
new file mode 100644
index 0000000..3776ede
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-forward/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-up/16x16.png b/share/gcstar/style/GCstar/icons/go-up/16x16.png
new file mode 100644
index 0000000..8fca259
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-up/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/go-up/24x24.png b/share/gcstar/style/GCstar/icons/go-up/24x24.png
new file mode 100644
index 0000000..73d7d83
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/go-up/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/help/16x16.png b/share/gcstar/style/GCstar/icons/help/16x16.png
new file mode 100644
index 0000000..ff8f892
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/help/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/help/32x32.png b/share/gcstar/style/GCstar/icons/help/32x32.png
new file mode 100644
index 0000000..d795114
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/help/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/help/64x64.png b/share/gcstar/style/GCstar/icons/help/64x64.png
new file mode 100644
index 0000000..a6ff6b7
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/help/64x64.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/home/32x32.png b/share/gcstar/style/GCstar/icons/home/32x32.png
new file mode 100644
index 0000000..78e3a79
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/home/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/jump-to/24x24.png b/share/gcstar/style/GCstar/icons/jump-to/24x24.png
new file mode 100644
index 0000000..c8275d0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/jump-to/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/jump-to/32x32.png b/share/gcstar/style/GCstar/icons/jump-to/32x32.png
new file mode 100644
index 0000000..3fb63a3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/jump-to/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-next/24x24.png b/share/gcstar/style/GCstar/icons/media-next/24x24.png
new file mode 100644
index 0000000..6227a36
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-next/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-next/32x32.png b/share/gcstar/style/GCstar/icons/media-next/32x32.png
new file mode 100644
index 0000000..d0c897e
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-next/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-play/16x16.png b/share/gcstar/style/GCstar/icons/media-play/16x16.png
new file mode 100644
index 0000000..4c54071
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-play/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-play/24x24.png b/share/gcstar/style/GCstar/icons/media-play/24x24.png
new file mode 100644
index 0000000..bb39054
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-play/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/media-play/32x32.png b/share/gcstar/style/GCstar/icons/media-play/32x32.png
new file mode 100644
index 0000000..6836de3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/media-play/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/network/32x32.png b/share/gcstar/style/GCstar/icons/network/32x32.png
new file mode 100644
index 0000000..33c3e56
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/network/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/new/16x16.png b/share/gcstar/style/GCstar/icons/new/16x16.png
new file mode 100644
index 0000000..8fe45b5
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/new/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/new/24x24.png b/share/gcstar/style/GCstar/icons/new/24x24.png
new file mode 100644
index 0000000..c4a5ca8
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/new/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/new/32x32.png b/share/gcstar/style/GCstar/icons/new/32x32.png
new file mode 100644
index 0000000..a40f719
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/new/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/ok/24x24.png b/share/gcstar/style/GCstar/icons/ok/24x24.png
new file mode 100644
index 0000000..4d176c0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/ok/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/ok/32x32.png b/share/gcstar/style/GCstar/icons/ok/32x32.png
new file mode 100644
index 0000000..1f02c95
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/ok/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/open/16x16.png b/share/gcstar/style/GCstar/icons/open/16x16.png
new file mode 100644
index 0000000..79c76bc
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/open/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/open/24x24.png b/share/gcstar/style/GCstar/icons/open/24x24.png
new file mode 100644
index 0000000..072c0bb
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/open/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/open/32x32.png b/share/gcstar/style/GCstar/icons/open/32x32.png
new file mode 100644
index 0000000..099243f
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/open/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/preferences/16x16.png b/share/gcstar/style/GCstar/icons/preferences/16x16.png
new file mode 100644
index 0000000..dfbc87d
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/preferences/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/preferences/24x24.png b/share/gcstar/style/GCstar/icons/preferences/24x24.png
new file mode 100644
index 0000000..d611713
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/preferences/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/preferences/32x32.png b/share/gcstar/style/GCstar/icons/preferences/32x32.png
new file mode 100644
index 0000000..679c0e4
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/preferences/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/properties/24x24.png b/share/gcstar/style/GCstar/icons/properties/24x24.png
new file mode 100644
index 0000000..491a188
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/properties/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/properties/32x32.png b/share/gcstar/style/GCstar/icons/properties/32x32.png
new file mode 100644
index 0000000..d4cc186
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/properties/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/quit/16x16.png b/share/gcstar/style/GCstar/icons/quit/16x16.png
new file mode 100644
index 0000000..9eb7ce3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/quit/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/quit/32x32.png b/share/gcstar/style/GCstar/icons/quit/32x32.png
new file mode 100644
index 0000000..609d987
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/quit/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/refresh/16x16.png b/share/gcstar/style/GCstar/icons/refresh/16x16.png
new file mode 100644
index 0000000..4b3a239
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/refresh/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/refresh/24x24.png b/share/gcstar/style/GCstar/icons/refresh/24x24.png
new file mode 100644
index 0000000..6c9268c
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/refresh/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/refresh/32x32.png b/share/gcstar/style/GCstar/icons/refresh/32x32.png
new file mode 100644
index 0000000..852131c
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/refresh/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/remove/24x24.png b/share/gcstar/style/GCstar/icons/remove/24x24.png
new file mode 100644
index 0000000..63adee0
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/remove/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/remove/32x32.png b/share/gcstar/style/GCstar/icons/remove/32x32.png
new file mode 100644
index 0000000..5f746bf
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/remove/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/revert-to-saved/16x16.png b/share/gcstar/style/GCstar/icons/revert-to-saved/16x16.png
new file mode 100644
index 0000000..6798f41
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/revert-to-saved/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/revert-to-saved/24x24.png b/share/gcstar/style/GCstar/icons/revert-to-saved/24x24.png
new file mode 100644
index 0000000..6da156a
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/revert-to-saved/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/revert-to-saved/32x32.png b/share/gcstar/style/GCstar/icons/revert-to-saved/32x32.png
new file mode 100644
index 0000000..9c58749
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/revert-to-saved/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save-as/16x16.png b/share/gcstar/style/GCstar/icons/save-as/16x16.png
new file mode 100644
index 0000000..cfc18fa
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save-as/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save-as/24x24.png b/share/gcstar/style/GCstar/icons/save-as/24x24.png
new file mode 100644
index 0000000..ab7c071
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save-as/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save-as/32x32.png b/share/gcstar/style/GCstar/icons/save-as/32x32.png
new file mode 100644
index 0000000..7d3fc5f
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save-as/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save/16x16.png b/share/gcstar/style/GCstar/icons/save/16x16.png
new file mode 100644
index 0000000..bdafc30
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save/16x16.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save/24x24.png b/share/gcstar/style/GCstar/icons/save/24x24.png
new file mode 100644
index 0000000..e0e9d91
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save/24x24.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/save/32x32.png b/share/gcstar/style/GCstar/icons/save/32x32.png
new file mode 100644
index 0000000..c93c7a3
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/save/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/icons/select-color/32x32.png b/share/gcstar/style/GCstar/icons/select-color/32x32.png
new file mode 100644
index 0000000..b62e5fd
--- /dev/null
+++ b/share/gcstar/style/GCstar/icons/select-color/32x32.png
Binary files differ
diff --git a/share/gcstar/style/GCstar/lend.png b/share/gcstar/style/GCstar/lend.png
new file mode 100644
index 0000000..86ed939
--- /dev/null
+++ b/share/gcstar/style/GCstar/lend.png
Binary files differ
diff --git a/share/gcstar/style/Gtk/gtkrc b/share/gcstar/style/Gtk/gtkrc
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/share/gcstar/style/Gtk/gtkrc
@@ -0,0 +1 @@
+
diff --git a/share/gcstar/style/Gtk/lend.png b/share/gcstar/style/Gtk/lend.png
new file mode 100644
index 0000000..86ed939
--- /dev/null
+++ b/share/gcstar/style/Gtk/lend.png
Binary files differ
diff --git a/share/gcstar/style/kde/active.png b/share/gcstar/style/kde/active.png
new file mode 100644
index 0000000..093464c
--- /dev/null
+++ b/share/gcstar/style/kde/active.png
Binary files differ
diff --git a/share/gcstar/style/kde/active2.png b/share/gcstar/style/kde/active2.png
new file mode 100644
index 0000000..a4f169d
--- /dev/null
+++ b/share/gcstar/style/kde/active2.png
Binary files differ
diff --git a/share/gcstar/style/kde/add.png b/share/gcstar/style/kde/add.png
new file mode 100644
index 0000000..9d9dc76
--- /dev/null
+++ b/share/gcstar/style/kde/add.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowdown.png b/share/gcstar/style/kde/arrowdown.png
new file mode 100644
index 0000000..b32645f
--- /dev/null
+++ b/share/gcstar/style/kde/arrowdown.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowleft.png b/share/gcstar/style/kde/arrowleft.png
new file mode 100644
index 0000000..e259529
--- /dev/null
+++ b/share/gcstar/style/kde/arrowleft.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowright.png b/share/gcstar/style/kde/arrowright.png
new file mode 100644
index 0000000..e1ee5f6
--- /dev/null
+++ b/share/gcstar/style/kde/arrowright.png
Binary files differ
diff --git a/share/gcstar/style/kde/arrowup.png b/share/gcstar/style/kde/arrowup.png
new file mode 100644
index 0000000..28d41da
--- /dev/null
+++ b/share/gcstar/style/kde/arrowup.png
Binary files differ
diff --git a/share/gcstar/style/kde/bghonrizontalscroll.png b/share/gcstar/style/kde/bghonrizontalscroll.png
new file mode 100644
index 0000000..90c18b7
--- /dev/null
+++ b/share/gcstar/style/kde/bghonrizontalscroll.png
Binary files differ
diff --git a/share/gcstar/style/kde/bgverticalscroll.png b/share/gcstar/style/kde/bgverticalscroll.png
new file mode 100644
index 0000000..cb93d6d
--- /dev/null
+++ b/share/gcstar/style/kde/bgverticalscroll.png
Binary files differ
diff --git a/share/gcstar/style/kde/box.png b/share/gcstar/style/kde/box.png
new file mode 100644
index 0000000..ef92f4d
--- /dev/null
+++ b/share/gcstar/style/kde/box.png
Binary files differ
diff --git a/share/gcstar/style/kde/box2.png b/share/gcstar/style/kde/box2.png
new file mode 100644
index 0000000..66b00d1
--- /dev/null
+++ b/share/gcstar/style/kde/box2.png
Binary files differ
diff --git a/share/gcstar/style/kde/box3.png b/share/gcstar/style/kde/box3.png
new file mode 100644
index 0000000..8f16b83
--- /dev/null
+++ b/share/gcstar/style/kde/box3.png
Binary files differ
diff --git a/share/gcstar/style/kde/cancel.png b/share/gcstar/style/kde/cancel.png
new file mode 100644
index 0000000..c6464d9
--- /dev/null
+++ b/share/gcstar/style/kde/cancel.png
Binary files differ
diff --git a/share/gcstar/style/kde/cdrom.png b/share/gcstar/style/kde/cdrom.png
new file mode 100644
index 0000000..fe53dd8
--- /dev/null
+++ b/share/gcstar/style/kde/cdrom.png
Binary files differ
diff --git a/share/gcstar/style/kde/checked.png b/share/gcstar/style/kde/checked.png
new file mode 100644
index 0000000..143a472
--- /dev/null
+++ b/share/gcstar/style/kde/checked.png
Binary files differ
diff --git a/share/gcstar/style/kde/clear.png b/share/gcstar/style/kde/clear.png
new file mode 100644
index 0000000..0d29007
--- /dev/null
+++ b/share/gcstar/style/kde/clear.png
Binary files differ
diff --git a/share/gcstar/style/kde/delete.png b/share/gcstar/style/kde/delete.png
new file mode 100644
index 0000000..1de7a6f
--- /dev/null
+++ b/share/gcstar/style/kde/delete.png
Binary files differ
diff --git a/share/gcstar/style/kde/display.png b/share/gcstar/style/kde/display.png
new file mode 100644
index 0000000..bde85be
--- /dev/null
+++ b/share/gcstar/style/kde/display.png
Binary files differ
diff --git a/share/gcstar/style/kde/exec.png b/share/gcstar/style/kde/exec.png
new file mode 100644
index 0000000..f05e3e4
--- /dev/null
+++ b/share/gcstar/style/kde/exec.png
Binary files differ
diff --git a/share/gcstar/style/kde/export.png b/share/gcstar/style/kde/export.png
new file mode 100644
index 0000000..5dbf6bc
--- /dev/null
+++ b/share/gcstar/style/kde/export.png
Binary files differ
diff --git a/share/gcstar/style/kde/find.png b/share/gcstar/style/kde/find.png
new file mode 100644
index 0000000..b1a6617
--- /dev/null
+++ b/share/gcstar/style/kde/find.png
Binary files differ
diff --git a/share/gcstar/style/kde/gtkrc b/share/gcstar/style/kde/gtkrc
new file mode 100644
index 0000000..61407a9
--- /dev/null
+++ b/share/gcstar/style/kde/gtkrc
@@ -0,0 +1,746 @@
+# style <name> [= <name>]
+# {
+# <option>
+# }
+#
+# widget <widget_set> style <style_name>
+# widget_class <widget_class_set> style <style_name>
+
+# Here is a list of all the possible states. Note that some do not apply to
+# certain widgets.
+#
+# NORMAL - The normal state of a widget, without the mouse over top of
+# it, and not being pressed, etc.
+#
+# PRELIGHT - When the mouse is over top of the widget, colors defined
+# using this state will be in effect.
+#
+# ACTIVE - When the widget is pressed or clicked it will be active, and
+# the attributes assigned by this tag will be in effect.
+#
+# INSENSITIVE - When a widget is set insensitive, and cannot be
+# activated, it will take these attributes.
+#
+# SELECTED - When an object is selected, it takes these attributes.
+#
+# Given these states, we can set the attributes of the widgets in each of
+# these states using the following directives.
+#
+# fg - Sets the foreground color of a widget.
+# fg - Sets the background color of a widget.
+# bg_pixmap - Sets the background of a widget to a tiled pixmap.
+# font - Sets the font to be used with the given widget.
+#
+
+style "gcStocks"
+{
+ # Redefine used stock items. Each entry contains the stock item
+ # name and the file name (it should be in the same directory as
+ # this file.
+ stock["gtk-preferences"] =
+ {
+ {"preferences.png"}
+ }
+ stock["gtk-properties"] =
+ {
+ {"properties.png"}
+ }
+ stock["gtk-find"] =
+ {
+ {"find.png"}
+ }
+ stock["gtk-new"] =
+ {
+ {"new.png"}
+ }
+ stock["gtk-home"] =
+ {
+ {"home.png"}
+ }
+ stock["gtk-save"] =
+ {
+ {"save.png"}
+ }
+ stock["gtk-save-as"] =
+ {
+ {"saveas.png"}
+ }
+ stock["gtk-open"] =
+ {
+ {"open.png"}
+ }
+ stock["gtk-directory"] =
+ {
+ {"paths.png"}
+ }
+ stock["gtk-refresh"] =
+ {
+ {"refresh.png"}
+ }
+ stock["gtk-select-color"] =
+ {
+ {"display.png"}
+ }
+ stock["gtk-execute"] =
+ {
+ {"tonight.png"}
+ }
+ stock["gtk-quit"] =
+ {
+ {"quit.png"}
+ }
+ stock["gtk-help"] =
+ {
+ {"help.png"}
+ }
+ stock["gtk-delete"] =
+ {
+ {"delete.png"}
+ }
+ stock["gtk-ok"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-yes"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-cancel"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-no"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-network"] =
+ {
+ {"internet.png"}
+ }
+ stock["gtk-clear"] =
+ {
+ {"clear.png"}
+ }
+ stock["gtk-convert"] =
+ {
+ {"import.png"}
+ }
+ stock["gtk-paste"] =
+ {
+ {"export.png"}
+ }
+ stock["gtk-cdrom"] =
+ {
+ {"cdrom.png"}
+ }
+ stock["gtk-harddisk"] =
+ {
+ {"harddisk.png"}
+ }
+ stock["gtk-add"] =
+ {
+ {"add.png"}
+ }
+ stock["gtk-remove"] =
+ {
+ {"remove.png"}
+ }
+ stock["gtk-sort-descending"] =
+ {
+ {"sortdown.png"}
+ }
+ stock["gtk-sort-ascending"] =
+ {
+ {"sortup.png"}
+ }
+ stock["gtk-go-up"] =
+ {
+ {"arrowup.png"}
+ }
+ stock["gtk-go-down"] =
+ {
+ {"arrowdown.png"}
+ }
+ stock["gtk-go-back"] =
+ {
+ {"arrowleft.png"}
+ }
+ stock["gtk-go-forward"] =
+ {
+ {"arrowright.png"}
+ }
+ stock["gtk-jump-to"] =
+ {
+ {"sortdown.png"}
+ }
+}
+
+# Default theme that will use as a base for other ones
+style "gcDefault" = "gcStocks"
+{
+ # Menu bar shadows drawn around it
+ GtkMenuBar::shadow_type = GTK_SHADOW_ETCHED_IN
+ # Tool bar shadows drawn around it
+ GtkToolbar::shadow_type = GTK_SHADOW_ETCHED_IN
+ # Frame bar shadows drawn around it
+ GtkFrame::shadow_type = GTK_SHADOW_ETCHED_IN
+ # Notebook shadows drawn around it
+ GtkNotebook::shadow_type = GTK_SHADOW_ETCHED_IN
+ # How toolbar buttons should be displayed
+ GtkToolbar::button_relief = GTK_RELIEF_NONE
+ # Background color for even rows in lists
+ GtkTreeView::even_row_color = "#ffffff"
+ # Background color for odd rows in lists
+ GtkTreeView::odd_row_color = "#f0f0f0"
+ # Sized for the handle used to resize the panel
+ GtkPaned::handle_size = 8
+ xthickness = 2
+ ythickness = 2
+
+ # Define default background colors for all states
+ bg[NORMAL] = "#f0f0f0"
+ bg[PRELIGHT] = "#999999"
+ bg[ACTIVE] = "#999999"
+ bg[INSENSITIVE] = "#f0f0f0"
+ bg[SELECTED] = "#999999"
+
+ # Define default foreground colors for all states
+ fg[NORMAL] = "#000000"
+ fg[PRELIGHT] = "#000000"
+ fg[ACTIVE] = "#000000"
+ fg[INSENSITIVE] = "#ffffff"
+ fg[SELECTED] = "#ffffff"
+
+ # Define default text (in edit boxes) colors for all states
+ text[SELECTED] = "#000000"
+
+ # Define default background (in edit boxes) colors for all states
+ base[NORMAL] = "#ffffff"
+ base[ACTIVE] = "#d3d3d3"
+ base[SELECTED] = "#d3d3d3"
+ base[PRELIGHT] = "#d3d3d3"
+ base[INSENSITIVE] = "#ffffff"
+
+ # This engine is used to replace various widgets with pictures
+ engine "pixmap"
+ {
+ # Will replace all boxes with this picture
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ file = "box.png"
+ border = { 1,1,1,1 }
+ stretch = TRUE
+ }
+ # Will replace all shadows with this picture
+ image
+ {
+ function = SHADOW
+ recolorable = TRUE
+ file = "box.png"
+ border = { 1,1,1,1 }
+ stretch = TRUE
+ }
+
+ # Replaces all the arrows used in widgets with these pictures.
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowup.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = UP
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowdown.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = DOWN
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowleft.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = LEFT
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "arrowright.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = RIGHT
+ }
+
+ }
+
+}
+# Used for menu bar
+style "gcMenubar" = "gcDefault"
+{
+ bg[NORMAL] = "#f0f0f0"
+}
+# Used for tool bar
+style "gcToolbar" = "gcDefault"
+{
+ bg[NORMAL] = "#d7d7ed"
+}
+# Used for tool bar buttons
+style "gcToolbarButton" = "gcDefault"
+{
+ bg[PRELIGHT] = "#d7d7ed"
+ bg[ACTIVE] = "#d3d3d3"
+ bg[NORMAL] = "#d7d7ed"
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "box.png"
+ border = {1, 1, 1, 1}
+ stretch = TRUE
+ }
+ }
+}
+style "gcToolbarToggleButton" = "toolbarButton"
+{
+ bg[PRELIGHT] = "#e7e7ff"
+}
+# Used for all displayed buttons
+style "gcButton" = "gcDefault"
+{
+ fg[ACTIVE] = "#000000"
+
+ # Different pictures for different states
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = NORMAL
+ shadow = OUT
+ file = "box2.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = IN
+ file = "box3.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "box3.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = ACTIVE
+ shadow = IN
+ file = "active.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = SELECTED
+ shadow = IN
+ file = "active.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = INSENSITIVE
+ shadow = OUT
+ file = "active.png"
+ border = {4, 4, 3, 3}
+ stretch = TRUE
+ }
+ }
+}
+style "gcCheckButton" = "gcButton"
+{
+ fg[PRELIGHT] = "#000000"
+ fg[NORMAL] = "#000000"
+ fg[ACTIVE] = "#000000"
+ fg[SELECTED] = "#000000"
+
+ bg[PRELIGHT] = "#d3d3d3"
+
+ # Use defined pictures for check boxes
+ engine "pixmap"
+ {
+ image
+ {
+ function = CHECK
+ recolorable = TRUE
+ shadow = OUT
+ overlay_file = "unchecked.png"
+ overlay_stretch = FALSE
+ }
+ image
+ {
+ function = CHECK
+ recolorable = TRUE
+ shadow = IN
+ overlay_file = "checked.png"
+ overlay_stretch = FALSE
+ }
+ }
+}
+
+# For radio button
+style "gcRadioButton" = "gcButton"
+{
+ fg[PRELIGHT] = "#2e3766"
+ fg[NORMAL] = "#732c7c"
+ fg[ACTIVE] = "#732c7c"
+ fg[SELECTED] = "#732c7c"
+
+ bg[PRELIGHT] = "#cccce5"
+
+ # Use defined pictures for check boxes
+ engine "pixmap"
+ {
+ image
+ {
+ function = OPTION
+ recolorable = TRUE
+ shadow = OUT
+ overlay_file = "radiounchecked.png"
+ overlay_stretch = FALSE
+ }
+ image
+ {
+ function = OPTION
+ recolorable = TRUE
+ shadow = IN
+ overlay_file = "radiochecked.png"
+ overlay_stretch = FALSE
+ }
+ image
+ {
+ function = FLAT_BOX
+ recolorable = TRUE
+ file = "box.png"
+ border = {0,0,0,0}
+ stretch = TRUE
+ }
+ }
+}
+
+style "gcLabel" = "gcDefault"
+{
+ fg[NORMAL] = "#000000"
+ font_name = "Sans Bold"
+}
+# Notebooks are defined with this style
+style "gcTabs" = "gcDefault"
+{
+ bg[NORMAL] = "#f0f0f0"
+ #bg[ACTIVE] = "#f0f0f0"
+ bg[ACTIVE] = "#f0f0f0"
+ fg[ACTIVE] = "#999999"
+
+ engine "pixmap"
+ {
+ # top background tabs
+ image
+ {
+ function = EXTENSION
+ state = ACTIVE
+ gap_side = BOTTOM
+ file = "box2.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ }
+ # top foreground tab
+ image
+ {
+ function = EXTENSION
+ gap_side = BOTTOM
+ file = "box2.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ }
+ # left background tabs
+ image
+ {
+ function = EXTENSION
+ state = ACTIVE
+ gap_side = RIGHT
+ file = "active.png"
+ border = {0,0,0,0}
+ stretch = TRUE
+ }
+ # left foreground tab
+ image
+ {
+ function = EXTENSION
+ gap_side = RIGHT
+ file = "vertical.png"
+ border = {2,2,0,0}
+ stretch = TRUE
+ }
+
+ # tabs on top
+ image
+ {
+ function = BOX_GAP
+ gap_side = TOP
+ file = "tab_corner.png"
+ border = {1,1,1,1}
+ stretch = TRUE
+ }
+ # tabs on left
+ image
+ {
+ function = BOX_GAP
+ gap_side = LEFT
+ file = "tab_corner.png"
+ border = {1,1,1,1}
+ stretch = TRUE
+ }
+ }
+}
+style "gcFrame" = "gcDefault"
+{
+ bg[INSENSITIVE] = "#f3f3f3"
+ bg[NORMAL] = "#999999"
+ bg[ACTIVE] = "#f3f3f3"
+ bg[SELECTED] = "#f3f3f3"
+ bg[PRELIGHT] = "#f3f3f3"
+ # Remove all global theme definition
+ engine ""
+ {
+ }
+}
+# Redefine horizontal scrollbars
+style "gcHscroll" = "gcFrame"
+{
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = NORMAL
+ shadow = OUT
+ file = "horizontal.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "horizontal_hover.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = ACTIVE
+ shadow = IN
+ file = "bghonrizontalscroll.png"
+ border = {4, 4, 4, 4}
+ stretch = TRUE
+ }
+ }
+}
+# Redefine vertical scrollbars
+style "gcVscroll" = "gcFrame"
+{
+ engine "pixmap"
+ {
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = NORMAL
+ shadow = OUT
+ file = "vertical.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = PRELIGHT
+ shadow = OUT
+ file = "vertical_hover.png"
+ border = {2, 2, 2, 2}
+ stretch = TRUE
+ }
+ image
+ {
+ function = BOX
+ recolorable = TRUE
+ state = ACTIVE
+ shadow = IN
+ file = "bgverticalscroll.png"
+ border = {0, 0, 0, 0}
+ stretch = TRUE
+ }
+ }
+}
+# Used for lists
+style "gcTreeView" = "default"
+{
+ text[NORMAL] = "#000000"
+ text[SELECTED] = "#000000"
+ text[ACTIVE] = "#000000"
+ text[INSENSITIVE] = "#000000"
+ text[PRELIGHT] = "#000000"
+ base[NORMAL] = "#ffffff"
+ base[SELECTED] = "#d3d3d3"
+ base[ACTIVE] = "#ffffff"
+ base[INSENSITIVE] = "#ffffff"
+ base[PRELIGHT] = "#ffffff"
+}
+# Used for spin buttons
+style "gcSpin" = "default"
+{
+ engine "pixmap"
+ {
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "spinup.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = UP
+ }
+ image
+ {
+ function = ARROW
+ recolorable = TRUE
+ overlay_file = "spindown.png"
+ overlay_border = { 0, 0, 0, 0 }
+ overlay_stretch = FALSE
+ arrow_direction = DOWN
+ }
+
+ }
+}
+
+
+style "gctooltips" = "default"
+{
+ bg[NORMAL] = "#ffffdc"
+}
+
+
+
+#For sliders
+style "gcSlider" = "default"
+{
+ engine "pixmap" {
+ # TROUGH NORMAL
+ image {
+ function = BOX
+ recolorable = FALSE
+ detail = "trough"
+ file = "box.png"
+ border = {1,1,1,1}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ # SLIDER NORMAL
+ image {
+ function = SLIDER
+ recolorable = FALSE
+ state = NORMAL
+ file = "box2.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ # SLIDER PRELIGHT
+ image {
+ function = SLIDER
+ recolorable = FALSE
+ state = PRELIGHT
+ file = "box3.png"
+ border = {2,2,2,2}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ # SLIDER INSENSITIVE
+ image {
+ function = SLIDER
+ recolorable = FALSE
+ state = INSENSITIVE
+ file = "active.png"
+ border = {0,0,0,0}
+ stretch = TRUE
+ orientation = HORIZONTAL
+ }
+ }
+}
+
+# Associates previously defined styles to widgets
+
+# Default rule
+widget "*" style "gcDefault"
+
+widget "*GCMenubar" style "gcMenubar"
+widget "*GCToolbar" style "gcToolbar"
+widget "*GCToolbar.*GtkButton" style : highest "gcToolbarButton"
+widget "*GCToolbar.*GtkToggleButton" style "gcToolbarToggleButton"
+class "GtkImage" style "gcStocks"
+class "GtkButton" style : highest "gcButton"
+widget "*GtkButton.*" style : highest "gcButton"
+class "*Scale*" style : highest "gcSlider"
+widget "*GCMoviesTextList" style : highest "gcTreeView"
+widget "*GCMoviesDetailsList" style : highest "gcTreeView"
+widget "*GtkTreeView.*GtkButton" style :highest "gcButton"
+class "GtkCheckButton" style : highest "gcCheckButton"
+class "GtkCheckMenuItem" style : highest "gcCheckButton"
+widget "*GtkCheckButton.*" style : highest "gcCheckButton"
+class "GtkRadioButton" style : highest "gcRadioButton"
+class "GtkRadioMenuItem" style : highest "gcRadioButton"
+class "GtkPaned" style "gcFrame"
+class "GtkFrame" style : highest "gcFrame"
+class "GtkNotebook" style : highest "gcTabs"
+widget "*GCInfoTabs.*GtkLabel" style "gcLabel"
+class "GtkHScrollbar" style : highest "gcHscroll"
+class "GtkVScrollbar" style : highest "gcVscroll"
+class "GtkSpinButton" style : highest "gcSpin"
+widget "gtk-tooltips" style "gctooltips" \ No newline at end of file
diff --git a/share/gcstar/style/kde/gtkrcold b/share/gcstar/style/kde/gtkrcold
new file mode 100644
index 0000000..2c50492
--- /dev/null
+++ b/share/gcstar/style/kde/gtkrcold
@@ -0,0 +1,253 @@
+style "gcStocks"
+{
+ # Redefine used stock items. Each entry contains the stock item
+ # name and the file name (it should be in the same directory as
+ # this file.
+ stock["gtk-preferences"] =
+ {
+ {"preferences.png"}
+ }
+ stock["gtk-properties"] =
+ {
+ {"properties.png"}
+ }
+ stock["gtk-find"] =
+ {
+ {"find.png"}
+ }
+ stock["gtk-new"] =
+ {
+ {"new.png"}
+ }
+ stock["gtk-home"] =
+ {
+ {"home.png"}
+ }
+ stock["gtk-save"] =
+ {
+ {"save.png"}
+ }
+ stock["gtk-save-as"] =
+ {
+ {"saveas.png"}
+ }
+ stock["gtk-open"] =
+ {
+ {"open.png"}
+ }
+ stock["gtk-directory"] =
+ {
+ {"paths.png"}
+ }
+ stock["gtk-refresh"] =
+ {
+ {"refresh.png"}
+ }
+ stock["gtk-select-color"] =
+ {
+ {"display.png"}
+ }
+ stock["gtk-execute"] =
+ {
+ {"tonight.png"}
+ }
+ stock["gtk-quit"] =
+ {
+ {"quit.png"}
+ }
+ stock["gtk-help"] =
+ {
+ {"help.png"}
+ }
+ stock["gtk-delete"] =
+ {
+ {"delete.png"}
+ }
+ stock["gtk-ok"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-yes"] =
+ {
+ {"ok.png"}
+ }
+ stock["gtk-cancel"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-no"] =
+ {
+ {"cancel.png"}
+ }
+ stock["gtk-network"] =
+ {
+ {"internet.png"}
+ }
+ stock["gtk-clear"] =
+ {
+ {"clear.png"}
+ }
+ stock["gtk-convert"] =
+ {
+ {"import.png"}
+ }
+ stock["gtk-paste"] =
+ {
+ {"export.png"}
+ }
+ stock["gtk-cdrom"] =
+ {
+ {"cdrom.png"}
+ }
+ stock["gtk-harddisk"] =
+ {
+ {"harddisk.png"}
+ }
+ stock["gtk-add"] =
+ {
+ {"add.png"}
+ }
+ stock["gtk-remove"] =
+ {
+ {"remove.png"}
+ }
+ stock["gtk-sort-descending"] =
+ {
+ {"sortdown.png"}
+ }
+ stock["gtk-sort-ascending"] =
+ {
+ {"sortup.png"}
+ }
+ stock["gtk-go-up"] =
+ {
+ {"arrowup.png"}
+ }
+ stock["gtk-go-down"] =
+ {
+ {"arrowdown.png"}
+ }
+ stock["gtk-go-back"] =
+ {
+ {"arrowleft.png"}
+ }
+ stock["gtk-go-forward"] =
+ {
+ {"arrowright.png"}
+ }
+}
+
+style "galaxy-default"
+{
+ GtkButton::default_border = {1, 2, 1, 2}
+ GtkButton::default_outside_border = {1, 2, 1, 2}
+ GtkWidget::interior_focus = 1
+ GtkButton::default_spacing = 6
+ GtkCheckButton::indicator_size = 15
+ GtkPaned::handle_size = 6
+ GtkRange::trough_border = 0
+ GtkRange::slider_width = 15
+ GtkRange::stepper_size = 15
+ GtkRange::stepper_spacing = 0
+ GtkScrollbar::min_slider_length = 20
+ GtkTreeView::even_row_color = "#FFFFFF"
+ GtkTreeView::odd_row_color = "#EFEFEF"
+
+ fg[NORMAL] = "#000000"
+ fg[ACTIVE] = "#000000"
+ fg[INSENSITIVE] = "#949694"
+ fg[PRELIGHT] = "#000000"
+ fg[SELECTED] = "#FFFFFF"
+
+ bg[ACTIVE] = "#CECECE"
+ bg[NORMAL] = "#E6E7E6"
+ bg[INSENSITIVE] = "#CECECE"
+ bg[PRELIGHT] = "#EFEFEF"
+ bg[SELECTED] = "#21459C"
+
+ base[NORMAL] = "#ffffff"
+ base[ACTIVE] = "#7382BD"
+ base[INSENSITIVE] = "#E6E7E6"
+ base[PRELIGHT] = "#EFEFEF"
+ base[SELECTED] = "#2145AC"
+
+ text[NORMAL] = "#000000"
+ text[ACTIVE] = "#ffffff"
+ text[PRELIGHT] = "#ffffff"
+ text[SELECTED] = "#ffffff"
+ text[INSENSITIVE] = "#949694"
+
+ engine "galaxy"
+ {
+ }
+}
+
+
+style "galaxy-button" = "galaxy-default"
+{
+ xthickness = 4
+ ythickness = 4
+}
+
+style "galaxy-thin" = "galaxy-default"
+{
+ xthickness = 1
+ ythickness = 1
+}
+
+style "galaxy-verythin" = "galaxy-thin"
+{
+ xthickness = 0
+ ythickness = 0
+}
+
+
+style "galaxy-menu" = "galaxy-default"
+{
+ fg[PRELIGHT] = "#ffffff"
+}
+
+style "galaxy-bar" = "galaxy-menu"
+{
+ xthickness = 1
+ ythickness = 1
+}
+
+
+style "galaxy-tasklist" = "galaxy-default"
+{
+ xthickness = 2
+ ythickness = 2
+ GtkWidget::focus-line-width = 0
+ GtkWidget::focus-padding = 0
+}
+
+style "galaxy-comboboxtext" = "galaxy-default"
+{
+ text[PRELIGHT] = "#000000"
+}
+
+style "galaxy-tooltips" = "galaxy-default"
+{
+ bg[NORMAL] = "#ffffdc"
+}
+
+class "GtkWidget" style "galaxy-default"
+class "ECanvas" style "galaxy-thin"
+class "GtkButton" style "galaxy-button"
+widget_class "*Notebook.GtkHBox.GtkButton" style "galaxy-verythin"
+class "EComboButton" style "galaxy-thin"
+widget_class "*GtkComboBox.GtkCellView" style "galaxy-comboboxtext"
+widget_class "*.EShortcutsView.GtkButton" style "galaxy-thin"
+widget_class "*.GtkHTMLEmbedded.*GtkButton" style "galaxy-thin"
+widget_class "*Tree*GtkButton" style "galaxy-verythin"
+widget_class "*List*GtkButton" style "galaxy-verythin"
+widget_class "*EphyBookmarksEditor*GtkButton" style "galaxy-verythin"
+class "GtkProgressBar" style "galaxy-bar"
+widget_class "*MenuItem*" style "galaxy-menu"
+widget_class "*.PanelApplet.*" style "galaxy-tasklist"
+widget "*.tasklist-button" style "galaxy-tasklist"
+class "GtkNotebook" style "galaxy-thin"
+widget "gtk-tooltips" style "galaxy-tooltips"
+widget_class "*GtkPathBar*" style "galaxy-thin"
+class "GtkImage" style "gcStocks"
diff --git a/share/gcstar/style/kde/harddisk.png b/share/gcstar/style/kde/harddisk.png
new file mode 100644
index 0000000..739f4cf
--- /dev/null
+++ b/share/gcstar/style/kde/harddisk.png
Binary files differ
diff --git a/share/gcstar/style/kde/help.png b/share/gcstar/style/kde/help.png
new file mode 100644
index 0000000..93bf094
--- /dev/null
+++ b/share/gcstar/style/kde/help.png
Binary files differ
diff --git a/share/gcstar/style/kde/home.png b/share/gcstar/style/kde/home.png
new file mode 100644
index 0000000..6790272
--- /dev/null
+++ b/share/gcstar/style/kde/home.png
Binary files differ
diff --git a/share/gcstar/style/kde/horizontal.png b/share/gcstar/style/kde/horizontal.png
new file mode 100644
index 0000000..234c021
--- /dev/null
+++ b/share/gcstar/style/kde/horizontal.png
Binary files differ
diff --git a/share/gcstar/style/kde/horizontal_hover.png b/share/gcstar/style/kde/horizontal_hover.png
new file mode 100644
index 0000000..74128d8
--- /dev/null
+++ b/share/gcstar/style/kde/horizontal_hover.png
Binary files differ
diff --git a/share/gcstar/style/kde/import.png b/share/gcstar/style/kde/import.png
new file mode 100644
index 0000000..58378b1
--- /dev/null
+++ b/share/gcstar/style/kde/import.png
Binary files differ
diff --git a/share/gcstar/style/kde/internet.png b/share/gcstar/style/kde/internet.png
new file mode 100644
index 0000000..3f7323c
--- /dev/null
+++ b/share/gcstar/style/kde/internet.png
Binary files differ
diff --git a/share/gcstar/style/kde/khelpcenter.png b/share/gcstar/style/kde/khelpcenter.png
new file mode 100644
index 0000000..24582cf
--- /dev/null
+++ b/share/gcstar/style/kde/khelpcenter.png
Binary files differ
diff --git a/share/gcstar/style/kde/lend.png b/share/gcstar/style/kde/lend.png
new file mode 100644
index 0000000..303d8b3
--- /dev/null
+++ b/share/gcstar/style/kde/lend.png
Binary files differ
diff --git a/share/gcstar/style/kde/new.png b/share/gcstar/style/kde/new.png
new file mode 100644
index 0000000..feba5e4
--- /dev/null
+++ b/share/gcstar/style/kde/new.png
Binary files differ
diff --git a/share/gcstar/style/kde/ok.png b/share/gcstar/style/kde/ok.png
new file mode 100644
index 0000000..230de53
--- /dev/null
+++ b/share/gcstar/style/kde/ok.png
Binary files differ
diff --git a/share/gcstar/style/kde/open.png b/share/gcstar/style/kde/open.png
new file mode 100644
index 0000000..503a004
--- /dev/null
+++ b/share/gcstar/style/kde/open.png
Binary files differ
diff --git a/share/gcstar/style/kde/paths.png b/share/gcstar/style/kde/paths.png
new file mode 100644
index 0000000..67984a2
--- /dev/null
+++ b/share/gcstar/style/kde/paths.png
Binary files differ
diff --git a/share/gcstar/style/kde/preferences.png b/share/gcstar/style/kde/preferences.png
new file mode 100644
index 0000000..4f5e273
--- /dev/null
+++ b/share/gcstar/style/kde/preferences.png
Binary files differ
diff --git a/share/gcstar/style/kde/properties.png b/share/gcstar/style/kde/properties.png
new file mode 100644
index 0000000..02bca4f
--- /dev/null
+++ b/share/gcstar/style/kde/properties.png
Binary files differ
diff --git a/share/gcstar/style/kde/quit.png b/share/gcstar/style/kde/quit.png
new file mode 100644
index 0000000..86d9c47
--- /dev/null
+++ b/share/gcstar/style/kde/quit.png
Binary files differ
diff --git a/share/gcstar/style/kde/radiochecked.png b/share/gcstar/style/kde/radiochecked.png
new file mode 100644
index 0000000..722f88f
--- /dev/null
+++ b/share/gcstar/style/kde/radiochecked.png
Binary files differ
diff --git a/share/gcstar/style/kde/radiounchecked.png b/share/gcstar/style/kde/radiounchecked.png
new file mode 100644
index 0000000..33c732b
--- /dev/null
+++ b/share/gcstar/style/kde/radiounchecked.png
Binary files differ
diff --git a/share/gcstar/style/kde/refresh.png b/share/gcstar/style/kde/refresh.png
new file mode 100644
index 0000000..b987c58
--- /dev/null
+++ b/share/gcstar/style/kde/refresh.png
Binary files differ
diff --git a/share/gcstar/style/kde/remove.png b/share/gcstar/style/kde/remove.png
new file mode 100644
index 0000000..342ac95
--- /dev/null
+++ b/share/gcstar/style/kde/remove.png
Binary files differ
diff --git a/share/gcstar/style/kde/save.png b/share/gcstar/style/kde/save.png
new file mode 100644
index 0000000..dd00abd
--- /dev/null
+++ b/share/gcstar/style/kde/save.png
Binary files differ
diff --git a/share/gcstar/style/kde/saveas.png b/share/gcstar/style/kde/saveas.png
new file mode 100644
index 0000000..61a080e
--- /dev/null
+++ b/share/gcstar/style/kde/saveas.png
Binary files differ
diff --git a/share/gcstar/style/kde/sortdown.png b/share/gcstar/style/kde/sortdown.png
new file mode 100644
index 0000000..cd92e2e
--- /dev/null
+++ b/share/gcstar/style/kde/sortdown.png
Binary files differ
diff --git a/share/gcstar/style/kde/sortup.png b/share/gcstar/style/kde/sortup.png
new file mode 100644
index 0000000..a5b0944
--- /dev/null
+++ b/share/gcstar/style/kde/sortup.png
Binary files differ
diff --git a/share/gcstar/style/kde/spindown.png b/share/gcstar/style/kde/spindown.png
new file mode 100644
index 0000000..44a782f
--- /dev/null
+++ b/share/gcstar/style/kde/spindown.png
Binary files differ
diff --git a/share/gcstar/style/kde/spinup.png b/share/gcstar/style/kde/spinup.png
new file mode 100644
index 0000000..f4cc4c8
--- /dev/null
+++ b/share/gcstar/style/kde/spinup.png
Binary files differ
diff --git a/share/gcstar/style/kde/tab_corner.png b/share/gcstar/style/kde/tab_corner.png
new file mode 100644
index 0000000..d2fb07d
--- /dev/null
+++ b/share/gcstar/style/kde/tab_corner.png
Binary files differ
diff --git a/share/gcstar/style/kde/tonight.png b/share/gcstar/style/kde/tonight.png
new file mode 100644
index 0000000..9ae5c96
--- /dev/null
+++ b/share/gcstar/style/kde/tonight.png
Binary files differ
diff --git a/share/gcstar/style/kde/unchecked.png b/share/gcstar/style/kde/unchecked.png
new file mode 100644
index 0000000..8ea6c45
--- /dev/null
+++ b/share/gcstar/style/kde/unchecked.png
Binary files differ
diff --git a/share/gcstar/style/kde/vertical.png b/share/gcstar/style/kde/vertical.png
new file mode 100644
index 0000000..721e6f9
--- /dev/null
+++ b/share/gcstar/style/kde/vertical.png
Binary files differ
diff --git a/share/gcstar/style/kde/vertical_hover.png b/share/gcstar/style/kde/vertical_hover.png
new file mode 100644
index 0000000..e390e82
--- /dev/null
+++ b/share/gcstar/style/kde/vertical_hover.png
Binary files differ
diff --git a/share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog b/share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog
new file mode 100644
index 0000000..ba5926e
--- /dev/null
+++ b/share/gcstar/xml_models/GCfilms/Ant_Movie_Catalog
@@ -0,0 +1,31 @@
+[HEADER]
+<?xml version="1.0" encoding="UTF-8"?>
+<AntMovieCatalog Format="33" Version="3.4.3 (2004-22-12)" Date="23/03/2005 14:12:54">
+ <Catalog>
+ <Properties/>
+ <Contents>
+[/HEADER]
+[ITEM]
+<Movie
+ Number="${id}"
+ Date="${data}"
+ Rating="${rating}"
+ OriginalTitle="${original}"
+ TranslatedTitle="${title}"
+ Director="${director}"
+ Country="${country}"
+ Category="${type}"
+ Year="${year}"
+ Length="${length}"
+ Actors="${actors}"
+ URL="${url}"
+ Description="${synopsis}"
+ Comments="${comment}"
+ Picture="${image}"
+ Checked="True"/>
+[/ITEM]
+[FOOTER]
+ </Contents>
+ </Catalog>
+</AntMovieCatalog>
+[/FOOTER] \ No newline at end of file
diff --git a/share/gcstar/xml_models/GCfilms/DVDProfiler b/share/gcstar/xml_models/GCfilms/DVDProfiler
new file mode 100644
index 0000000..d00b3cf
--- /dev/null
+++ b/share/gcstar/xml_models/GCfilms/DVDProfiler
@@ -0,0 +1,151 @@
+[HEADER]
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- DVD Profiler Version 2.3.1 Collection Export -->
+<Collection>
+[/HEADER]
+[ITEM]
+<DVD>
+ <ID>${id}</ID>
+ <UPC></UPC>
+ <ProfileTimestamp></ProfileTimestamp>
+ <Title>${title}</Title>
+ <SortTitle>${title}</SortTitle>
+ <Description></Description>
+ <Regions></Regions>
+ <CollectionType></CollectionType>
+ <CollectionNumber></CollectionNumber>
+ <Locks>
+ <Entire>False</Entire>
+ <Covers>False</Covers>
+ <Title>False</Title>
+ <Credits>False</Credits>
+ <DiscInformation>False</DiscInformation>
+ <Overview>False</Overview>
+ <Regions>False</Regions>
+ <AudioSubtitles>False</AudioSubtitles>
+ <Genres>False</Genres>
+ <SRP>False</SRP>
+ <Studios>False</Studios>
+ </Locks>
+ <Rating>U</Rating>
+ <ProductionYear>${year}</ProductionYear>
+ <Released>${date}</Released>
+ <RunningTime>${length}</RunningTime>
+ <CaseType></CaseType>
+ <Genres>
+ [LOOP genre]
+ <Genre>$$</Genre>
+ [/LOOP]
+ </Genres>
+ <Format>
+ <FormatAspectRatio></FormatAspectRatio>
+ <FormatVideoStandard></FormatVideoStandard>
+ <FormatLetterBox></FormatLetterBox>
+ <FormatPanAndScan></FormatPanAndScan>
+ <FormatFullFrame></FormatFullFrame>
+ <Format16X9></Format16X9>
+ <FormatDualSided></FormatDualSided>
+ <FormatDualLayered></FormatDualLayered>
+ <FormatFlipper></FormatFlipper>
+ </Format>
+ <Features>
+ <FeatureSceneAccess>True</FeatureSceneAccess>
+ <FeatureCommentary>True</FeatureCommentary>
+ <FeatureTrailer>False</FeatureTrailer>
+ <FeaturePhotoGallery>False</FeaturePhotoGallery>
+ <FeatureDeletedScenes>False</FeatureDeletedScenes>
+ <FeatureMakingOf>True</FeatureMakingOf>
+ <FeatureProductionNotes>True</FeatureProductionNotes>
+ <FeatureGame>False</FeatureGame>
+ <FeatureDVDROMContent>True</FeatureDVDROMContent>
+ <FeatureMultiAngle>False</FeatureMultiAngle>
+ <FeatureMusicVideos>False</FeatureMusicVideos>
+ <FeatureClosedCaptioned>False</FeatureClosedCaptioned>
+ <FeatureTHXCertified>False</FeatureTHXCertified>
+ </Features>
+ <Studios>
+ <Studio></Studio>
+ </Studios>
+ <Audio>
+ [LOOP audio]
+ <AudioFormat>
+ <AudioLanguage>$$</AudioLanguage>
+ <AudioCompression></AudioCompression>
+ <AudioChannels></AudioChannels>
+ </AudioFormat>
+ [/LOOP]
+ </Audio>
+ <Subtitles>
+ [LOOP subt]
+ <Subtitle>$$</Subtitle>
+ [/LOOP]
+ </Subtitles>
+ <Actors>
+ [LOOP actors]
+ [SPLIT value=$$ sep= ]
+ <Actor>
+ <FirstName>$0</FirstName>
+ <LastName>$1$2</LastName>
+ <Role></Role>
+ </Actor>
+ [/SPLIT]
+ [/LOOP]
+ </Actors>
+ <Credits>
+ <Credit>
+ [SPLIT value=director sep= ]
+ <FirstName>$0</FirstName>
+ <LastName>$1$2</LastName>
+ <CreditType>Direction</CreditType>
+ <CreditSubtype>Director</CreditSubtype>
+ [/SPLIT]
+ </Credit>
+ </Credits>
+ <Review>
+ <ReviewFilm>${rating}</ReviewFilm>
+ <ReviewVideo></ReviewVideo>
+ <ReviewAudio></ReviewAudio>
+ <ReviewExtras></ReviewExtras>
+ </Review>
+ <SRPInfo>
+ <SRP></SRP>
+ <SRPCurrencyID></SRPCurrencyID>
+ <SRPCurrencyName></SRPCurrencyName>
+ </SRPInfo>
+ <PurchaseInfo>
+ <PurchasePriceInfo>
+ <PurchasePriceCurrencyID></PurchasePriceCurrencyID>
+ <PurchasePriceCurrencyName></PurchasePriceCurrencyName>
+ </PurchasePriceInfo>
+ <PurchaseDate></PurchaseDate>
+ </PurchaseInfo>
+ <Events>
+ [LOOP history]
+ <Event>
+ [SPLIT value=$$ sep=:]
+ <User>
+ <FirstName>$0</FirstName>
+ <LastName></LastName>
+ <PhoneNumber></PhoneNumber>
+ <EmailAddress></EmailAddress>
+ </User>
+ <EventType>Borrowing</EventType>
+ <Timestamp>$2</Timestamp>
+ [/SPLIT]
+ </Event>
+ [/LOOP]
+ </Events>
+ <LoanInfo>
+ <LoanedTo>${borrower}</LoanedTo>
+ <LoanedDue>${lendDate}</LoanedDue>
+ </LoanInfo>
+ <Tags>
+ </Tags>
+ <Overview>${synopsis}</Overview>
+ <EasterEggs></EasterEggs>
+ <LastEdited></LastEdited>
+</DVD>
+[/ITEM]
+[FOOTER]
+</Collection>
+[/FOOTER] \ No newline at end of file
diff --git a/share/gcstar/xslt/applyXSLT.pl b/share/gcstar/xslt/applyXSLT.pl
new file mode 100644
index 0000000..28e83d1
--- /dev/null
+++ b/share/gcstar/xslt/applyXSLT.pl
@@ -0,0 +1,13 @@
+#!/usr/bin/perl
+
+use XML::LibXSLT;
+
+my $xslfile = $ARGV[0];
+my $xmlfile = $ARGV[1];
+
+my $xslt = XML::XSLT->new($xslfile, warnings => 1);
+
+$xslt->transform($xmlfile);
+print $xslt->toString;
+
+$xslt->dispose;
diff --git a/share/gcstar/xslt/createGCSValidator.xsl b/share/gcstar/xslt/createGCSValidator.xsl
new file mode 100644
index 0000000..2df922a
--- /dev/null
+++ b/share/gcstar/xslt/createGCSValidator.xsl
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<!--
+ Document : ConvertGCMtoXSD.xsl
+ Created on : April 26, 2007, 9:41 PM
+ Version : The first one ;)
+ Author : toroman
+ Description:
+ Transforms GCM into XSD which can validate GCS files.
+-->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
+
+ <xsl:output method="xml" indent="yes" />
+
+ <xsl:template match="/">
+ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:complexType name="itemType">
+ <xs:sequence>
+ <xsl:apply-templates select="/collection/fields/field" />
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="collection">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="information">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="name" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="item" maxOccurs="unbounded" type="itemType" />
+ </xs:sequence>
+ <xs:attribute name="type" type="xs:string" />
+ <xs:attribute name="items" type="xs:integer" />
+ </xs:complexType>
+ </xs:element>
+ </xs:schema>
+ </xsl:template>
+
+ <xsl:template match="/collection/fields/field">
+ <xsl:choose>
+ <xsl:when test="@type='file'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='number'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:integer" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='options'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:integer" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='age'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:integer" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='short text'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='image'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='long text'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='button'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='yesno'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:boolean" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='date'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[
+ <xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:pattern value="\d\d/\d\d/\d\d\d\d" />
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:element>
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='single list'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[
+ <xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element name="line" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence minOccurs="1" maxOccurs="1">
+ <xs:element name="col" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='double list'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[
+ <xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[">
+ <xs:complexType>
+ <xs:sequence maxOccurs="unbounded">
+ <xs:element name="line" maxOccurs="unbounded">
+ <xs:complexType>
+ <xs:sequence minOccurs="2" maxOccurs="2">
+ <xs:element name="col" type="xs:string" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:when test="@type='history text'">
+ <xsl:text disable-output-escaping="yes"><![CDATA[<xs:element name="]]></xsl:text>
+ <xsl:value-of select="@value" />
+ <xsl:text disable-output-escaping="yes"><![CDATA[" type="xs:string" />
+ ]]></xsl:text>
+ </xsl:when>
+ <xsl:otherwise>
+ <p>
+ <xsl:text>Unknown Type - this should trigger error on XSD validation! </xsl:text>
+ <xsl:value-of select="@type" />
+ </p><![CDATA[
+ ]]>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
diff --git a/templates/GCExportTemplate.pm b/templates/GCExportTemplate.pm
new file mode 100644
index 0000000..d1ca4c4
--- /dev/null
+++ b/templates/GCExportTemplate.pm
@@ -0,0 +1,264 @@
+# Replace Template with your exporter name.
+# The package name must exactly match the file name (.pm)
+package GCExport::GCExportTemplate;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCExport::GCExportBase;
+
+{
+ # Replace Template with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCExport::GCExporterTemplate;
+
+ use base qw(GCExport::GCExportBaseClass);
+
+ # Add your needed use clauses here
+
+ # new
+ # Constructor
+ # Returns reference to current object.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # Do your initialization stuff here
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ # getName
+ # Used to create Export menu.
+ # If you need a string that depends on language, do NOT define
+ # this method and provide a member called Name in languages files
+ # Returns a string containing the name.
+ sub getName
+ {
+ my $self = shift;
+
+ # Should return the exporter name as it will be displayed in Export menu.
+
+ return "Template";
+ }
+
+ # getOptions
+ # Used to create export dialog window.
+ # Returns an array with needed options.
+ sub getOptions
+ {
+ my $self = shift;
+
+ # Should return an array of associative arrays.
+ # Here is an example.
+
+ return [
+ {
+ name => 'withJs',
+ type => 'checkBox',
+ label => 'ExportHTMLWithJS',
+ default => '1'
+ },
+
+ {
+ name => 'title',
+ type => 'shortText',
+ label => 'ExportHTMLTitle',
+ default => 'Movies list'
+ },
+
+ ]
+
+ # For each entry, you have to specify:
+ #
+ # - name: A unique name that will be used to retrieve the option value
+ # - type: One out of checkBox, shortText, longText, number, list, fileSelection, colorSelection
+ # - label: a member of lang files (lib/gcstar/GCLang/*.pm) that will be used to display an informative label
+ # - default: Default value (for the first time exporter is used in a session).
+ #
+ # There are other values that are only valid for some types.
+ #
+ # - min: Minimum value allowed (for number only).
+ # - max: Maximum value (for number only).
+ # - height: Height of the widget displayed in pixels (for longText only).
+ # - valuesList: A comma separated list of values to be used (for list only).
+ # - buttonLabel: Label for a button that will be displayed next to the option
+ # (only for shortText, longText, number, list)
+ # - buttonCallback: Callback to be called when clicking on the button. It will
+ # get button as first parameter while the second one will
+ # a reference to an array containing dialog and option handles.
+ # (only used if buttonLabel is specified).
+
+ # In all processing functions below, values entered by user are accessible through:
+ #
+ # $self->{options}->{name}
+ #
+ # Where name should be replaced with specified name above.
+
+
+ }
+
+ # In there processing functions, you can use options fields specified through getOptions
+ # But there is also some predifined values:
+ #
+ # - $self->{options}->{file} File name used to export data.
+ # - $self->{options}->{collection} File name of the one containing movies list.
+ # - $self->{options}->{collectionDirectory} Directory where movies list file is.
+ # - $self->{options}->{movies} A reference to the array containing the information.
+ # - $self->{options}->{lang} A reference to the hash containing current language translations.
+ # - $self->{options}->{fields} A reference to an array containing fields user choosed
+ # (wantsFieldsSelection must return a true value for this to be used).
+
+ # wantsFieldsSelection
+ # This function lets a plugin decide if it wants the user to specify fields to be used
+ # Returns a true value when fields selection is needed.
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ # needsUTF8
+ # With this method, a plugin may ask the output file to be in UTF-8 mode
+ # Returns a true value when UTF-8 is needed.
+ sub needsUTF8
+ {
+ return 0;
+ }
+
+ # preProcess
+ # Use this function if you need to do special stuff before movies list processing.
+ # Returns nothing
+ sub preProcess
+ {
+ my $self = shift;
+
+ # Your code here
+ }
+
+ # getHeader
+ # Should create the beginning of the exported file.
+ # $number is the total movies number.
+ # Returns a string containing what have to be included on the top of the file.
+ sub getHeader
+ {
+ my ($self, $number) = @_;
+ my $result;
+
+ # Your code here
+ # Append data to $result;
+
+ return $result;
+ }
+
+ # getItem
+ # Called for each movie.
+ # $movie is an associative array containing the movie information. They are:
+ #
+ # - $movie->{title}
+ # - $movie->{date}
+ # - $movie->{year}
+ # - $movie->{time}
+ # - $movie->{director}
+ # - $movie->{country}
+ # - $movie->{age}
+ # - $movie->{type}
+ # - $movie->{image}
+ # - $movie->{original}
+ # - $movie->{actors}
+ # - $movie->{comment}
+ # - $movie->{synopsis}
+ # - $movie->{seen}
+ # - $movie->{number}
+ # - $movie->{rating}
+ # - $movie->{format}
+ # - $movie->{url}
+ # - $movie->{place}
+ # - $movie->{video}
+ # - $movie->{audio}
+ # - $movie->{audioEncoding}
+ # - $movie->{subt}
+ # - $movie->{borrower}
+ # - $movie->{lendDate}
+ # - $movie->{history}
+ #
+ # $number is the movie index
+ # Returns the item string.
+ sub getItem
+ {
+ my ($self, $movie, $number) = @_;
+ my $result;
+
+ # Your code here
+ # Append data to $result;
+
+ return $result;
+ }
+
+ # getFooter
+ # Should create the end of the exported file.
+ # Returns a string containing what have to be included on the end of the file.
+ sub getFooter
+ {
+ my $self = shift;
+ my $result;
+
+ # Your code here
+ # Append data to $result;
+
+ return $result;
+ }
+
+ # postProcess
+ # Called after all processing. Use it if you need to perform extra stuff on the header.
+ # $header is a reference to the header string.
+ # $body is a reference to the content string.
+ sub postProcess
+ {
+ my ($self, $header, $body) = @_;
+
+ # Your code here
+ # As header is a reference, it can be modified on place with $$header
+ # The same for $$body
+ }
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1; \ No newline at end of file
diff --git a/templates/GCImportTemplate.pm b/templates/GCImportTemplate.pm
new file mode 100644
index 0000000..b0e5e76
--- /dev/null
+++ b/templates/GCImportTemplate.pm
@@ -0,0 +1,212 @@
+# Replace Template with your importer name.
+# The package name must exactly match the file name (.pm)
+package GCImport::GCImportTemplate;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+
+use GCImport::GCImportBase;
+
+{
+ # Replace Template with your importer name
+ # It must be the same name as the one used for file and main package name
+ package GCImport::GCImporterTemplate;
+
+ use base qw(GCImport::GCImportBaseClass);
+
+ # Add your needed use clauses here
+
+ # new
+ # Constructor
+ # Returns reference to current object.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # Do your initialization stuff here
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ # wantsFieldsSelection
+ # This function lets a plugin decide if it wants the user to specify fields to be used
+ # Returns a true value when fields selection is needed.
+ sub wantsFieldsSelection
+ {
+ return 0;
+ }
+
+ # wantsFileSelection
+ # Some plugins doens't need a file (they can get their information
+ # from a database as an example. This function specify if a file
+ # is needed or not.
+ # Returns true if a file is needed.
+ sub wantsFileSelection
+ {
+ return 1;
+ }
+
+
+ # getName
+ # Used to create Import menu.
+ # If you need a string that depends on language, do NOT define
+ # this method and provide a member called Name in languages files
+ # Returns a string containing the name.
+ sub getName
+ {
+ my $self = shift;
+
+ # Should return the importer name as it will be displayed in Import menu.
+
+ return "Template";
+ }
+
+ # getFilePatterns
+ # Used to add filters in file selection dialog box.
+ # A *.* filter is always added also.
+ # Returns the file as a list of array references.
+ sub getFilePatterns
+ {
+ return (['Description 1', '*.ext1'], ['Description 2', '*.ext2']);
+ }
+
+ # getOptions
+ # Used to create import dialog window.
+ # Returns an array with needed options.
+ sub getOptions
+ {
+ my $self = shift;
+
+ # Should return an array of associative arrays.
+ # Here is an example.
+
+ return [
+ {
+ name => 'withJs',
+ type => 'checkBox',
+ label => 'ImportHTMLWithJS',
+ default => '1'
+ },
+
+ {
+ name => 'title',
+ type => 'shortText',
+ label => 'ImportHTMLTitle',
+ default => 'Movies list'
+ },
+
+ ]
+
+ # For each entry, you have to specify:
+ #
+ # - name: A unique name that will be used to retrieve the option value
+ # - type: One out of checkBox, shortText, longText, number, list, fileSelection, colorSelection
+ # - label: a member of lang files (lib/gcstar/GCLang/*.pm) that will be used to display an informative label
+ # - default: Default value (for the first time exporter is used in a session).
+ #
+ # There are other values that are only valid for some types.
+ #
+ # - min: Minimum value allowed (for number only).
+ # - max: Maximum value (for number only).
+ # - height: Height of the widget displayed in pixels (for longText only).
+ # - valuesList: A comma separated list of values to be used (for list only).
+
+ # In all processing functions below, values entered by user are accessible through:
+ #
+ # $self->{options}->{name}
+ #
+ # Where name should be replaced with specified name above.
+
+
+ }
+
+ # In there processing functions, you can use options fields specified through getOptions
+ # But there is also some predifined values:
+ #
+ # - $self->{options}->{file} File name used to export data.
+ # - $self->{options}->{movies} A reference to the array containing the information.
+ # - $self->{options}->{lang} A reference to the hash containing current language translations.
+
+ # getMoviesArray
+ # Called to generate the movies array.
+ # Each item of this array have to be an associative array with these fields:
+ #
+ # - $movie->{title}
+ # - $movie->{date}
+ # - $movie->{time}
+ # - $movie->{director}
+ # - $movie->{country}
+ # - $movie->{age}
+ # - $movie->{type}
+ # - $movie->{image}
+ # - $movie->{original}
+ # - $movie->{actors}
+ # - $movie->{comment}
+ # - $movie->{synopsis}
+ # - $movie->{seen}
+ # - $movie->{number}
+ # - $movie->{rating}
+ # - $movie->{format}
+ # - $movie->{url}
+ # - $movie->{place}
+ # - $movie->{video}
+ # - $movie->{audio}
+ # - $movie->{subt}
+ # - $movie->{borrower}
+ # - $movie->{lendDate}
+ # - $movie->{history}
+ #
+ # Returns the movies array.
+ sub getMoviesArray
+ {
+ my ($self, $file) = @_;
+ my @result;
+
+ # Your code here
+ # Add movies to results;
+
+ return \@result;
+ }
+
+
+ # getEndInfo
+ # Used to display some information to user when export is ended.
+ # To localize your message, use $self->{options}->{lang}.
+ # Returns a string that will be displayed in a message box.
+ sub getEndInfo
+ {
+ my $self = shift;
+ my $message;
+
+ # Your code here
+ # Don't do put anything in message if you don't want information to be displayed.
+
+ return $message;
+ }
+}
+
+1; \ No newline at end of file
diff --git a/templates/GCSiteTemplate.pm b/templates/GCSiteTemplate.pm
new file mode 100644
index 0000000..4bc6038
--- /dev/null
+++ b/templates/GCSiteTemplate.pm
@@ -0,0 +1,271 @@
+#
+# More information here: http://wiki.gcstar.org/en/websites_plugins
+#
+# GCcollection should be replaced with the kind of collection your
+# plugin deals with. e.g. GCfilms, GCgames, GCbooks,...
+
+# Replace SiteTemplate with your plugin name.
+# The package name must exactly match the file name (.pm)
+package GCPlugins::GCcollection::GCSiteTemplate;
+
+###################################################
+#
+# Copyright 2005-2007 Tian
+#
+# This file is part of GCstar.
+#
+# GCstar is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# GCstar is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCstar; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+#
+###################################################
+
+use strict;
+use utf8;
+
+use GCPlugins::GCcollection::GCcollectionCommon;
+
+{
+ # Replace SiteTemplate with your exporter name
+ # It must be the same name as the one used for file and main package name
+ package GCPlugins::GCcollection::GCPluginSiteTemplate;
+
+ use base 'GCPlugins::GCcollection::GCcollectionPluginsBase';
+
+ # getSearchUrl
+ # Used to get the URL that to be used to perform searches.
+ # $word is the query
+ # Returns the full URL.
+ sub getSearchUrl
+ {
+ my ($self, $word) = @_;
+ my $url;
+
+ # Your code here
+
+ return $url;
+ }
+
+ # getItemUrl
+ # Used to get the full URL of an item page.
+ # Useful when url on results pages are relative.
+ # $url is the URL as found with a search.
+ # Returns the absolute URL.
+ sub getItemUrl
+ {
+ my ($self, $url) = @_;
+ my $absUrl;
+
+ # Your code here
+
+ return $absUrl;
+ }
+
+ # getCharset
+ # Used to convert charset in web pages.
+ # Returns the charset as specified in pages.
+ sub getCharset
+ {
+ my $self = shift;
+
+ return "ISO-8859-1";
+ }
+
+ # getName
+ # Used to display plugin name in GUI.
+ # Returns the plugin name.
+ sub getName
+ {
+ return "SiteTemplate";
+ }
+
+ # getAuthor
+ # Used to display the plugin author in GUI.
+ # Returns the plugin author name.
+ sub getAuthor
+ {
+ return 'Tian';
+ }
+
+ # getLang
+ # Used to fill in plugin list with user language plugins
+ # Return the language used for this site (2 letters code).
+ sub getLang
+ {
+ return 'EN';
+ }
+ # getExtra
+ # Used if the plugin wants an extra column to be displayed in search results
+ # Return the column title or empty string to hide the column.
+ sub getExtra
+ {
+ return 'Extra';
+ }
+
+ # getNumberPasses
+ # Used to set the number of search "passes" the plugin requires. This defaults to
+ # a single pass, but for some sites 2 or more searches are required. See the GCTvdb
+ # plugin for an example of such a site
+ sub getNumberPasses
+ {
+ return 1;
+ }
+
+ # changeUrl
+ # Can be used to change URL if item URL and the one used to
+ # extract information are different.
+ # Return the modified URL.
+ sub changeUrl
+ {
+ my ($self, $url) = @_;
+
+ return $url;
+ }
+
+ # In processing functions below, self->{parsingList} can be used.
+ # If true, we are processing a search results page
+ # If false, we are processing a item information page.
+
+ # $self->{inside}->{tagname} (with correct value for tagname) can be used to test
+ # if we are in the corresponding tag.
+
+ # You have a counter $self->{itemIdx} that have to be used when processing search results.
+ # It is your responsability to increment it!
+
+ # When processing search results, you have to fill the available fields for results
+ #
+ # $self->{itemsList}[$self->{movieIdx}]->{field_name}
+ #
+ # When processing a movie page, you need to fill the fields (if available)
+ # in $self->{curInfo}.
+ #
+ # $self->{curInfo}->{field_name}
+
+ # start
+ # Called each time a new HTML tag begins.
+ # $tagname is the tag name.
+ # $attr is reference to an associative array of tag attributes.
+ # $attrseq is an array reference containing all the attributes name.
+ # $origtext is the tag text as found in source file
+ # Returns nothing
+ sub start
+ {
+ my ($self, $tagname, $attr, $attrseq, $origtext) = @_;
+ $self->{inside}->{$tagname}++;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ # Your code for processing movie information here
+ }
+ }
+
+ # end
+ # Called each time a HTML tag ends.
+ # $tagname is the tag name.
+ sub end
+ {
+ my ($self, $tagname) = @_;
+ $self->{inside}->{$tagname}--;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ # Your code for processing movie information here
+ }
+ }
+
+ # text
+ # Called each time some plain text (between tags) is processed.
+ # $origtext is the read text.
+ sub text
+ {
+ my ($self, $origtext) = @_;
+
+ if ($self->{parsingList})
+ {
+ # Your code for processing search results here
+ }
+ else
+ {
+ # Your code for processing movie information here
+ }
+ }
+
+ # new
+ # Constructor.
+ # Returns object reference.
+ sub new
+ {
+ my $proto = shift;
+ my $class = ref($proto) || $proto;
+ my $self = $class->SUPER::new();
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ key1 => 1,
+ key2 => 0,
+ };
+
+ # Do your init stuff here
+
+ bless ($self, $class);
+ return $self;
+ }
+
+ # getFields
+ # Called on each pass, by plugins with getNumberPasses > 1
+ # to get the columns return by the plugin during that pass
+ sub getReturnedFields
+ {
+ my $self = shift;
+
+ # This member should be initialized as a reference
+ # to a hash. Each keys is a field that could be
+ # in results with value 1 or 0 if it is returned
+ # or not. For the list of keys, check the model file
+ # (.gcm) and search for tags <field> in
+ # /collection/options/fields/results
+ $self->{hasField} = {
+ key1 => 1,
+ key2 => 0,
+ };
+ }
+
+ # preProcess
+ # Called before each page is processed. You can use it to do some substitutions.
+ # $html is the page content.
+ # Returns modified version of page content.
+ sub preProcess
+ {
+ my ($self, $html) = @_;
+
+ # Your code to modify $html here.
+
+ return $html;
+ }
+
+}
+
+1;